51单片机 数码管 定时器 准确时间.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
51单片机 数码管 定时器 准确时间

//51单片机控制四个数码管,通过定时器准确定时一秒,在数码管上显示小时和分钟,数码管上的小数点以间隔一秒的时间闪烁 #include reg51.h unsigned char code table[]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //表:共阳数码管 0-9 unsigned char l_posit=0; //显示位置 unsigned char ly_tt=0; //作为计数时间量 unsigned char ly_miao=0; //秒 unsigned char ly_fen=0; //分 unsigned char ly_shi=3; //时 sbit SMG_q = P1^0; //定义数码管阳级控制脚(千位) sbit SMG_b = P1^1; //定义数码管阳级控制脚(百位) sbit SMG_s = P1^2; //定义数码管阳级控制脚(十位) sbit SMG_g = P1^3; //定义数码管阳级控制脚(个位) void display(unsigned char shi,unsigned char fen);//定义显示函数,参数为显示时分 void delay(unsigned int timer); void init(); //初如化函数 void main() { init(); //初始化定时器0 while(1) { if(ly_tt==20) //20*50ms为1秒 { ly_tt=0; ly_miao++; if(ly_miao==60) { ly_miao=0; ly_fen++; if(ly_fen==60)//满60分清0 { ly_fen=0; ly_shi++; if(ly_shi==24)//满24小时清0 ly_shi=0; } } } display(ly_shi,ly_fen); //显示变量内容 delay(100); } } void init()//初始化定时器0函数(定时50ms) { ly_tt=0; TMOD=0X01; //设置定时器0为模式一,即16位计算模式 TH0=(65536-50000)/256; //给计数寄存器赋值,50毫秒时间 TL0=(65536-50000)%256; EA=1; //开启总中断 ET0=1; //开启定时器0中断 TR0=1; //启动定时器 } //中断函数,关键字interrupt , 这是C语言的中断函数表示法,1表时定地器0 void timer() interrupt 1 { TH0=(65536-50000)/256; //重新赋值 TL0=(65536-50000)%256; ly_tt++; //50毫秒计时 } void display(unsigned char shi,unsigned char fen)//显示函数,参数为显示内容 { P0=0XFF; //关闭显示 switch(l_posit) { case 0: //选择千位数码管,关闭其它位 SMG_q=0; SMG_b=1; SMG_s=1; SMG_g=1; P0=table[shi/10]; //输出显示内容 break; case 1: //选择百位数码管,关闭其它位 SMG_q=1; SMG_b=0; SMG_s=1; SMG_g=1; P0=table[shi%10]; if(ly_tt=10) { P0=0x7f; } //前半秒不显示,后半秒显示,下一秒前半秒不显示,后半秒显示,这样前一次显示距离下一次显示正好一秒钟(一般编程都这样) break; case 2: //选择十位数码管,关闭其它位 SMG_q=1; SMG_b=1; SMG_s=0; SMG_g=1; P0=table[fen/10]; break; case 3: //选择个位数码管,关闭其它位 SMG_q=1; SMG_b=1; SMG_s=1; SMG_g=0; P0=table[fen%10]; break; } l_posit++; //每调用一次将轮流显示一位 if(l_posit3) l_posit=0; } void delay(unsigned int tim

文档评论(0)

f8r9t5c + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8000054077000003

1亿VIP精品文档

相关文档