使用定时器和数码管实现简易秒计时器

从今天开始,我们利用上前几天学习的定时器和数码管,一起设计一个简单的秒计时器
项目工作流程:单片机开机机器自动启动计时器,计时器从0开始计时,每一秒加一,直到9999后自动复位成0000。
这个项目中我们使用到数码管和单片机c51的timer0,定时器每次定时5ms,每次满5ms的时候输出一次一位的显示,同时数码管位控为一一位,移到最后一位数码管就自动回到第一位,累计计满200次5ms(也就是1秒以后),计时器+1,直到9999
我们用一个数组存下寄存器的数值,这个数组是time[4],其中time[0]对应个位,time[1]对应十位,time[2]对应百位,time[3]对应千位
计算出初始值为60928,换算
th0 = 0xee;tl0 = 0x00;整个项目的电路图:
这里不得不提醒一下,我们之前设计的电路图中,左边的数码管是第一位
//从左往右数:最左边第一位数码管,接下来是二,三,四sbit smg_1 = p2^0;//第一位数码管接在p2.0sbit smg_2 = p2^1;//第一位数码管接在p2.1sbit smg_3 = p2^2;//第一位数码管接在p2.2sbit smg_4 = p2^3;//第一位数码管接在p2.3//整个数码管取模unsigned char code smgbit[] = {0xfe,0xfd,0xfb,0xf7};现在,为了让数码管配合我们存放时间的变量time[],所以我们换了一下数码管的位,现在是左边第一位是第一位
不过这个大家不用记住,我们的工程用到的时候要我会跟大家说的,所以本工程中的数码管的位控
//从左往右数:最左边第一位数码管,接下来是二,三,四sbit smg_1 = p2^3;//第一位数码管接在p2.0sbit smg_2 = p2^2;//第一位数码管接在p2.1sbit smg_3 = p2^1;//第一位数码管接在p2.2sbit smg_4 = p2^0;//第一位数码管接在p2.3//整个数码管取模unsigned char code smgbit[] = {0xf7,0xfb,0xfd,0xfe};程序大概流程(画的有点丑,见谅):
程序框图:
代码:
//这个代码展示的是一个0~9999秒的计时器#includeunsigned char time[4] = {0,0,0,0};//我们的计时器时间的变量//这四个time元素分别代表千位(time(3))百位(time(2))十位(time(1))个位(time(0))//----------------------------------------------------------------//----------------------------------------------------------------unsigned char code smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管取模unsigned char code smgbit[] = {0xf7,0xfb,0xfd,0xfe};//数码管位控//操作的时候直接用p2 = smgbit[0~3]对应1~4位数码管unsigned char smgselect = 0;//数码管选位//这里不得不特别说明//smgselect不仅仅是控制我们的数码管位控,还控制着数码管显示时对描述位置的选位操作//smgbit 0 1 2 3//数码管 1 2 3 4 位//秒数 个 十 百 千//----------------------------------------------------------------unsigned char timercount = 0;//这个变量记录定时器定时溢出次数//(定时器一次定时5ms)//---------------------------------------------------------------- unsigned char a = 0;//----------这个是一个临时变量void main(){//注意设置定时器初始值要在main函数里面设置 tmod = 0x01; /*设置定时器模式寄存器tmod为 0000 0001 gate = 0 c/t = 0 m1 =0 m0 = 1 标准16位定时器 */ //先设置定时器初始值,我们一次延迟5ms,计算得初始值为60928 tl0 = 0x00;//设置定时器初始值低位 th0 = 0xee;//设置定时器初始值高位 tr0 = 1;//记得一定要设置定时器开启 while(1) { if (tf0 == 1) { p2 = 0xff;//注意每次写数码管之前都要把所有的数码管关闭 a = time[smgselect]; p0 = smg[a]; //这个过程先从time[]里面取出位数的数值 //再把这个数值送到smgbit里面选择出这位数对应的数码管取模 //最后把这个取模的数据送给p0 io组,显示 p2 = smgbit[smgselect]; //选择数码管位置 smgselect++; if (smgselect >3){smgselect = 0;}//如果选位变量超过3,归零 timercount++; if(timercount > 200) { time[0]++; timercount = 0; //检测第一位有没有满 if(time[0] >9) { time[0] = 0; time[1]++; } //检测第二位有没有满 if(time[1] >9) { time[1] = 0; time[2]++; } //检测第三位有没有满 if(time[2] >9) { time[2] = 0; time[3]++; } //检测第三位有没有满 if(time[3] >9) { time[3] = 0; } } tl0 = 0x00;//设置定时器初始值低位 th0 = 0xee;//设置定时器初始值高位 tf0 = 0;//设置好初始值后再复位定时器 } }}

磷酸中二氧化硅的选择性湿法蚀刻方法
FSW50 (ROHDE & SCHWARZ) FSW26 信号和频谱分析仪
关于内窥镜气密性检测的案例
植物水势测定仪操作方法详解
微软SurfacePro7高清图集
使用定时器和数码管实现简易秒计时器
哪些材料需要使用到双85恒温恒湿试验箱做测试
苹果收购天气软件Dark Sky,将提供更精准的天气资讯
98英寸巨幕电视选软屏还是软屏?看这三大优势就够了
焊接电弧的产生_焊接电弧由哪三部分组成
美国或在半导体、人工智能和量子计算考虑进一步对我国加以限制
FOC在三相BLDC应用中的优势解析
YonghongGPT解决方案:实现数据智能化决策
苹果辩称App Store非单一平台,但仍需遵循反垄断法规
工业互联网的发展将会带动整个市场的经济发展
嵌入式系统中,内存不够用了怎么办?
MIT研究人员开发出新型“光子”芯片
TDA1521功放电路板原理图
Imagination拆卖MIPS,究竟是什么原因?
全系转型电动化才是Smart的未来的发展之路