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

该博客介绍了如何使用单片机的定时器0和中断实现9到0的倒计时功能,并通过数码管进行显示。程序采用C语言编写,包括延时函数、数码管显示函数和主函数,以及中断服务函数,实现了每秒更新数码管显示数值的效果。

C程序代码源程序如下:

/*

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

#include <reg52.h>


#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)数码管显示子函数
}
}

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坚持不懈的小蜗牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值