51单片机入门(1)

         对于单片机初学者而言,从51单片机入手无非是最佳的选择。51单片机是对所有兼容Intel 8031指令系统的单片机的总称。关于51单片机的来历以及作用不作概述,下面就开始本次内容。

       首先,学习单片机要掌握以下知识:

       1)最小系统运行的必要条件:

           a.电源—— 一般采用+5V电压

           b.晶振—— 晶体振荡器,产生振荡频率

           c.复位电路——用来使电路恢复到起始状态的电路设备

        2)对任意I/O口的操作:

            a.输出控制电平的高低

            b.输入检测电平的高低

        3)定时器:一般采用方式2

        4)中断:掌握外部、定时器、串口中断几种常见类型中断

        5)通信:单片机之间、单片机与计算机之间

此外,我们知道51单片机的编程语言有两种,汇编语言与C语言。由于常用C语言,所以下面代码都是用C语言编写。值得说的是,单片机里用的C语言与我们平时学的C语言还是有些差别的。

1、声明

           sfr  特殊功能寄存器声明       例:sfr SCON=0x98;

           sfr16  sfr的16位数据声明

           sbit 特殊功能位声明             例:sbit OV=PSW^2;

2、赋值

     单片机里赋值是针对端口的,但是其中要通过一个变量才能实现 。

    如:     sbit  LED=P0^0;   //P0^0代表P0口的第一位,有8位,0~7

                LED=0;

   要通过创建LED变量,才能间接对PO口的位赋值。当然也可以整体赋值,如下:

                P0=0xfe;   //0x表示十六进制符号,这样相当于对P0口整体进行赋值

再谈下学习单片机所需要的开发板以及软件。一般推荐使用AduC848开发板,至于编程软件就是keil软件。
51单片机入门(1)
 

ADuC848的简要介绍详细情况请参考芯片手册。

1、8051-based core、5V供电电压;

2、可以通过串口在线下载程序和单步、断点、运行到某一行等方式调试程序;

3、16位8通道Σ-ΔADC,片内有1.25V参考电压、buffer和PGA;

4、12位电压输出DAC、Dual 16-BIT Σ-Δ DAC;

5、32kbyte程序存储器、4kbyte用户信息Flash存储器、256RAM+2048XRAM(byte);

6、PLL(12.58 MHz max)(片外只需接32.768kHz晶振);

7、3×16位定时/计数器、看门狗定时器;

8、11中断源(2优先级)、11位堆栈指针;

9、24I/O+8模拟或数字输入;

10、UART、 SPI和I2C、高速115200波特率发生;

11、Power supply monitor、上电复位、Dual 200μA激励电流源。

     至于keil软件的使用,附件中有word文档资料,大家可以下载浏览。

-----------------------------------------------------------------------------------------------------------------------------

     下面我讲下对于开发板与编程软件的结合学习。编程就是针对开发板上的端口位赋值,置1或者清零,从而对元器件进行控制,如控制二极管亮灭、数码管显示、蜂鸣器的鸣响。那么,你会问,我怎么知道哪些端口能控制这些器件呐?答案就是:看硬件原理图!!!!(附件里有完整学习板原理图)


51单片机入门(1)
 

   我们可以看到aduC848芯片的各个端口上标有字母,那些字母代表端口的引出部分,有些就是控制器件的电路。通过对原理图芯片的端口以及各个模块的熟悉,我们自然而然就能进行编程控制器件。

     下面,就开始谈编程部分~~

      同C语言一样,第一句也是先保护库文件:#include<aduc848.h>。大家都会写,那么这句到底有什么作用呢?

     我们可以选中这句话,然后单击右键再点击“open the document <aduc848.h>”,然后就会打开一个aduc848.h的文件。里面对端口赋了地址值而且对一些重要端口位赋给了变量。之后我们就可以赋值给这些变量进而赋给端口位,而不需要自己再另外设置变量。


51单片机入门(1)
    

   

接下来,再谈下一个重要的函数,延时函数,如字面意思,是用来延时的。这个函数是需要我们自己编写的,下面给出例子:

//延时函数
void delay(uint z)
{
	   uint x,y;
	   for(x=z;x>0;x--)
	     for(y=150;y>0;y--);
}

   注意,前面其实有了定义#define uint  unsigned int,故这里用uint代替了数据类型unsigned int。函数里面的数据,我们可以通过设置断点进行测量,最终可以达到延时整值的效果。如 delay(5)就是延时5秒,这里“150”是我自己设的,大家要重新设才能达到上述效果。

下面就是控制二极管其中一位的反复亮灭的代码:

#include<aduc848.h>
 #define uchar unsigned char
 #define uint unsigned int
  sbit Led=P0^0;		  //设置变量,控制二极管灯的亮灭
  void delay(uint z);
  
void main()
{
	while(1)
	{
		delay(10);
		Led=0;	     //二极管灯亮
	    delay(10);
		Led=1;		 //二极管灯灭
	}
}

	//延时函数
void delay(uint z)
{
	   uint x,y;
	   for(x=z;x>0;x--)
	     for(y=150;y>0;y--);
}