找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3963|回复: 3
收起左侧

51单片机时钟完整资料

[复制链接]
ID:191786 发表于 2017-4-25 17:03 | 显示全部楼层 |阅读模式
51单片机时钟完整资料
0.png

时钟计时器元件清单
  
序号
  
元器件名
元件序号与规格
单位
数量
  
1
  
电阻
R1   R19          1KΩ
2
  
2
  
R2              10KΩ
1
  
3
  
R3~R10           330Ω
8
  
4
  
R11~R18限流电阻       100Ω
8
  
5
  
电容
C1   C2         30pF
2
  
6
  
C3电解电容    10uF
1
  
7
  
三极管
P1~P9      9012
9
  
8
  
晶振
Y1         12MHz
1
  
9
  
按键
S1 K1~K4
5
  
10
  
蜂鸣器
B1
1
  
11
  
数码管
四位一体共阴
2
  
12
  
单片机
STC89C52
1
  
13
  
排针
若干
1
  
14
  
插座
40
1

0.png

单片机源程序:
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. sbit K1=P1^0; //功能键
  5. sbit K2=P1^1; //加1键
  6. sbit K3=P1^2; //减1键
  7. sbit K4=P1^3; //备用
  8. sbit beep=P1^4;// 蜂鸣器输出控制
  9. uchar t,m,f,s;
  10. uchar num;
  11. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
  12. 0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};  //0-F共阴极数码管
  13. /*uchar code table0[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,//共阳极段码
  14. 0x82,0xf8,0x80,0x90};*/
  15. uchar code tablewe[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //控制位选

  16. void delayms(uint z)  //延时z ms
  17. {
  18.         uint x,y;
  19.         for(x=z;x>0;x--)         for(y=110;y>0;y--);
  20. }

  21. void di()          //蜂鸣器响
  22. {         beep=0;        delayms(100);          beep=1;        }

  23. void display(uchar n,uchar c,uchar d) //分离变量
  24. {
  25.         uchar a,b;
  26.         a=n/10;        //十位
  27.         b=n%10;        //个位

  28.         P0=table[a];         P2=tablewe[c];        delayms(2);        //十位显示
  29.         P0=table[b];         P2=tablewe[d];         delayms(2); //个位显示
  30. }
  31. void init()
  32. {        t=0; m=0;         f=0;           s=0;
  33.         
  34.         TMOD=0X01; //定时器T0工作于方式1
  35.         TH0=(65536-50000)/256;        //晶振为12MHZ
  36.         TL0=(65536-50000)%256;         //定时时间为50ms
  37.         EA=1;         //开中断
  38.         ET0=1;         //开T0中断
  39.         TR0=1;         //启动T0
  40.         }
  41. void key()                  //按键扫描
  42. {
  43.         if(K1==0)        //功能键
  44.         {         
  45.                 delayms(10); //延时消抖
  46.                 if(K1==0)         //再判
  47.                 {        di();         //调蜂鸣器响
  48.                         num++;         //功能键按下次数加1
  49.                         while(!K1);//等待功能键释放
  50.                         if(num==1)TR0=0; //关闭T0,进入调时模式
  51.                         if(num==4)
  52.                         {
  53.                                 num=0;         TR0=1;        //启动T0
  54.                         }
  55.                 }
  56.         }
  57.         if(K2==0)                 //加1键
  58.         {
  59.                 delayms(10);//延时消抖
  60.                 if(K2==0)
  61.                 {        di();    //调蜂鸣器响
  62.                         while(!K2);        //等待加1键释放
  63.                         if(num==1){        m++; if(m==60)m=0;         display(m,6,7);        } //秒加1,显示秒
  64.                         if(num==2){        f++; if(f==60)f=0;        display(f,3,4);        } //分加1,显示分
  65.                         if(num==3){        s++; if(s==24)s=0;         display(s,0,1);        } //时加1,显示时
  66.                 }
  67.         }
  68.         if(K3==0)         //加1键
  69.         {
  70.                 delayms(10);
  71.                 if(K3==0)
  72.                 {        di();  //调蜂鸣器响
  73.                         while(!K3);        //等待减1键释放
  74.                         if(num==1){        m--;if(m==-1)m=59;display(m,6,7);} //秒减1,显示秒
  75.                         if(num==2){        f--;if(f==-1)f=59;display(f,3,4);} //分减1,显示分
  76.                         if(num==3){        s--;if(s==-1)s=23;display(s,0,1);} //时减1,显示时
  77.                 }
  78.         }
  79. }

  80. void main()
  81. {        
  82.         init();//初始化        
  83.         while(1)
  84.         {        
  85.                 key();           //调键扫描                  
  86.                 P0=0x40;  //显示-        
  87.                 P2=0xdb;
  88.         
  89.                 delayms(2);        //延时
  90.                 display(s,0,1);        //秒显示
  91.                 display(f,3,4);        //分显示
  92.                 display(m,6,7);        //时显示
  93.         }
  94. }

  95. void T0_time() interrupt 1
  96. {
  97.         TH0=(65536-50000)/256; //重赋初值
  98.         TL0=(65536-50000)%256;
  99.         t++;                                   //中断次数加1
  100.         if(t==20)                           //到1秒
  101.         {
  102.                 t=0;                           //计数清0
  103.                 m++;                           //秒加1
  104.                

  105. …………限于本文篇幅 余下代码请从51电子黑下载附件…………
复制代码

下载:
源程序.zip (21.97 KB, 下载次数: 52)
回复

使用道具 举报

ID:586915 发表于 2021-12-1 13:04 | 显示全部楼层
用什么软件仿真
回复

使用道具 举报

ID:1046492 发表于 2022-10-2 21:34 来自手机 | 显示全部楼层
lsx116 发表于 2021-12-1 13:04
用什么软件仿真

protues
回复

使用道具 举报

ID:190577 发表于 2022-10-4 21:14 | 显示全部楼层
lsx116 发表于 2021-12-1 13:04
用什么软件仿真

proteus仿真软件
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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