使用单片机的定时器0和中断实现9到0的倒计时功能,并用数码管显示


C程序代码源程序如下:

/*

本程序使用单片机的定时器0和中断实现9到0的倒计时功能,并用数码管显示
*/

#include


#define uchar unsigned char //宏定义
#define uint unsigned int


uchar num1=9,shu;
uchar num;


sbit dula = P2^6;   //段选,申明U1锁存器的锁存端,锁存器使用的是74HC573
sbit wela = P2^7;   //位选,申明U2锁存器的锁存端,锁存器使用的是74HC573


uchar code table[]=
{0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71}; //数组,用于数码管显示数字的数字集,从0到F




/*
延时函数
*/
void delayms(uint xms)  
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}


/*
数码管显示函数
*/
void display(uchar x)
{
dula = 1; //打开U1锁存器,用于控制显示的数据
P0 = table[x]; //送入数据到锁存器U1,送入段选信号,显示什么数字
dula = 0; //关闭U1锁存器


P0 = 0xff; //消影,因为P0口任然保持上次的数据


wela = 1; //打开U2锁存器,用于控制哪个数码管亮
P0 = 0xfe; //让最左边的数码管亮
wela = 0; //关闭U1锁存器
delayms(5); //延时五个毫秒
}


/*
主函数
*/
void main()
{
TMOD = 0x01; //设置定时器0在工作方式1
TH0 = (65536-45872)/256; //装初值,50ms申请一次中断
TL0 = (65536-45872)%256;
EA = 1; //开总中断
ET0 = 1; //开定时器0中断
TR0 = 1; //启动定时器0
while(1) //程序在这里不停的对数码管动态扫描同时等待中断发生
{  
display(shu);  
}
}


/*
中断函数
*/
void T0_time() interrupt 1   //1号中断,定时器0的中断号
{
TH0 = (65536-45872)/256; //装初值,50ms申请一次中断
TL0 = (65536-45872)%256;
num++;  //申请一次中断num加1一次
if(num==20) //num加到20时,50*20=1000ms,说明一秒钟到了
{
num=0;
num1--;
if(num1==0)
num1=9;
shu=num1; //把num赋给shu,送给display(shu)数码管显示子函数
}
}

你可能感兴趣的:(使用单片机的定时器0和中断实现9到0的倒计时功能,并用数码管显示)