找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4678|回复: 0
打印 上一主题 下一主题
收起左侧

智能秒表的设计与制作电路 元件清单与程序

[复制链接]
跳转到指定楼层
楼主



四、元器件清单
  
序号
  
元件名称
规格型号
数量
1
单片机
STC89C51
1
2
四位共阴数码管
3641AS
1
3
轻触按键
45*45mm
5
4
晶振
12MHz
1
5
瓷片电容
20pF
2
6
电解电容
10uF/10V
1
7
电阻
10KΩ
1
8
排电阻
1KΩ
1
9
单片机插座
40PIN
1
10
电路板
12674-b
1
11
电池
+5V
1
五、C语言程序



  1. *******************************/
  2. /*     智能秒表(完美版)      */
  3. /*******************************/
  4. #include<reg52.h>
  5. #define uint unsigned int
  6. #define uchar unsigned char
  7. sbit key1=P2^0;                //定义"启动/暂停"按钮
  8. sbit key2=P2^1;                //定义"复位"按钮
  9. sbit key3=P2^2;                                 //定义"模式"按钮
  10. sbit key4=P2^3;                                 //定义"查看"按钮
  11. sbit wei1=P2^4;                //定义位选
  12. sbit wei2=P2^5;
  13. sbit wei3=P2^6;               
  14. sbit wei4=P2^7;
  15. bit flag_start,flag_mode,flag_5sec;
  16. uchar temp,temp1,aa,aa1,shi,ge,shifen,baifen,num,i,j;
  17. uchar time_data1[11],time_data2[11];
  18. uchar code table[]={
  19. 0x3f,0x06,0x5b,0x4f,
  20. 0x66,0x6d,0x7d,0x07,
  21. 0x7f,0x6f,0x77,0x7c,
  22. 0x39,0x5e,0x79,0x71};          //不带小数点共阴极数码管编码
  23. uchar code tabledp[]={
  24. 0xbf,0x86,0xdb,0xcf,
  25. 0xe6,0xed,0xfd,0x87,
  26. 0xff,0xef,0xf7,0xfc,
  27. 0xb9,0xde,0xf9,0xf1};        //带小数点共阴极数码管编码
  28. void display(uchar shi,uchar ge,uchar shifen,uchar baifen);  //声明显示子函数
  29. void delay(uint z);            //声明延时子函数
  30. void init();                  //声明初始化函数
  31. void key();                                   //声明键扫描函数
  32. void display_process();                   //声明显示处理函数

  33. void main()
  34. {       
  35.         init();                                //调用初始化子程序
  36.         while(1)
  37.         {                      
  38.           key();
  39.           display_process();       
  40.           display(shi,ge,shifen,baifen);        //调用显示子函数
  41.         }
  42. }

  43. void delay(uint z)                       //延时子函数
  44. {
  45.         uint x,y;
  46.         for(x=z;x>0;x--)
  47.                 for(y=110;y>0;y--);
  48. }

  49. void display(uchar shi,uchar ge,uchar shifen,uchar baifen)   //显示子程序
  50. {       
  51.                 P0=table[shi];        //使用动态扫描的方法实现数码管显示
  52.                 wei1=0;
  53.                 delay(1);
  54.                 wei1=1;

  55.                 P0=tabledp[ge];
  56.                 wei2=0;
  57.                 delay(1);            
  58.                 wei2=1;
  59.    
  60.     P0=table[shifen];//使用动态扫描的方法实现数码管显示
  61.                 wei3=0;
  62.                 delay(1);
  63.                 wei3=1;

  64.                 P0=table[baifen];
  65.                 wei4=0;
  66.                 delay(1);            
  67.                 wei4=1;       
  68. }

  69. void init()                     //初始化子程序
  70. {       
  71.         temp=0;
  72.         TMOD=0x01;             //使用定时器T0的方式1
  73.         TH0=(65536-10000)/256;
  74.         TL0=(65536-10000)%256;   //定时50ms中断一次
  75.         EA=1;                   //中断总允许
  76.         ET0=1;                  //允许定时器T0中断       
  77. }

  78. void key()
  79. {
  80.         if(key1==0)           //检测"启动"按钮是否按下
  81.          {
  82.                 delay(5);         //延时去抖动
  83.                 if(key1==0)       //再次检测"启动"按钮是否按下
  84.                  {       
  85.            while(!key1);           //松手检测
  86.                    flag_start=~flag_start;
  87.                    if(flag_mode==0)
  88.                     {
  89.                       if(flag_start==1)
  90.                             TR0=1;              //启动定时器开始工作
  91.                       else
  92.                             TR0=0;
  93.                         }
  94.                    else
  95.                         {
  96.                           if(flag_start==1)
  97.                             TR0=1;
  98.                           else
  99.                             TR0=0;
  100.                         }
  101.                  }
  102.          }
  103.                 if(key2==0)                 //检测"停止"按钮是否按下   
  104.                 {
  105.                         delay(5);         
  106.                         if(key2==0)      
  107.                         {       
  108.                                 while(!key2);
  109.                                 if(flag_mode==0||i!=0)
  110.                                  {  
  111.                                   shi=0;              //关闭定时器
  112.                                   ge=0;
  113.                                   shifen=0;
  114.                                   baifen=0;
  115.                                   aa=0;
  116.                                   temp=0;
  117.                                   TR0=0;
  118.                                   i=0;
  119.                                   num=0;
  120.                                   for(j=0;j<=10;j++)
  121.                                   {
  122.                                     time_data1[j]=0;
  123.                                     time_data2[j]=0;
  124.                                   }
  125.                                  }
  126.                             else
  127.                              {
  128.                                    num++;
  129.                                    if(num==11)
  130.                                      num=1;
  131.                                    aa1=aa;
  132.                                    temp1=temp;
  133.                                    time_data1[num]=aa1;
  134.                                    time_data2[num]=temp1;
  135.                                    flag_5sec=0;
  136.                                  }
  137.                         }
  138.                 }
  139.                 if(key3==0)
  140.                 {
  141.                   delay(5);
  142.                   if(key3==0)
  143.                    {
  144.                      while(!key3);
  145.                          flag_mode=~flag_mode;
  146.                    }
  147.                 }
  148.            if(key4==0)
  149.                 {
  150.                   delay(5);
  151.                   if(key4==0)
  152.                    {
  153.                      while(!key4);
  154.                          i++;
  155.                          TR0=0;
  156.                          if(i==11)
  157.                           i=1;
  158.                    }
  159.                 }
  160. }               

  161. void display_process()
  162. {
  163.   shifen=aa%100/10;
  164.   baifen=aa%10;
  165.   shi=temp%100/10;
  166.   ge=temp%10;
  167.   if(flag_mode==1&&num!=0&&flag_5sec==0)
  168.    {
  169.          shi=time_data2[num]/10;
  170.      ge=time_data2[num]%10;
  171.          shifen=time_data1[num]/10;
  172.          baifen=time_data1[num]%10;
  173.          if(temp-time_data2[num]==2)
  174.            flag_5sec=~flag_5sec;
  175.    }
  176.   if(i!=0)
  177.         {
  178.           shi=time_data2[i]/10;
  179.           ge=time_data2[i]%10;
  180.           shifen=time_data1[i]/10;
  181.           baifen=time_data1[i]%10;
  182.     }
  183. }

  184. void timer0() interrupt 1
  185. {
  186.         TH0=(65536-10000)/256;  //重新赋初值
  187.         TL0=(65536-10000)%256;
  188.         aa++;                   //中断一次变量aa的值加1
  189.         if(aa==100)             //中断100次后,定时时间为100*10ms=1000ms=1s,将变量temp的值加1
  190.         {
  191.           aa=0;
  192.           temp++;
  193.           if(temp==100)       //秒表到达100s后回零
  194.                 temp=0;
  195.         }       
  196. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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