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软件。
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或者清零,从而对元器件进行控制,如控制二极管亮灭、数码管显示、蜂鸣器的鸣响。那么,你会问,我怎么知道哪些端口能控制这些器件呐?答案就是:看硬件原理图!!!!(附件里有完整学习板原理图)
我们可以看到aduC848芯片的各个端口上标有字母,那些字母代表端口的引出部分,有些就是控制器件的电路。通过对原理图芯片的端口以及各个模块的熟悉,我们自然而然就能进行编程控制器件。
下面,就开始谈编程部分~~
同C语言一样,第一句也是先保护库文件:#include<aduc848.h>。大家都会写,那么这句到底有什么作用呢?
我们可以选中这句话,然后单击右键再点击“open the document <aduc848.h>”,然后就会打开一个aduc848.h的文件。里面对端口赋了地址值而且对一些重要端口位赋给了变量。之后我们就可以赋值给这些变量进而赋给端口位,而不需要自己再另外设置变量。
接下来,再谈下一个重要的函数,延时函数,如字面意思,是用来延时的。这个函数是需要我们自己编写的,下面给出例子:
//延时函数 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--); }