找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机电子时钟设计 PPT等资料下载

[复制链接]
跳转到指定楼层
楼主
ppt文件:

以上所有资料打包下载:
LCD1602时钟设计资料.rar (5.08 MB, 下载次数: 19)















总体设计要求和技术要点
1              使用LCD显示器(1602)来显示现在的时间。
              显示格式为“时时:分分:秒秒”。
2、 利用4*4键盘设置时间。
3、              两个功能切换键CHANGE--MOVE,功能如下:
a              按下操作键CHANGE:进入设置时间界面;时间设置完毕,释放此键进入实时时间显示界面。
b              操作键MOVE:每按下一次改动位后移一位。






正文:
电子时钟设计


?  单片微型计算机(Single-Chip Microcomputer)简称单片机,是典型的嵌入式微控制器(Embedded Microcontrollers),它最早是被用在工业控制领域。它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。而51系列单片机是各单片机中最为典型和最有代表性的一种,通过本次设计进一步对单片机学习和应用,从而更熟悉单片机的原理和相关设计并提高了开发软、硬件的能力。本设计主要设计一个基于80C51单片机的电子时钟,并在LCD上显示相应的时间,通过两个控制键和4×4键盘来实现时间的调节功能。应用Proteus软件实现单片机电子时钟系统的设计与仿真。
关键词:单片机 微控制器 设计 电子时钟

目 录
一、电子时钟的工作原理……………………………………………………
1.计时原理……………………………………………………………………
2.调时原理……………………………………………………………………
3.显示原理……………………………………………………………………
二、电子时钟的功能实现……………………………………………………
1.Proteus仿真电路图………………………………………………………
2.元器件清单…………………………………………………………………
3.程序框图……………………………………………………………………
3.源程序………………………………………………………………………
三、使用说明…………………………………………………………………
四、心得与体会………………………………………………………………
五、主要参考文献、资料……………………………………………………

一、电子时钟的工作原理
  • 计时原理
通过单片机内部硬件电路提供时基(time base),再由软件来实现对基时的调控得到时、分、秒的数值。
[/url]
                            时基电路


2.调时原理
     合上开关CHANGE程序进入外部中断1,即调时函数。此时键盘函数开始扫描矩阵键盘,当检测到哪一个位被按下时,程序根据m值(即显示的那一位)在指定的位置输入数据(时、分、秒),即可实现调时功能。





3.显示原理
   通过定时器 /计数器0来计时,再通过lcd1602来显示时间。时间的精确度与单片机的晶振密切相关。








二、电子时钟的功能实现

1.Proteus仿真电路图:



  2.元器件清单
      元件名称
          数量(个)
单片机AT89C52
1
LCD1602
1
排电阻
1
按钮
18
电阻
6

3.程序框图










程序:
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. #define LCD P0
  5. sbit rs=P2^0;
  6. sbit rw=P2^1;
  7. sbit E=P2^2;
  8. sbit Move=P3^2;
  9. sbit Change=P3^3;
  10. int m=0;
  11. unsigned char i;
  12. int counter=0;
  13. int hour,min,sed;
  14. int  hour_1, hour_0, min_1,min_0, sed_1, sed_0;
  15. void delay(int ms)//延时函数
  16. {
  17.         int i,j;
  18.         for(i=0;i<ms;i++)
  19.                 for(j=0;j<110;j++);
  20. }
  21. write_com(uchar com)//写指令
  22. {
  23.   rs=0;
  24.   rw=0;
  25.   E=1;
  26.   LCD=com;
  27.   delay(5);
  28.   E=0;

  29. }
  30. write_data(uchar dat)//写数据
  31. {
  32.   rs=1;
  33.   rw=0;
  34.   E=1;
  35.   LCD=dat;
  36.   delay(5);
  37.   E=0;

  38. }
  39. init_lcd()//1602初始化函数
  40. {
  41.   write_com(0x38);
  42.   write_com(0x08);
  43.   write_com(0x01);
  44.   write_com(0x06);
  45.   write_com(0x0c);
  46. }
  47. void intime_0()//定时函数初始化
  48. {
  49.         TMOD=0x01;
  50.         TL0=0xb0;
  51.         TH0=0x3c;
  52.         TR0=1;
  53.         ET0=1;
  54.         EA=1;
  55. }
  56. void timer0()interrupt  1 using 0//定时函数
  57. {
  58.         TL0=0xb0;
  59.         TH0=0x3c;
  60.         counter++;
  61.         if(counter==20)
  62.         {
  63.                 counter=0;
  64.                 sed_0++;
  65.                    if(sed_0==10)
  66.               {
  67.                     sed_0=0;
  68.                 sed_1++;
  69.                    if(sed_1==6)
  70.                       {
  71.                                     sed_1=0;
  72.                                 min_0++;
  73.                            if(min_0==10)
  74.                          {
  75.                                                         min_0=0;
  76.                                                         min_1++;
  77.                                                                 if(min_1==6)
  78.                                                                         {
  79.                                                                                 min_1=0;
  80.                                                                                 hour_0++;
  81.                                                                                 if((hour_0==4)&&(hour_1==2))
  82.                                                                                         {
  83.                                                                                                    hour_0=0;
  84.                                                                                                 hour_1=0;
  85.                                                                                         }
  86.                                                                                 else if(hour_0==10)
  87.                                                                                         {
  88.                                                                                           hour_0=0;
  89.                                                                                           hour_1++;
  90.                                                                                                 if(hour_1==2)
  91.                                                                                                         {hour_1=0;}
  92.                                                                                    }
  93.                                                                         }
  94.                                                 }
  95.                 }     
  96.          }
  97.      }         
  98. }
  99. void inch()//调时函数初始化
  100. {
  101.         Change=1;
  102.         EA=1;
  103.         EX1=1;
  104.         IT1=0;
  105. }
  106. void display_1()//显示函数1
  107. {
  108.         int k;
  109.         char code str[]="Input time";
  110.         for(k=0;k<10;k++)
  111.                    {
  112.                             write_com(0x80+3+k);
  113.                          write_data(str[k]);
  114.                    }

  115. }
  116. void         scan()//键盘扫描函数
  117. {
  118.         unsigned char j;
  119.         P1=0xf0;delay(20);
  120.         i=P1;
  121.         i&=0x0f;
  122.         j=i;
  123.         P1=0x0f;delay(20);
  124.         i=P1;i&=0xf0;i|=j;        
  125. }
  126. void change()interrupt 2  //调时函数
  127. {
  128.         
  129.         display_1();
  130.         scan();
  131.         switch(i)
  132.         {
  133.                 case 0x11:switch(m)
  134.                                         {
  135.                                                 case 0:hour_1=0;write_com(0x80+0x40+0x07);write_data(hour_1+0x30);break;
  136.                                                 case 1:hour_0=0;write_com(0x80+0x40+0x08);write_data(hour_0+0x30);break;
  137.                                                 case 2:min_1=0;write_com(0x80+0x40+0x0a);write_data(min_1+0x30);break;
  138.                                                 case 3:min_0=0;write_com(0x80+0x40+0x0b);write_data(min_0+0x30);break;
  139.                                                 case 4:sed_1=0;write_com(0x80+0x40+0x0d);write_data(sed_1+0x30);break;
  140.                                                 case 5:sed_0=0;write_com(0x80+0x40+0x0e);write_data(sed_0+0x30);break;
  141.                                                 default:break;

  142.                                         }
  143.                         break;
  144.                 case 0x21:switch(m)
  145.                                         {
  146.                                                 case 0:hour_1=1;write_com(0x80+0x40+0x07);write_data(hour_1+0x30);break;
  147.                                                 case 1:hour_0=1;write_com(0x80+0x40+0x08);write_data(hour_0+0x30);break;
  148.                                                 case 2:min_1=1;write_com(0x80+0x40+0x0a);write_data(min_1+0x30);break;
  149.                                                 case 3:min_0=1;write_com(0x80+0x40+0x0b);write_data(min_0+0x30);break;
  150.                                                 case 4:sed_1=1;write_com(0x80+0x40+0x0d);write_data(sed_1+0x30);break;
  151.                                                 case 5:sed_0=1;write_com(0x80+0x40+0x0e);write_data(sed_0+0x30);break;
  152.                                                 default:break;

  153.                                         }
  154.                         break;
  155.                 case 0x41:switch(m)
  156.                                         {
  157.                                                 case 0:hour_1=2;write_com(0x80+0x40+0x07);write_data(hour_1+0x30);break;
  158.                                                 case 1:hour_0=2;write_com(0x80+0x40+0x08);write_data(hour_0+0x30);break;
  159.                                                 case 2:min_1=2;write_com(0x80+0x40+0x0a);write_data(min_1+0x30);break;
  160.                                                 case 3:min_0=2;write_com(0x80+0x40+0x0b);write_data(min_0+0x30);break;
  161.                                                 case 4:sed_1=2;write_com(0x80+0x40+0x0d);write_data(sed_1+0x30);break;
  162.                                                 case 5:sed_0=2;write_com(0x80+0x40+0x0e);write_data(sed_0+0x30);break;
  163.                                                 default:break;

  164.                                         }
  165.                         break;
  166.                 case 0x81:switch(m)
  167.                                         {
  168.                                                 case 0:write_com(0x80+0x40+0x07);write_data(hour_1+0x30);break;
  169.                                                 case 1:hour_0=3;write_com(0x80+0x40+0x08);write_data(hour_0+0x30);break;
  170.                                                 case 2:min_1=3;write_com(0x80+0x40+0x0a);write_data(min_1+0x30);break;
  171.                                                 case 3:min_0=3;write_com(0x80+0x40+0x0b);write_data(min_0+0x30);break;
  172.                                                 case 4:sed_1=3;write_com(0x80+0x40+0x0d);write_data(sed_1+0x30);break;
  173.                                                 case 5:sed_0=3;write_com(0x80+0x40+0x0e);write_data(sed_0+0x30);break;
  174.                                                 default:break;

  175.                                         }
  176.                         break;
  177.                 case 0x12:switch(m)
  178.                                         {
  179.                                                 case 0:write_com(0x80+0x40+0x07);write_data(hour_1+0x30);break;
  180.                                                 case 1:hour_0=4;write_com(0x80+0x40+0x08);write_data(hour_0+0x30);break;
  181.                                                 case 2:min_1=4;write_com(0x80+0x40+0x0a);write_data(min_1+0x30);break;
  182.                                                 case 3:min_0=4;write_com(0x80+0x40+0x0b);write_data(min_0+0x30);break;
  183.                                                 case 4:sed_1=4;write_com(0x80+0x40+0x0d);write_data(sed_1+0x30);break;
  184.                                                 case 5:sed_0=4;write_com(0x80+0x40+0x0e);write_data(sed_0+0x30);break;
  185.                                                 default:break;

  186.                                         }
  187.                         break;
  188.                 case 0x22:switch(m)
  189.                                         {
  190.                                                 case 0:write_com(0x80+0x40+0x07);write_data(hour_1+0x30);break;
  191.                                                 case 1:hour_0=5;write_com(0x80+0x40+0x08);write_data(hour_0+0x30);break;
  192.                                                 case 2:min_1=5;write_com(0x80+0x40+0x0a);write_data(min_1+0x30);break;
  193.                                                 case 3:min_0=5;write_com(0x80+0x40+0x0b);write_data(min_0+0x30);break;
  194.                                                 case 4:sed_1=5;write_com(0x80+0x40+0x0d);write_data(sed_1+0x30);break;
  195.                                                 case 5:sed_0=5;write_com(0x80+0x40+0x0e);write_data(sed_0+0x30);break;
  196.                                                 default:break;

  197.                                         }
  198.                         break;
  199.                 case 0x42:switch(m)
  200.                                 {
  201.                                                 case 0:write_com(0x80+0x40+0x07);write_data(hour_1+0x30);break;
  202.                                                 case 1:hour_0=6;write_com(0x80+0x40+0x08);write_data(hour_0+0x30);break;
  203.                                                 case 2:write_com(0x80+0x40+0x0a);write_data(min_1+0x30);break;
  204.                                                 case 3:min_0=6;write_com(0x80+0x40+0x0b);write_data(min_0+0x30);break;
  205.                                                 case 4:write_com(0x80+0x40+0x0d);write_data(sed_1+0x30);break;
  206.                                                 case 5:sed_0=6;write_com(0x80+0x40+0x0e);write_data(sed_0+0x30);break;
  207.                                                 default:break;

  208.                                         }
  209.                         break;
  210.                 case 0x82:switch(m)
  211.                                         {
  212.                                                 case 0:write_com(0x80+0x40+0x07);write_data(hour_1+0x30);break;
  213.                                                 case 1:hour_0=7;write_com(0x80+0x40+0x08);write_data(hour_0+0x30);break;
  214.                                                 case 2:write_com(0x80+0x40+0x0a);write_data(min_1+0x30);break;
  215.                                                 case 3:min_0=7;write_com(0x80+0x40+0x0b);write_data(min_0+0x30);break;
  216.                                                 case 4:write_com(0x80+0x40+0x0d);write_data(sed_1+0x30);break;
  217.                                                 case 5:sed_0=7;write_com(0x80+0x40+0x0e);write_data(sed_0+0x30);break;
  218.                                                 default:break;

  219.                                         }
  220.                         break;
  221.                 case 0x14:switch(m)
  222.                                                 {
  223.                                                 case 0:write_com(0x80+0x40+0x07);write_data(hour_1+0x30);break;
  224.                                                 case 1:hour_0=8;write_com(0x80+0x40+0x08);write_data(hour_0+0x30);break;
  225.                                                 case 2:write_com(0x80+0x40+0x0a);write_data(min_1+0x30);break;
  226.                                                 case 3:min_0=8;write_com(0x80+0x40+0x0b);write_data(min_0+0x30);break;
  227.                                                 case 4:write_com(0x80+0x40+0x0d);write_data(sed_1+0x30);break;
  228.                                                 case 5:sed_0=8;write_com(0x80+0x40+0x0e);write_data(sed_0+0x30);break;
  229.                                                 default:break;

  230.                                         }
  231.                         break;
  232.                 case 0x24:switch(m)
  233.                                         {
  234.                                                 case 0:write_com(0x80+0x40+0x07);write_data(hour_1+0x30);break;
  235.                                                 case 1:hour_0=9;write_com(0x80+0x40+0x08);write_data(hour_0+0x30);break;
  236.                                                 case 2:write_com(0x80+0x40+0x0a);write_data(min_1+0x30);break;
  237.                                                 case 3:min_0=9;write_com(0x80+0x40+0x0b);write_data(min_0+0x30);break;
  238.                                                 case 4:write_com(0x80+0x40+0x0d);write_data(sed_1+0x30);break;
  239.                                                 case 5:sed_0=9;write_com(0x80+0x40+0x0e);write_data(sed_0+0x30);break;
  240.                                                 default:break;

  241.                                         }
  242.                         break;
  243.                
  244.                 default:break;
  245.         }
  246.         Change=1;
  247. }
  248. void inmove()//位选函数初始化
  249. {
  250.         Move=1;
  251.         EA=1;
  252.         EX0=1;
  253.         IT0=0;
  254. }
  255. void move()interrupt 0//位选函数
  256. {
  257.         if(Move==0)
  258.         {
  259.                 delay(1000);
  260.                 m++;
  261.         }
  262.                 if(m>5)
  263.                  m=0;
  264.         Move=1;
  265. }
  266. void display_0()//显示函数0
  267. {               

  268.                         write_com(0x80+0x40+0x07);
  269.                         write_data(hour_1+0x30);
  270.                         write_com(0x80+0x40+0x08);
  271.                         write_data(hour_0+0x30);        
  272.                         write_com(0x80+0x40+0x09);
  273.                         write_data(':');        
  274.                         write_com(0x80+0x40+0x0a);
  275.                         write_data(min_1+0x30);
  276.                         write_com(0x80+0x40+0x0b);
  277.                         write_data(min_0+0x30);        
  278.                         write_com(0x80+0x40+0x0c);
  279.                         write_data(':');        
  280.                         write_com(0x80+0x40+0x0d);
  281.                         write_data(sed_1+0x30);
  282.                         write_com(0x80+0x40+0x0e);
  283.                         write_data(sed_0+0x30);

  284. }
  285. void display_2()//显示函数2
  286. {
  287.         int k;
  288.         char code str[]="            ";
  289.         for(k=0;k<12;k++)
  290.                    {
  291.                             write_com(0x80+3+k);
  292.                          write_data(str[k]);
  293.                    }

  294. }
  295. void main()//主函数
  296. {         
  297.         
  298.          IP=0X01;
  299.      init_lcd();
  300.          intime_0();//ding shi zhong duan kai qi
  301.          inmove();//yi wei zhong duan kai qi
  302.          inch();//tiao shi zhong duan kai qi
  303.          while(1)
  304.          {
  305.                          display_0();display_2();delay(500);
  306.         }
  307. }
复制代码

三、使用说明
正常显示:断开开关MOVE,CHANGE运行程序即可显示正常工作状态。
调时状态:合上开关(注释:一直合上),进入调时界面,通过MOVE键(注释:按下后必须返回)选择要调整的时间位,选中后通过矩阵键盘输入数据即可。调整过后打开CHANGE开关即可进入正常工作界面。

四、心得与体会:
由于课本上的知识太多,平时课间的学习并不能很好的理解和运用各个元件的功能,所以在这次设计过程中,我了解了很多元件的功能,并且对于其在电路中的使用有了更多的认识。有一点是在设计过程中,经常会遇到这样那样的情况,就是心里想老着这样的接法可以行得通,但实际接上电路,总是实现不了,而又一下找不出问题所在,只有在查了书上有关这方面的解释后才有所进展,因此耗费在这上面的时间很多。总体感觉是:通过这次设计,加强了我们动手、思考和解决问题的能力。

五、主要参考文献、资料:
[1]郭天祥: 新概念C51单片机C语言教程---入门、提高、开发、拓展全攻略
电子工业出版社
[2]林小荼:C语言程序设计(第二版) 中国铁道出版社
[3]李全利 迟荣强:单片机以及及接口技术高等教育出版社

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

使用道具 举报

沙发
ID:156422 发表于 2016-12-21 00:23 | 只看该作者
看哈,参考
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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