找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10550|回复: 9
收起左侧

单片机9.9 秒计时器proteus仿真设计 用定时器T0实现 带源程序原理图

[复制链接]
ID:137190 发表于 2016-10-10 16:31 | 显示全部楼层 |阅读模式
一个51单片机9.9 秒计时器proteus仿真设计
开始时,显示"00",第 1 次按下 BY1 后就开始计时。第 2 次按 BY1 后,计时
停止。 第3次按BY1后,计时归零。
下面是仿真原理图:
0.png


单片机源程序:
  1. /********************************************************************
  2. 51黑电子论坛
  3. *********************************************************************/
  4. #include<reg52.h>                 //库文件
  5. #define uchar unsigned char//宏定义无符号字符型
  6. #define uint unsigned int  //宏定义无符号整型
  7. /********************************************************************
  8.                             初始定义
  9. *********************************************************************/
  10. code uchar seg7code[10]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //显示段码 数码管字跟
  11. uchar wei[4]={0XEf,0XDf,0XBf,0X7f};  //位的控制端
  12. uchar sec; //定义计数值,每过1/10 秒,sec 加一
  13. uchar keycnt=0;//按下次数值
  14. uint tcnt; //键值判断
  15. sbit P3_0=P3^0;
  16. /********************************************************************
  17.                             延时函数
  18. *********************************************************************/
  19. void delay(uchar t)
  20. {
  21.   uchar i,j;
  22.    for(i=0;i<t;i++)
  23.    {
  24.             for(j=13;j>0;j--);
  25.          { ;
  26.          }
  27.    }
  28. }

  29. /********************************************************************
  30.                             显示函数
  31. *********************************************************************/        
  32. void Led(int date) //显示函数
  33. {
  34. /*****************数据转换*****************************/
  35. uint z,x,c,v;
  36.   z=date/1000;                         //求千位
  37.   x=date%1000/100;                 //求百位
  38.   c=date%100/10;                 //求十位
  39.   v=date%10;                         //求个位

  40.       P2=0XFF;
  41.           P0=seg7code[z];
  42.           P2=wei[0];
  43.           delay(80);
  44.           P2=0XFF;  
  45.       P0=seg7code[x];
  46.           P2=wei[1];
  47.           delay(80);
  48.           P2=0XFF;  
  49.              P0=seg7code[c];
  50.           P2=wei[2];
  51.           delay(80);
  52.           P2=0XFF;  
  53.       P0=seg7code[v];
  54.           P2=wei[3];
  55.           delay(80);
  56.           P2=0XFF;
  57. }
  58. /********************************************************************
  59.                             按键扫描函数
  60. *********************************************************************/
  61. void KEY() //按键扫描程序
  62. {
  63. uchar i,j;
  64. if(P3_0==0)
  65.         {
  66.         delay(20);
  67.         if(P3_0==0)
  68.                 {
  69.                         keycnt++;
  70. /********************************************************************
  71.                             按下次数判断函数
  72. *********************************************************************/
  73. switch(keycnt) //按下次数判断
  74.         {
  75.         case 1: //第一次按下
  76.         TH0=0x06; //对TH0 TL0 赋值
  77.         TL0=0x06;
  78.         TR0=1; //开始定时
  79.         break;
  80.         case 2: //第二次按下
  81.         TR0=0; //定时结束
  82.         break;
  83.         case 3: //第三次按下
  84.         keycnt=0; //重新开始判断键值
  85.         sec=0; //计数重新从零开始
  86.         break;
  87.         }
  88.         while(P3_0==0);
  89.                 }
  90.         }
  91. }
  92. /********************************************************************
  93.                             定时中断服务函数
  94. *********************************************************************/
  95. void t0(void) interrupt 1 using 0 //定时中断服务函数
  96. {
  97.         tcnt++; //每过250ust tcnt 加一
  98.         if(tcnt==400) //计满400 次(1/10 秒)时
  99.         {
  100.                 tcnt=0; //重新再计
  101.                 sec++;
  102.                 if(sec==100) //定时10 秒,在从零开始计时
  103.                 {
  104.                         sec=0;
  105.                 }
  106.         }
  107. }

  108. /********************************************************************
  109.                             主函数
  110. *********************************************************************/
  111. void main()
  112. {
  113.         TMOD=0x02; //定时器工作在方式2
  114.         ET0=1;
  115.         EA=1;
  116.         sec=0;
  117.         while(1)
  118.         {
  119.                 KEY();
  120.                 Led(sec);
  121.         }
  122. }               

  123.         
  124. /********************************************************************
  125.                               结束
  126. *********************************************************************/
复制代码

0.png

9.9 秒计时器仿真工程文件及所有完整程序等资料下载地址(压缩包一共有45个单片机仿真,全部下载后找到第010个项目即可):
http://www.51hei.com/bbs/dpj-56298-1.html

回复

使用道具 举报

ID:199477 发表于 2017-5-11 11:51 | 显示全部楼层
挺好的
回复

使用道具 举报

ID:209425 发表于 2017-6-9 09:13 | 显示全部楼层
怎么把四位的数码管改成两个的?求问~
回复

使用道具 举报

ID:209425 发表于 2017-6-9 09:23 | 显示全部楼层
还想请教 你这用的是共阳吧,怎么换成共阴呢?
回复

使用道具 举报

ID:210302 发表于 2017-6-12 01:39 | 显示全部楼层
特别好
回复

使用道具 举报

ID:210302 发表于 2017-6-12 01:40 | 显示全部楼层
和我们刚学过的很像
回复

使用道具 举报

ID:66679 发表于 2020-4-21 20:52 | 显示全部楼层
lomassun 发表于 2017-6-9 09:13
怎么把四位的数码管改成两个的?求问~

直接把前两个数码管去掉,把位选码去掉两个,显示程序前面两位去掉就可以。本来就只用显示9.9两位。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表