关键代码设计说明
公共变量定义及说明
sbit Sel0=P2^0;//
sbit Sel1=P2^1;//
sbit Sel2=P2^2;//位选的三个引脚控制位
uchar show_w1;
uchar show_w2;
uchar show_w3;
uchar show_w4;
uchar show_w5;
uchar show_w6;
uchar show_w7;
uchar show_w8;//show_wi(i=1,2,3,4,……,8)分别是对应左到右的各个数码管上的显示的数字
uchar flag;//分频作用,同时用作位选下标
uchar count;//分频作用的变量
uchar duanxuan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x40,0x00}; //段选,显示0-f
uchar weixuan[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07}; //位选,选择是0-7中的一个数码管 **3.2 Init****():完成初始化配置;**
(1)P0和P2口需要设置成推挽模式输出,以驱动LED数码管正常显示。
P2M1=0x00; P2M0=0xff; P0M1=0x00; P0M0=0xff;
(2)TMOD=0x01; //定时器0采用模式1
(3)打开中断并允许定时器0中断
EA=1;//打开总中断
ET0=1;//允许定时器0中断
TR0=1;//启动定时器0
(4)设置定时器初始值
TH0=(65535-1000)/256; TL0=(65535-1000)%256;
(5)设置位选位flag初始值为0;
(6)为每个数码管要显示的内容赋初值
show_w1=0;
show_w2=1;
show_w3=2;
show_w4=3;
show_w5=4;
show_w6=5;
show_w7=6;
show_w8=7;
void timer0() interrupt 1
当定时器0初始值不断加一最终溢出时激发的处理方法。
(1) 重设TH0、TL0;
(2) flag加一;如果flag等于8,则赋值flag为0
(3) P0要显示的值为0
(4) P2为位选结果,下标为flag。
(5) 如果位选为0,则显示段选下标为show_w1%10对应的数值;如果位选为1,则显示段选下标为show_w2%10对应的数值,以此类推。由于定时时间为1ms用于处理显示内容,而下一个1ms很快就会到,因此,虽然实际上并不是同时选通相应的数码管位,但是由于人眼有时延,因此感觉是同时显示。
void main()
主体功能,主要用于控制数码管循环显示
(1) 调用Init()完成程序初始化;
(2) 单纯一个死循环即可
寄存器知识补充说明
MCS51系列的单片机通常有2个16位可编程定时/计数器,即定时器0和1。MCS52系列还有一个定时/计数器2。可编程的意思是指其功能(如工作模式、定时时间、启动方式等)可由指令来确定和改变。通常都是赋值指令给相关的寄存器。与定时/计数器相关的有两个特殊功能寄存器(模式控制寄存器TMOD和控制寄存器TCON)。且定时器往往在中断中使用,以便当时间到了完成相应处理。MCS51单片机定时/计数器工作原理示意图如图6所示。
MCS51单片机定时/计数器工作原理示意图
每个16位定时/寄存器又分别由两个8位专用寄存器组成。其中TH0、TL0(对应定时器0)、TH1、TL1(对应定时器1),其访问地址依次为8AH-8DH。它们可单独访问,主要用于装载定时或计数的初始值。
定时/计数器0和1要正常工作,需要先设置好8位模式控制寄存器TMOD(89H)和8位控制寄存器TCON(88H)。TMOD主要用于设定定时/计数器的工作模式;TCON主要用于控制定时/计数器的启动/停止,保存T0、T1的溢出和中断标志。当定时器工作在计数方式时,外部事件可通过引脚P34(对应T0)或P35(对应T1)进行输入。本程序使用的是内部计时及相应处理,不是外部事件激活。
定时计数器工作原理:
16位的定时器/计数器实质上就是一个加1计数器。当定时器/计数器为定时工作方式时,计数器的加1信号由振荡器的12分频信号产生;每过一个机器周期,计数器加1,直至计满溢出为止。因此,定时器的定时时间与系统的振荡频率有关。
一个机器周期等于12个振荡周期,所以计数频率fcount=1/12osc。如果晶振为12MHz,则计数周期为:T=1/(12×106)Hz×1/12=1μs。这是最短的计数周期。若要延长定时时间,则需要改变定时器的初值,根据初始值需要选择适当的定时器长度(如8位、13位、16位等)。当定时器/计数器为计数工作方式时,通过引脚T0和T1对外部信号计数,外部脉冲下降沿将触发计数。若一个机器周期采样值为1,下一个机器周期采样值为0,则计数器加1。此后的机器周期S3P1期间,新的计数值装入计数器。所以检测一个由1至0的跳变需要两个机器周期,故外部事件的最高计数频率为振荡频率的1/24。例:如果选用12MHz晶振,则最高计数频率为0.5MHz。虽然对外部输入信号的占空比无特殊要求,但为了确保某给定电平在变化前至少被采样一次,外部计数脉冲的高电平与低电平保持时间均需在一个机器周期以上。
当CPU用软件给定时器设置了某种工作方式之后,定时器就会按设定的工作方式独立运行,不再占用CPU的操作时间,除非定时器计满溢出,才可能中断CPU当前操作。CPU也可以重新设置定时器工作方式,以改变定时器的操作。
在定时器/计数器开始工作之前,CPU必须将一些命令(称为控制字)写入定时/计数器。将工作模式控制字写入模式控制寄存器,工作状态字(或相关位)写入控制寄存器,并给定时/计数器赋初值。
定时器赋初始值计算:
如果需要需要定时为50MS,则计算方式如下:如果晶振是12MHZ,则机器周期为12MHz除以12,就是1MHz,每秒1000000次机器周期,那么50ms就是50000次机器周期。65536-50000=15536(3cb0),TH0=0x3c,TL0=0xb0。1ms就是1000次机器周期。(65536-1000)/256是高位,(65536-1000)%256是低位。
TMOD寄存器的设置依据如图7所示。
TMOD寄存器设置依据
TCON寄存器的设置依据如图8所示。
TCON寄存器设置依据
定时/计数器初始化基本流程如图9所示。
定时/计数器初始化流程
中断工作原理
中断的概念: CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断。MCS51中断信息如表2所示。
MCS51单片机中断信息表
与中断相关的寄存器包括:
① 中断允许控制寄存器IE:
中断允许控制寄存器IE
说明:
在用到中断时,必须要开总中断EA,即EA=1。
EX0(EX1):外部中断允许控制位。EX0=1开外部0号中断,EX0=0关闭外部0号中断。
ET0(ET1):定时中断允许控制位。ET0=1,开内部定时器0号中断;ET0=0关闭定时器中断0号开关。
ES: 串口中断允许控制位。ES=1,开串口中断;ES=0 关闭串口中断。
② 中断优先控制寄存器IP
说明:
l PS:串行口中断优先级控制位。PS=1设定串行口为高优先级中断;PS=0为低优先级中断。
l PT1:T1中断优先级控制位。PT1=1设定定时器T1为高优先级中断;PT1=0为低优先级中断。
l 外部中断1优先级控制位。PX1=1设定定时器外部中断1为高优先级中断;PX1=0为低优先级中断。
l PT0:T0中断优先级控制位。PT0=1设定定时器T0为高优先级中断;PT0=0为低优先级中断。
l PX0:外部中断0优先级控制位。PX0=1设定定时器外部中断0为高优先级中断;PX0=0为低优先级中断。