单片机课设-60秒倒计时器

proteus单片机实现60秒倒计时器

项目要实现的60s秒表倒计时器,用 AT89C51单片机的定时 / 计数器 T0 产生一秒的定时时间,实现 59 到 0秒的循环显示的功能。具体要求:
1)按下启动按键后,倒计时器开始工作,从60S开始倒计时。
2)再次按下启动按键后,倒计时器复位。
3)按下暂停按键后,倒计时器停止计时工作。
4)再次按下暂停按键后,倒计时器继续进行计时工作。
在这里插入图片描述
顺序图:
在这里插入图片描述
流程图:
在这里插入图片描述
组件图:
在这里插入图片描述
代码如下:

#include <reg51.h>
unsigned char code LED[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char m,buf[4];
unsigned int shu,j;
void delay(unsigned char x)
{
	unsigned char y;
	for(;x>0;x--)
		for(y=110;y>0;y--);					
}
void dis(unsigned int temp)
{
	unsigned char i;
	buf[0]=0;
	buf[1]=0;
	buf[2]=temp/10;
	buf[3]=temp%10;
	
	for(i=0;i<4;i++)
	{
		P2=(0x01<<i);
		P1=LED[buf[i]];
		delay(5);
		P1=0xff;
	}
}

void INT_0( ) interrupt 0 
{	
	TR0=~TR0;
}
void INT_1( ) interrupt 2 
{	
	TR0=~TR0;
	TL0=(65536-50000)%256;	
    TH0=(65536-50000)/256;
	shu=60;
    j=0; 
          	
}
void TIME_0( ) interrupt 1
{
    TL0=(65536-50000)%256;	
    TH0=(65536-50000)/256;			
    j++;
	if(j==20)
	{
	    j=0;
		shu--;
		if(shu==0)
		TR0=0;
	}
}
void main()
{       
    TCON=0x05;
    IP=0x00;
    TMOD=0x01;
    TL0=(65536-50000)%256;	
    TH0=(65536-50000)/256;	
    TR0=1;
    IE=0x87;
    shu=60;
    j=1;
	while(1)
	{
		dis(shu);
	}		
}

  • 49
    点赞
  • 361
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
下面是一个使用C语言实现单片机60倒计时并在数码管上显示的示例代码,使用的是STC89C52单片机和共阴极数码管: ```c #include <reg52.h> unsigned char timer_count = 0; // 定义计时器计数变量 // 数码管显示函数 void display(unsigned char num) { unsigned char code table[] = { // 数码管显示表 0xC0, // '0' 0xF9, // '1' 0xA4, // '2' 0xB0, // '3' 0x99, // '4' 0x92, // '5' 0x82, // '6' 0xF8, // '7' 0x80, // '8' 0x90 // '9' }; P2 = table[num]; // 显示num对应的数码管字符 } // 定时器中断服务程序 void timer_isr() interrupt 1 { TH0 = 0x3C; // 设置定时器初值为60ms TL0 = 0xAF; timer_count++; // 计时器计数加1 if(timer_count >= 100) { // 如果计时器计数器达到60 timer_count = 0; // 计时器计数器清零 } display(timer_count / 10); // 显示十位数字 P1 = (P1 & 0x0F) | (0x10 << (timer_count % 10)); // 显示个位数字 } int main() { TMOD = 0x01; // 设置定时器0为模式1,16位定时器 TH0 = 0x3C; // 设置定时器初值为60ms TL0 = 0xAF; TR0 = 1; // 启动定时器0 ET0 = 1; // 打开定时器0中断 EA = 1; // 打开总中断 while(1) { // 主程序循环 // do nothing } return 0; } ``` 在这个示例中,我们定义了一个计时器计数变量 `timer_count`,并在定时器中断服务程序 `timer_isr()` 中将其加1,每次检测到计时器计数器达到60时,计数器清零。同时,在数码管显示函数 `display()` 中,我们使用了共阴极数码管的显示表来显示数字。在主程序中,我们通过循环来控制程序的运行。 需要注意的是,在使用数码管时,需要根据具体的硬件平台和需求,设置正确的接口和显示方式。另外,建议在定时器中断服务程序中尽量避免使用过多的代码,以免影响计时器精度。
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值