单片机的功能确实多,做一个秒表应该怎么写程序呢?
单片机也有中断功能,它也会中断单片机主程序正常运行。今天设计的秒表是利用单片机内部资源——定时/计数器中断,前面讲过延时1秒(s),是让单片机空耗一段时间,并且延时时间不是精确的,但是定时器中断获得时间单位就比较精确,精确程度与单片机外接晶振质量有关。
常见的单片机单片机一共有5个中断,即外部中断0、外部中断1、定时/计数中断0、定时/计数中断1、串口中断。
一、制作一个秒表
1.电路
2.程序设计
#include<reg52.h>//头文件
#define uchar unsigned char//宏定义
#define uint unsigned int
uchar table []={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴数码管数组
uchar num,num1,shi,ge;//定义变量
void delay(uchar a)//延时函数
{
uint i,j;
for(j=a;j>0;j--)
for(i=110;i>0;i--);
}
void display(uchar shi,uchar ge)//显示函数
{
P0=table[shi];
P1=0XFE;//1111 1110选中数码管第一位
delay(5);
P0=table[ge];
P1=0XFd;//1111 1101选中数码管第二位
delay(5);
}
void t0init()//初始化
{
TMOD=0X01;//0000 0001//定时器0工作方式1
TH0=0X3C;//装入初值,50毫秒
TL0=0XB0;//装入初值
EA=1;//打开总中断开关
ET0=1;//打开定时器0中断开关
TR0=1;//启动定时器0
}
void main()//主函数
{
t0init();
while(1)//无限循环
{
display(shi,ge);
}
}
void timer0()interrupt 1 //中断函数
{
TH0=0X3C;//装入初值
TL0=0XB0;//装入初值
num++;//变量累加
if(num==20)//1秒
{
num=0;
num1++;
shi=num1/10;//取十位
ge=num1%10;//取个位
if(num1==60)
{
num1=0;
}
}
}
3.程序解释
(1)采用定时器中断必要的语句。
TMOD=0X01;
TMOD是选择定时器工作方式。0X01是定时/计数中断0工作方式1,如果是0X10是定时/计数1工作方式1。
TH0=0X3C;//装入初值
TL0=0XB0;//装入初值
如果单片机外接晶振是12M,它的时钟周期是1/12μs(微妙),12个时钟周期是一个机器周期即1μs,定时/计数0工作方式1,最大值能定时65536μs(2的16次方),约等于65ms。如果需要定时50ms,也就是计数不是从0开始,而是从15536(65536-50000)开始,15536(十进制)换算为16进制为3CB0,即“TH0=0X3C;TL0=0XB0;”,需要计时1s,只需程序中断20次。
EA=1;//打开总中断开关
EA是总开关,好比总电闸。
ET0=1;//打开定时器0中断开关。它是定时器0的开关,好比客厅总电源开关。
TR0=1;//启动定时器0。启动定时器0好比客厅的吊灯开关。
以上语句需要写在主函数中,或者作为函数,在主函数中调用。
(2)void display(uchar shi,uchar ge)//显示函数显示部分用函数形式体现,在主函数循环调用。
(3)中断函数
既然中断产生了,那么中断以后做什么?
void timer0()interrupt 1 //中断函数
{
做什么工作;
}
“timer0”自己起的名字,代表定时/计数0中断,“interrupt”不能写错,关键是它后面的数字千万也不能搞错。需要注意,采用工作方式1,需要在中断函数中重新装入初值。
中断源与序号


51单片机定时器用法之1秒定时程序设计
动画演示
在我们的DIY电子时钟里,需要用到单片机定时器来做秒的显示,说是显示,其实就是实现数码管上“:”点的闪烁。这里初步定义为每秒亮1次,亮0.5秒,灭0.5秒。实现显示秒的功能。这里也可以用DS1302的秒数据来做,但是实现起来麻烦,达到一样的效果,我们追求的是程序越简单越好,所以在此我们用单片机定时器来实现。
我们DIY时钟板子上的单片机为STC15W408AS,单片机自带IRC可调时钟和搞可靠复位,为了降低功耗(工作频率越低,功耗越小),本时钟采用12M的工作频率(烧写程序是在软件上选择),那当定时器工作在12T模式下时,一个机械周期就是1us。
接下来我们就该看看单片机的数据手册了。以下是今天我们需要关注的寄存器:
TCON位定义
TMOD寄存器位定义
T0工作方式设置
TCON为定时器T0和T1的控制寄存器,可以位寻址(直接操作位);TMOD是T0、T1工作方式控制寄存器,不可以位寻址(只能操作寄存器),高四位控制T1,低四位控制T0;定时器的工作方式由TOMD寄存器中的M1和M0选择,具体如上图。
本例中我们要用T0实现1秒的定时时间,这里我们用T0工作在方式0,也就是16位的自动重载方式(传统的51单片机只有8位的自动重载,需要做高精度的定时时最好用自动重载方式)。我们不需要外部中断来开启定时器,所以GATE位=0,T0工作在定时模式,CT=0,所以我们TMOD寄存器的值为0x00;在TCON寄存器里和T0相关的位有TF0和TR0;TF0=0:T0中断标志位,当定时器中断产生是,TF0自动置位,CPU相应中断后硬件自动清零;TR0=1:开启定时器,相当于定时器的开关。
除了这些寄存器外,定时器溢出后,也会产生中断,所以还需要去设置中断部分:
EA=1:,开启总中断,相当于中断总开关;ET0=1;开启定时器T0中断,相当于中断的子开关,只有中断的总开关和相应的子开关都开启后,CPU才能相应中断信号,具体请看中断部分数据手册。我们用的STC15W系列单片机属于增强型单片机,为了和传统51单片机兼容,还专门设有一个寄存器AUXR,此寄存器可设置T 0工作在1T还是12T模式,此处我们让T0工作在12T模式下,AUXR=0x00。最后就是定时器的初值寄存器了,我们需要定时的时间是500ms,16位的定时器再12M频率下最大定时时间为65535us,而我们需要的是500ms,明显达不到,那我们就需要做组合定时的方式,这里我们设定定时器的中断频率为10ms,那我们中断1次后在中断函数里将某个变量加1,当变量加到50的时候就是500ms,当变量加到100的时候就是1s了。这就是我们实现1s定时的思路。
具体实现程序如下:(因头条原因,代码图片无法加入,需要请移步关注微信公众号)
如上图中程序所示,定时器初始化时设置T0位16位自动重载模式,工作在12T模式,初值10ms,开启定时器,开启中断。这样定时器就工作了;在定时器中断函数里,每次进入中断后我们就给变量T_a自加1,当变量小于50的时候(小于500ms),让D=1(D即为我们电路中控制秒显示的那两个点,高电平有效),大于50小于100的时候D=0,关闭秒显示。这样一来就实现了秒显示在1秒内亮500ms,灭50ms了。上图中中断函数名后面的interrupt 1这是中断函数的入口地址,C语言中叫中断号(为小白说明,老司机略过),具体的个中断对应的入口地址对照表如下图(部分):
中断号对照表
相关问答
单片机定时器 定时的时间肿么算?-ZOL问答51单片机,根据晶振频率,计算指令周期,设置定时器的分频,然后设置定时器的工作方式TMOD,最后设置初值TH0TL0比如用的XHZ的晶振,stc的单片机有3种模式(X/12)x/...
单片机 倒计时程序编写?工作过程:首先上电之后先调整定时时间,每按一次加键定时加十分钟,减键同理,当设置好分钟之后按下设置键等到数码管闪动后松开按键进入小时设置,每按一次加...
51 单片机 T0 定时器 4种方式的 定时 时长分别是多少 - 懂得51单片机最大硬件定时时间,就是定时器能定时的时间,最长时间=65536*TcTc=fosc/12,fosc是单片机的晶振频率。以频率=12M为例吧,Tc=1us最大定时时间=6...
51 单片机 怎样用按键设定 定时 时间?算为设定延时值4.时钟...2.确定按键完成的条件(按确定键或一定延时量)3.按键完成后,处理按键变量,并计算为设定延时值4.时钟累计变量复位,开始重新累计,允...
51 单片机 T0 定时器 4种方式的 定时 时长分别是多少 - 150****156...51单片机最大硬件定时时间,就是定时器能定时的时间,最长时间=65536*TcTc=fosc/12,fosc是单片机的晶振频率。以频率=12M为例吧,Tc=1us最大定时时间=6...
单片机 的 定时 和计数有什么,区别?假设定时器是一个16为的定时器,那么对于单片机来说这个定时器工作需要从0计数到65535,而每增加一个数他需要一定的时间,比如从0到1就需要一定时间,这个时间是...
单片机 的 定时 器的四种工作方式都是什么?书上看不懂。能不能用容易理解的话解释一下?第一种工作方式0,是2的13次方(13位)定时器或计数器,就是最大能数8192个数的模式,数一个数就是1个机器周期。工作方式1就是2的16次方(16位)定时器或计数器...
单片机定时 /计数器和中断到底有什么用?定时器用来计算时间,固定时间触发中断。计数器用来对引脚输入的信号下降沿进行计数。和中断相关,但不一定要开中断。可以单独用。定时器用来计算时间,固定...
定时 器4种工作模式的最长延时时间?晶振的频率为12MHz,机器周期=12/Fosc=12/(12x10^6Hz)=1μs定时器/计数器工作方式1,是16位计数器,最大计数值=2^16=65536d,最大延时时间=655...
stm32 单片机 不进中断怎么精确 定时 ?采用查询计时器计数器的方式可实现精确定时。采用查询计时器计数器的方式可实现精确定时。