用定时器做延时的数码管时间显示
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*
本程序实现了用数码管显示时间的功能,时间计数和现实基本一致(这取决于定时器精度和指令时间)。
该程序提供了一种用定时器延时实现传统delay的显示方法,后面给出比较。
文档最后有该程序对应的原理图,大部分开发板都能直接用这个程序,稍微改下IO口即可。如有错误之处请包涵,此篇文档仅作交流之用。
*/
/*---------------------定时器方法----------------*/
#include
/*----------------全局变量定义区----------------*/
sbit duan_xuan=P2^6; //数码管显示控制I/O
sbit wei_xuan=P2^7;
unsigned char minute = 0; //分钟的变量,20*60次timer0中断
unsigned char hour = 0;
unsigned char i_num_timer0; //定时器中断次数
unsigned char i_num_timer1;
unsigned char disp_min1,disp_min2,disp_hour1,disp_hour2; //分解后的数值变量
unsigned char wei = 1; //用来标记显示哪个数码管
unsigned short uc50ms = 0; //记录time0中断次数,此程序用两个变量记录time0中断次数
/*------定义数码管显示的数字---------*/
unsigned char code duan_table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
/*-----------------函数声明段----------------*/
void ini_program();
void disp_time(); //显示时间
void current_time(); //记录小时,分钟变量
// void breakdown_time(uint hour,uint minute);//分解数值,送数码管分别显示
//-------------------------------------
void main()
{
ini_program();
while(1)
{
current_time();
// breakdown_time(hour,minute);
disp_min1=minute%10;
disp_min2=minute/10;
disp_hour1=hour%10;
disp_hour2=hour/10;
// disp_time();
}
}
//------------------------------------
void ini_program() //初始化
{
duan_xuan=0;
wei_xuan=0; //重置I/O状态
TMOD=0x11; //定时器0+定时器1,设定方式1
TH1=(65536-1834)/256;
TL1=(65536-1834)%256; //2ms触发一次中断
TH0=(65536-45872)/256;
TL0=(65536-45872)%256; //50ms触发一次中断
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
}
/*
void breakdown_time(uint hour,uint minute)
{
disp_min1=minute%10;
disp_min2=minute/10;
disp_hour1=hour%10;
disp_hour2=hour/10;
}
*/
void disp_time()
{
switch (wei)
{
case 1 :
duan_xuan=1;
P0=duan_table[disp_min1];
duan_xuan=0;
P0=0xff; //消影
wei_xuan=1;
P0=0xef; //选通wei5
wei_xuan=0;
break;
//////////////
case 2:
duan_xuan=1;
P0=duan_table[disp_min2];
duan_xuan=0;
wei_xuan=1;
P0=0xf7; //选通wei4
wei_xuan=0;
break;
//////////////////
case 3:
if(i_num_timer0>=20)
{
i_num_timer0=0;
duan_xuan=1;
P0=0x40; //显示一横杠
duan_xuan=0;
P0=0xff; //消影
wei_xuan=1;
P0=0xfb; //选通wei3
wei_xuan=0;
}
break;
////////////////
case 4:
duan_xuan=1;
P0=duan_table[disp_hour1];
duan_xuan=0;
P0=0xff; //消影
wei_xuan=1;
P0=0xfd; //选通wei2
wei_xuan=0;
break;
//////////////
case 5:
duan_xuan=1;
P0=duan_table[disp_hour2];
duan_xuan=0;
P0=0xff; //消影
wei_xuan=1;
P0=0xfe; //选通wei1
wei_xuan=0;
break;
}
}
void current_time()
{
if(uc50ms>=1200) //此处用==也可以
{
minute++;
uc50ms=0;
}
if(minute>=60)
{
hour++;
minute=0;
}
if(hour>=24)
{
hour=0;
minute=0;
}
}
/*--------------添加中断函数----------*/
void TIME1() interrupt 3
{
TH1=(65536-1834)/256;