找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机电子钟,有没有人可以提供下思路呀

[复制链接]
回帖奖励 16 黑币 回复本帖可获得 2 黑币奖励! 每人限 2 次
跳转到指定楼层
楼主
ID:565961 发表于 2020-6-9 21:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题目是要求电子钟设置一个开机控制显示按键、一个时/分切换按键、一个加 1 按键,每到整点蜂鸣器鸣响,用 6 位一体数码管显示时、分、秒,开机显示 12:00:00。给定单片机频率为 11.0592MHz。设计硬件电路图并在 Protel 上绘制原理图和 PCB 图,在 Keil 中编写代码并在 Proteus 上做出仿真。
基础很差,临时学有点大海捞针的感觉,求好心人指导一下涉及了哪些知识点哇,我去康康,复习复习
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:774455 发表于 2020-6-9 22:52 | 只看该作者

  1. #include <reg51.h>
  2. #include <intrins.h>

  3. unsigned char data dis_digit;
  4. unsigned char key_s, key_v;

  5. unsigned char code dis_code[11]={0x3f,0x06,0x5b,0x4f,
  6.                                 0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x00};
  7. unsigned char data dis_buf[6];
  8. unsigned char data dis_index;
  9. unsigned char hour,min,sec;
  10. unsigned char sec100;

  11. sbit        K1 = P1^4;
  12. sbit        K2 = P1^5;

  13. bit scan_key();
  14. void proc_key();
  15. void inc_sec();
  16. void inc_min();
  17. void inc_hour();
  18. void display();
  19. void delayms(unsigned char ms);

  20. void main(void)
  21. {
  22.         P0 = 0x00;
  23.         P2 = 0x00;
  24.         TMOD = 0x11;                // 定时器0, 1工作模式1, 16位定时方式
  25.         TH1 = 0xdc;
  26.         TL1 = 0;

  27.         TH0 = 0xFC;
  28.         TL0 = 0x17;
  29.        
  30.         hour = 12;
  31.         min = 00;

  32.         sec = 00;
  33.         sec100 = 0;
  34.        
  35.         dis_buf[0] = dis_code[hour / 10];                // 时十位
  36.         dis_buf[1] = dis_code[hour % 10];                // 时个位
  37.         dis_buf[2] = dis_code[min / 10];                // 分十位
  38.         dis_buf[3] = dis_code[min % 10];                // 分个位
  39.         dis_buf[4] = dis_code[sec / 10];                // 秒十位
  40.         dis_buf[5] = dis_code[sec % 10];                // 秒个位
  41.                        
  42.         dis_digit = 0xfe;
  43.         dis_index = 0;
  44.        
  45.         TCON = 0x01;
  46.         IE = 0x8a;                                // 使能timer0,1 中断
  47.        
  48.         TR0 = 1;
  49.         TR1 = 1;

  50.         key_v = 0x03;

  51.         while(1)
  52.         {
  53.                 if(scan_key())
  54.                 {
  55.                         delayms(10);
  56.                         if(scan_key())
  57.                         {
  58.                                 key_v = key_s;
  59.                                 proc_key();
  60.                         }
  61.                 }
  62.                
  63.         }
  64. }

  65. bit scan_key()
  66. {
  67.         key_s = 0x00;
  68.         key_s |= K2;
  69.         key_s <<= 1;
  70.         key_s |= K1;
  71.         return(key_s ^ key_v);       

  72. }

  73. void proc_key()
  74. {
  75.         EA = 0;
  76.         if((key_v & 0x01) == 0)                // K1
  77.         {
  78.                 inc_hour();
  79.         }
  80.         else if((key_v & 0x02) == 0)        // K2
  81.         {
  82.                 min++;
  83.                 if(min > 59)
  84.                 {
  85.                         min = 0;
  86.                 }
  87.                 dis_buf[2] = dis_code[min / 10];                // 分十位
  88.                 dis_buf[3] = dis_code[min % 10];                // 分个位
  89.         }

  90.         EA = 1;
  91. }

  92. void timer0() interrupt 1
  93. // 定时器0中断服务程序, 用于数码管的动态扫描
  94. // dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
  95. // dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
  96. //                                选通P2.0口数码管
  97. // dis_buf   --- 显于缓冲区基地址       
  98. {
  99.         TH0 = 0xFC;
  100.         TL0 = 0x17;
  101.        

  102.         P0 = dis_buf[dis_index];                        // 显示代码传送到P0口
  103.         P2 = dis_digit;                                                //

  104.         dis_digit = _crol_(dis_digit,1);        // 位选通值左移, 下次中断时选通下一位数码管
  105.         dis_index++;                                                //
  106.         if(dis_index == 0x06)                // 6个数码管全部扫描完一遍之后,再回到第一个开始
  107.         {                           // 扫描
  108.                 dis_index = 0;


  109.                 dis_digit = 0xfe;
  110.         }
  111. }

  112. void timer1() interrupt 3
  113. {
  114.         TH1 = 0xdc;
  115.        
  116.         sec100++;
  117.        
  118.         if(sec100 >= 100)
  119.         {
  120.                 sec100 = 0;
  121.                 inc_sec();
  122.         }
  123. }

  124. void inc_sec()
  125. {
  126.         sec++;
  127.         if(sec > 59)
  128.         {
  129.                 sec = 0;
  130.                 inc_min();
  131.         }
  132.         dis_buf[4] = dis_code[sec / 10];                // 秒十位
  133.         dis_buf[5] = dis_code[sec % 10];                // 秒个位       
  134. }

  135. void inc_min()
  136. {
  137.         min++;
  138.         if(min > 59)
  139.         {
  140.                 min = 0;
  141.                 inc_hour();
  142.         }
  143.         dis_buf[2] = dis_code[min / 10];                // 分十位
  144.         dis_buf[3] = dis_code[min % 10];                // 分个位
  145. }

  146. void inc_hour()

  147. {
  148.         hour++;
  149.         if(hour > 23)
  150.         {
  151.                 hour = 0;
  152.         }
  153.         if(hour > 9)
  154.                 dis_buf[0] = dis_code[hour / 10];                // 时十位
  155.         else
  156.                                                                      
  157.                 dis_buf[0] = 0x00;                                        // 当小时的十位为0时不显示
  158.         dis_buf[1] = dis_code[hour % 10];                // 时个位

  159. }


  160. void delayms(unsigned char ms)       
  161. // 延时子程序
  162. {                                               
  163.         unsigned char i;
  164.         while(ms--)
  165.         {
  166.                 for(i = 0; i < 120; i++);
  167.         }
  168. }
复制代码
回复

使用道具 举报

板凳
ID:774455 发表于 2020-6-9 22:52 | 只看该作者
我的简易数字钟的源代码 希望能帮到你。
回复

使用道具 举报

地板
ID:732506 发表于 2020-6-10 05:58 | 只看该作者
看下这个,很像改改就可以了。 http://www.51hei.com/bbs/dpj-186609-1.html
回复

使用道具 举报

5#
ID:584814 发表于 2020-6-10 08:04 | 只看该作者
不想动脑上淘宝呀
回复

使用道具 举报

6#
ID:774629 发表于 2020-6-10 08:49 | 只看该作者
原来有人和我一样无助
回复

使用道具 举报

7#
ID:774709 发表于 2020-6-10 10:45 | 只看该作者
可以在网上找找资料再配合B站视频
回复

使用道具 举报

8#
ID:565961 发表于 2020-6-10 17:32 | 只看该作者
fatetl 发表于 2020-6-9 22:52
我的简易数字钟的源代码 希望能帮到你。

好哒,谢谢我会参考哒
回复

使用道具 举报

9#
ID:565961 发表于 2020-6-10 17:34 | 只看该作者
黑衣天王J 发表于 2020-6-10 10:45
可以在网上找找资料再配合B站视频

好哒,谢谢
回复

使用道具 举报

10#
ID:782358 发表于 2020-6-17 18:24 | 只看该作者
时钟的走时涉及定时器
回复

使用道具 举报

11#
ID:633896 发表于 2020-7-7 12:00 | 只看该作者
这是我的一个时钟。 你可以拿去参考参考。

20172308魏海龙.zip

81.09 KB, 下载次数: 12

回复

使用道具 举报

12#
ID:633896 发表于 2020-7-7 12:02 | 只看该作者
我上传了 信息 看到了木有
回复

使用道具 举报

13#
ID:633896 发表于 2020-7-7 12:02 | 只看该作者
内存太大了

20172308魏海龙.zip

81.09 KB, 下载次数: 5

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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