KST-51单片机:c语言编程实现数码管动态显示秒表的倒计时

news/2024/11/7 14:27:12/
/*60S倒计时*/
/*个位每1S变一次,从0~9*/
/*十位,个位为0的下一秒十位发生变化*/#include<reg52.h>sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;unsigned char code LedChar[]=
{
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90
};void main()
{unsigned int cnt=0; //记录中断次数unsigned int sec=0; //记录秒数unsigned char g=0;   //个位数码管unsigned char s=6;   //十位数码管 ENLED=0;			 //使能U3 选中数码管DS1TMOD=0x01;			 //T0为模式1TH0=0xB8;			 //T0赋初值0xB800TL0=0x00;TR0=1;				 //启动T0while(1){ADDR3=1;P0=0xff;ADDR2=0;ADDR1=0;ADDR0=0;P0=LedChar[g];   //选中个位数码管if(TF0==1)		 //判断T0是否溢出{TF0=0;		 //T0溢出后清零中断标志TH0=0xB8;        //并重新赋值TL0=0x00;cnt++;}if(cnt>=50)	  //判断溢出是否达到50次{cnt=0;    //达到五十次(1s)清零sec--;    //秒数累加}P0=0xff;ADDR0=1;P0=LedChar[s];   //选中十位数码管,并显示当前秒数下的数字if(s==0&&g==0)    //避免00状态的出现,状态60~60时间为60ss=6;if(g==0&&sec%10==1)s--;if(sec%10!=0){g=10-sec%10;}if(sec%10==0){g=0;}}
}

(1)实际上数码管状态变化为01~00~60,只不过00存在的时间过短,无法被人眼识别。

(2)在切换数码管前先让 P0=0xff 避免了前一个数码管留下的余辉。

 

上面程序较为繁琐,以下为更新程序:

/*60倒计时*/#include<reg52.h>sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;unsigned char code LedChar[]=
{
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90
};unsigned int cnt=0;     //记录中断次数
unsigned char flag=0;   //中断标志位
unsigned char i=0;	//遍历
unsigned char g=0xff;   //初始化个位数码管
unsigned char s=0xff;   //初始化十位数码管
unsigned int sec=61;    //秒数void main()
{EA=1;           //定时器总中断ENLED=0;	//?使能U3ADDR3=1;        //T0模式为1TMOD=0x01;	//定时1msTH0=0xfc;	TL0=0x67;ET0=1;TR0=1;		//启动T0while(1){if(flag==1)            //中断标志{		g=sec%10; s=sec/10;flag=0;        //标志清0if(sec==0)     //重新倒计时sec=61;}}
}
void InterruptTimer0() interrupt 1
{TH0=0xfc;			 //重新赋值TL0=0x67;cnt++;if(cnt>=1000)	  //中断累计1000 1s{cnt=0;    //清0flag=1;sec--;    //秒数自减	}P0=0xff;switch(i){case 0:ADDR0=0;ADDR1=0;ADDR2=0;P0=LedChar[g];i++;break;   //选中个位数码管case 1:ADDR0=1;ADDR1=0;ADDR2=0;P0=LedChar[s];i=0;break;   //选中十位数码管default:break;}
}

改进后,程序更为简洁直观。采用中断+switch遍历优化程序。

注意:遍历中,为了使几个数码管看起来像是同时亮,故大大缩短了定时时间,由20ms变为1ms。


http://www.ppmy.cn/news/615617.html

相关文章

stm32倒计时秒表proteus_单片机课程设计倒计时秒表教程文件

精品文档 精品文档 一、设计目的 此次设计是我们更进一步了解基本电路的设计流程&#xff0c;提高自己的设计理念&#xff0c; 丰富自己的理论知识&#xff0c;巩固所学知识&#xff0c;使自己的动手动脑能力有更进一步提高&#xff0c; 为自己今后的学习和工作打好基础&#x…

android手机时钟、闹钟、计时器、秒表app源码

简 介 此多功能闹钟界面采用TabHost框架&#xff0c;头部包含分别用LinearLayout水平布局显示四个标签闹钟&#xff0c;时钟&#xff0c;计时器和秒表&#xff0c;FrameLayout框架内部采用LinearLayout垂直布局。功能事件的基本实现分别有AlarmView类&#xff0c;AlarmReceiver…

60秒倒计时器 秒表 c语言程序,用单片机设计一个两位LED显示的秒表,按下计时键时,进行60s倒计时显示...

满意答案 w86586tk3y 2017.09.25 采纳率&#xff1a;57% 等级&#xff1a;8 已帮助&#xff1a;214人 #include sbit P3_5 P3^5; unsigned char code dispcode[]{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x00}; unsigned char …

verilog秒表计时器

本设计是使用verilog实现秒表计时器。 秒表指示的时间由nexys4 DDR开发板的8个数码管显示,从左到右数码管的前两个显示小时(范围0-24),第3-4个数码管显示分(范围0-59,计数到60,向小时位进1),第5-6个数码管显示秒(范围0-59,计数到60向分位进1),第7-8个数码管显示毫…

前端文件上传的几种交互造轮子

背景 前端文件上传本来是一个常规交互操作&#xff0c;没什么特殊性可言&#xff0c;但是最近在做文件上传&#xff0c;需要实现截图粘贴上传&#xff0c;去找了下有没有什么好用的组件&#xff0c;网上提供的方法有&#xff0c;但是没找完整的组件来支持 cv 上传&#xff0c;…

基于STM32的多功能秒表

基于STM32的多功能秒表 当上电运行后&#xff0c;按下KEY1,秒表开始正计时&#xff0c;再次按下KEY1秒表停止计时&#xff0c;按下KEY2秒表清零&#xff0c;按下KEY3&#xff0c;手动调节秒表时间递增&#xff0c;按下KEY4手动调节秒表时间递减&#xff0c;按下KEY5秒表倒计时…

stm32倒计时秒表proteus_倒计时秒表 单片机

目录 一、设计目的 ........................................................................................................ 1 二、设计任务及要求 ............................................................................................ 2 三、总体方案设计 …

MSP430 G2553 单片机 口袋板 日历 时钟 闹钟 万年历 电子时钟 秒表显示

一、实验目的本次实验使用 MSp430G2553 以及 GZ 扩展版的 LCO 显示、蜂鸣器、机械按键&#xff0c;实现具有多功能电子钟的设计。功能包括&#xff0c;按键切换工作界面、设置时间、秒表计时、闹钟的设定、闹钟的暂停与休眠。二、实验内容与设计思路电子钟功能综述本次电子表设…