在做单片机的操控程序开发中,有一些程序段是很通用的、能够移植的。操控蜂鸣器蜂鸣时刻所使用的延时程序,在流水灯或数码管的中也能够使用;中止体系程序,也很常用。咱们就称这些程序段叫功能模块。关于编程人员,模块的概念应该是很清楚的,把可移植的程序块拟定成模块,今后就能够直接使用,既省时刻也省精力。下面便是一些常见的规范模块可直接使用。
1.1 简略延时子程序
在做单片机操控时,常常要遇到到延时的问题。比方要让蜂鸣器响1s,然后停1s,然后再响1s,重复下去。这个比如,要求延时的时刻现已很准确了(1s),一般情况下,假如要求延时的时刻不需求很准确,那么能够写一个简略的延时程序,然后经过调试,最终到达延时的意图。
这种办法合适大约的延时,能够经过while或for循环完结。为便利后续研讨,我用for循环办法。
程序能够这样写:
#include
#define uint unsigned int
#define uchar unsigned char //宏界说
void delay()//延时函数
{
uint x,y;
for(x=100;x>0;x–)
for(y=5000;y>0;y–);
}
void main()
{
delay();
}
经过调试循环次数x,y值,改动延时刻,最终到达满意的数值中止。
1.2带参数的延时子程序
#define uint unsigned int
#define uchar unsigned char
void delay(uint z)//延时函数
{
uint x,y;
for(x=100;x>0;x–)
for(y=z;y>0;y–);
}
void main()
{
delay(k)//k为常数
}
在主函数main中调整常数k,方可到达延时意图。
1.3中止程序
中止:CPU在处理某一事情A时,产生了另一事情B恳求CPU敏捷去处理(中止产生);CPU暂时中止当时的作业,转去处理事情B(中止呼应和中止服务);待CPU将事情B处理完毕后,再回到本来事情A被中止的当地持续处理事情A(中止回来),这一进程称为中止。
了解上述中止的界说,有两点需求留意:1,中止程序履行完,又回来中止前的当地(断点)接着履行程序;2,中止的函数不需求声明,且该函数放在main函数的外面(附中止程序)。
附:80C51的中止体系
80C51的中止体系有5个中止源(见图1)(8052有6个),2个优先级,可完结二级中止嵌套。
图1
图2
阐明:图1,外部中止上的横线表明低电平有用。
1中止恳求标志寄存器TCON:
阐明:
IT0(TCON.0),外部中止0触发办法操控位。
当IT0=0时,为电平触发办法。
当IT0=1时,为边缘触发办法(下降沿有用)。
IE0(TCON.1),外部中止0中止恳求标志位。
IT1(TCON.2),外部中止1触发办法操控位。
IE1(TCON.3),外部中止1中止恳求标志位。
TF0(TCON.5),守时/计数器T0溢出中止恳求标志位。(硬件操控)
TF1(TCON.7),守时/计数器T1溢出中止恳求标志位。(硬件操控)
留意:低四位用于操控外部中止,高四位用于操控和请求守时/计数器中止;TF0、TF1由硬件自动操控;TR0(TR1)为1时,守时器0(1)发动,反之中止(软件操控)。可直接进行位操作。
2中止标志寄存器IE:为1,中止答应。(可进行位操作)
3中止优先级寄存器IP:
阐明:
80C51单片机有两个中止优先级,即可完结二级中止服务嵌套。每个中止源的中止优先级都是由中止优先级寄存器IP中的相应位的状况来规则的。
§PX0(IP.0),外部中止0优先级设定位;
§PT0(IP.1),守时/计数器T0优先级设定位;
§PX1(IP.2),外部中止0优先级设定位;
§PT1(IP.3),守时/计数器T1优先级设定位;
§PS(IP.4),串行口优先级设定位;
§PT2(IP.5),守时/计数器T2优先级设定位。
§CPU一起接收到几个中止时,首要呼应优先等级最高的中止恳求。
§正在进行的中止进程不能被新的同级或低优先级的中止恳求所中止。
§正在进行的低优先级中止服务,能被高优先级中止恳求所中止。
总结:
中止呼应条件
§中止源有中止恳求;(TCON)
§此中止源的中止答应位为1;(IE)
§CPU开中止(即EA=1)。(EA)
以上三条一起满意时,CPU才有或许呼应中止。
中止子程序(守时器0(1)中止呼应):
void main()
{
EA=1;//开CPU中止
ET0=1;//开守时器0(中止答应)
ET1=1;
TR0=1;//发动守时器0
TR1=1;
}
void time0() interrupt 1 //中止函数time0()不需求声明,数字1与优先级有关,如外部中止0,应设置为0(interrupt 0)。
{}
void time1() interrupt 3
{}
1.4守时器和计数器
前面现已介绍了延时,可是那种办法延时的时刻做不到很准确,今日介绍一种准确的办法,便是守时器/计数器。
1.41 与守时器/计数器有关的寄存器
lTCON:前面现已介绍过,它主要是操控发动和请求中止。
lTMOD:操控守时器的操控办法。可用下图描绘:
阐明:
l高四位与T1操作有关,低四位与T0操作有关;
lM1MO为作业办法设置位。一般作业在办法1下,此刻M1MO=01;
l在GATE=0时,需用软件使TCON中的位TRO(TR1)置1,发动守时器。C/T0=0为守时形式,C/T0=1为计数模式;
1.42守时器/计数器作业原理
守时/计数器的本质是加1计数器(16位),由高8位THO(1)和低8位TL(1)两个寄存器组成。加1计数器输入的计数脉冲有两个来历,一个是由体系的时钟振荡器输出脉冲经12分频后送来;一个是T0或T1引脚输入的外部脉冲源。每来一个脉冲计数器加1,当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出使TCON中TF0或TF1置1,向CPU宣布中止恳求(守时/计数器中止答应时)。假如守时/计数器作业于守时形式,则表明守时时刻已到;假如作业于计数形式,则表明计数值已满。
可见,由溢出时计数器的值(注:16位全填满1时,数值刚好是65535。而溢出时计数器的值应该是65535+1=65536,即216)减去计数初值才是加1计数器的计数值。
从上面能够得到两个定论:
l计数位数是16位:高8位THO(1)和低8位TL(1);
l计数参数(添入TH和TL)与计数初值的联系:X=216-N;//假定守时时刻是50ms,即N=50000;则计数参数=65536-50000=15536。
附:核算THO(1)和低8位TL(1)初值// 假定延时时刻为50ms
TH=(65536-50000)/256//求模
TL=(65536-50000)%256//求余
守时/计数器初始化程序应完结如下作业:
l对TMOD赋值,以确认T0(1)的作业办法;
l核算初值,并将其写入TH、TL;
l中止办法时,则对IE赋值,敞开中止;
l使TR0或TR1置位发动守时/计数器守时或计数。
守时程序模块:
#include
void main()
{
TMOD=0x01;//守时器T0作业办法1
//送初值,守时为50ms。
TH0=(65536-50000)/256;
TL0=65536-50000)%256;
EA=1;//开总中止
ET0=1;//开守时器0中止
TRO=0;//发动守时器0
}