51单片机定时器数码管显示
本次的实现效果方式采用模拟进行,芯片为AT89C51,开发软件为keil5,proteus
通过定时器实现数码管0-99秒表计数
@
- 上代码
- 效果展示
- 介绍
上代码
代码如下:
#include "reg51.h" //包含头文件reg51.h,定义了51单片机的专用寄存器unsigned char count=0,miao=0; //对50ms定时时间进行计数void timer_1() interrupt 3 //定时器T1z中断,T1的中断类型号为3{ TH1=(65536-50000)/256; //重新设置T1计数初值高8位TL1=(65536-50000)%256; //重新设置T1计数初值低8位if(count==20) //50ms*20,1s时间到{count=0; //50ms计数器清0if(miao==100){miao=0;}else{miao++;} //miao计数到100,则从0开始计数}else{count++;//如果count等于1s时为0,否则count加一}
}
void disp(unsigned char i)//将i的值显示在两个静态连接的数码管上
{
unsigned char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90} ;
//定义0~9显示码,共阳极数码管
P1=led[i/10]; //显示i高位
P2=led[i%10]; //显示i低位}
void main() //主函数
{TMOD=0x10; //设置T1为工作方式1TH1=(65536-50000)/256; //设置T1计数初值高8位,定时时间50msTL1=(65536-50000)%256; //设置T1计数初值低8位ET1=1; //开放T1中断允许EA=1; //开放总中断允许TR1=1; //启动T1开始计数 while(1){disp(miao); //显示秒计数器值}
}
效果展示
keil5开发界面
proteus界面:
介绍
使用定时器的好处是无论它们工作于计数方式或计时方式,计数时都不占用CPU时间,因此定时器、计数器的工作并不影响CPU其他工作的执行,这就是采用定时、计数器的优点。
中断意思:
当程序在运行时,定时器同时运行,当开始中断时,执行中断程序,其他程序暂停运行
51内核单片机中,T1和T0都是增量计数器,因此不能直接将要计数的值作为初值放入寄存器中,而是将计数的最大值减去实际要计数的值的差存入寄存器中。可采用如下定时器/计数器初值计算公式:计数初值=2n-计数值 式中,n为由工作方式决定的计数器位数。
例如,当 T0工作于方式1时,n=16,最大计数值为65536,若要计数10000次,需将初 值设置为65536-10000=55536。如果单片机采用的晶振为11.0592MHz,则计数一次需要的时间为12分频后的一个脉冲周期
中断函数:
interrupt
后面的数字用于指定该中断函数是为哪一个中断源编写的。不同的数字代表不同的中断源。例如:
- 0:通常表示外部中断0。这是单片机的一个外部引脚上的中断,当该引脚上的电平发生变化(如从高到低或从低到高)时,会触发此中断。
- 1:通常表示定时器/计数器T0的中断。当定时器/计数器T0溢出(即计数达到其最大值后)时,会触发此中断。
- 2:通常表示外部中断1。这与外部中断0类似,但它是另一个外部引脚上的中断。
- 3:通常表示定时器/计数器T1的中断。这与T0的中断类似,但它是另一个定时器/计数器的中断。
- 4:在某些单片机中,可能表示串口中断。当串口接收到数据或发送数据时,会触发此中断。
在写定时器程序时,以下时对代码解释
EA=1;//开启总开关
ET0=1;//开启T0开关
TMOD=0x01; //将TMOD寄存器的低4位设置为0x01,表示定时器T0工作在方式1(16位定时器/计数器模式)
TH0=(65536-50000)/256; //设置定时器初值,定时时间50ms,12MHZ/12,50*1000,高八位
TL0=(65536-50000)%256;//低八位
定时器溢出时应进行重新赋值
定时器中断是由定时器计数器溢出而引发的中断。在51单片机中,定时器是一个内部计数器,它在时钟信号的作用下进行计数。每当一个时钟周期到来时,计数器就会加1。当计数器的值达到预设的最大值(即溢出值)时,会产生一个溢出信号,该信号会触发中断系统,使CPU跳转到中断服务程序去执行。中断服务程序执行完毕后,CPU会返回到原来被中断的地方,继续执行原来的程序。
二、51单片机定时器的配置
选择定时器:51单片机通常包含两个可编程的定时器/计数器T0和T1。这两个定时器都可以配置为定时器模式或计数器模式。
设置工作模式:定时器有多种工作模式可选,如13位定时器/计数器、16位定时器/计数器、8位自动重装模式等。通过配置TMOD寄存器来选择合适的工作模式。
计算并设置初值:定时器的初值决定了定时器从哪个数开始计数,从而决定了定时时间的长短。初值的计算需要根据定时器的位数、时钟频率和所需的定时时间来确定。一旦设置了初值,定时器就会在时钟信号的作用下从初值开始计数。
启动定时器:通过设置TR0或TR1寄存器来启动定时器。当TR0或TR1为1时,定时器开始计数;当TR0或TR1为0时,定时器停止计数。
三、定时器中断的实现
打开中断:要使定时器中断能够发生,首先需要打开全局中断和定时器中断。这通过设置EA(全局中断允许位)和ET0/ET1(定时器0/1中断允许位)来实现。
编写中断服务程序:中断服务程序是当定时器溢出时CPU要执行的代码。在51单片机中,通常使用特定的中断向量号来标识不同的中断源,并通过编写对应的中断服务函数来处理中断。中断服务程序通常包括保存现场、处理中断事件、恢复现场和返回指令等部分。
处理中断事件:在中断服务程序中,需要根据实际需求处理中断事件。例如,可以更新计数器、控制外设或执行其他任务。