找回密码
 立即注册

QQ登录

只需一步,快速开始

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

带LCD显示的定时闹钟设计报告 带PCB 原理图 源程序

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


设计报告,pcb,源码等所有资料打包下载:
带LCD显示的定时闹钟.zip (1.08 MB, 下载次数: 133)



------------------------------------------------------------------------




.系统调试过程

通过上面的硬件设计和软件设计过程,设计的工作已经基本完成,接下来的工作就是对所设计好的应用系统进行调试。通过调试可以检查出系统出现的一些错误,从而进行下一步的修改。

(1)在Protel 99 SE中,对硬件电路图进行ERC电气规则检查。

图 5-1  protel原理图

图5-2  ERC电气规则检查结果

                                  图5-3 PCB图

(2)程序调试

程序经过调试显示“0错误,0警告”。表示程序调试通过。

图5-3  程序调试通过示意图

(3)protues调试

图5-4 protues仿真图

结 论

单片机是一门应用性很强的学科,课程设计是培养我们综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对我们实际工作能力的具体训练和考察过程。虽然在做课程设计以前已经系统的把单片机课本认真的学习了一下,但是在刚拿到设计任务书时还是有点一头雾水,不知道该从哪里下手。令人欣慰的是经过一周的学习,虽然过程很艰辛,但是总算实现了定时闹钟的功能,所有的努力都很值得。这一周的大部分时间都在研究程序怎么处理,在这个过程中加深了我对汇编语言命令的应用,而且也更加了解到软硬件配套的重要性。

通过这次课程设计,使我们对这们功课有了更深刻的认识和了解。首先对于硬件电路的工作原理有了进一步系统的学习,同样就有了进一步的认识,使我懂得了理论与实际相结合的重要性,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,才能提高自己的实际动手能力和独立思考的能力。其次软件在这次设计中也有不足之处,比如音乐的响声不连续,但又不知道从哪个地方入手解决这个问题,这要求在以后的学习中,拓宽自己的知识面,解决设计的不足之处。

总之,通过这次课程设计不仅使我巩固了本课程所学的基本知识,还使我们具有了撰写科研报告的初步训练能力,我相信这些能力在我们以后的工作或者是再学习中一定会起到不小的作用,一切的辛苦和艰难都是值得的。

致 谢

在陈飞老师的指导下,我完成了本次设计。本设计从选题到完成,都得到了陈老师细心的指导。另外,本设计的完成也离不开其他老师和各位同学给我的建议和帮助,是他们让我明白了团队合作的精神。当然,这之中也有我自己的努力。这次课程设计最令我高兴的是:遇到困难,翻阅书本解决困难的同时巩固了已学知识,也学到了新知识。在此,我谨向陈飞老师和帮助过我的老师和同学们,表示崇高的敬意和衷心的感谢!


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

  4. uint miao,fen,fen1,shi,shi1,flag1,flag2,flag3,aa,K1num,K2num,K3num,K4num,N;        //K1num-K1按键被按下的标记变量,K2num-K2按键被按下的标记变量,K3num=0-K3按键被按下的标记变量
  5. uchar code table[]="  TIMING CLOCK";        //定义初始上电时液晶默认显示状态
  6.         
  7. sbit K1=P1^0;        //四个按键
  8. sbit K2=P1^1;
  9. sbit K3=P1^2;
  10. sbit K4=P1^3;
  11. sbit rs=P2^0;
  12. sbit lcden=P2^2;
  13. sbit led=P2^3;        //发光二极管控制端
  14. sbit beep=P2^4;   //蜂鸣器控制端
  15. sbit relay=P2^5;                //继电器控制端
  16. void delay(uint z)        //延时函数
  17. {
  18.         uint x,y;
  19.         for(x=z;x>0;x--)
  20.                 for(y=110;y>0;y--);
  21. }

  22. void write_com(uchar com)        //液晶写命令函数
  23. {
  24.         rs=0;
  25.         lcden=0;
  26.         P0=com;
  27.         delay(5);
  28.         lcden=1;
  29.         delay(5);
  30.         lcden=0;        
  31. }

  32. void write_date(uchar date)                //液晶写数据函数
  33. {
  34.         rs=1;
  35.         lcden=0;
  36.         P0=date;
  37.         delay(5);
  38.         lcden=1;
  39.         delay(5);
  40.         lcden=0;        
  41. }

  42. void write_sfm(uchar add,uchar date)        //液晶写时分秒函数
  43. {
  44.         uchar shi,ge;
  45.         shi=date/10;
  46.         ge=date%10;
  47.         write_com(0x80+0x40+add);
  48.         write_date(0x30+shi);
  49.         write_date(0x30+ge);
  50. }

  51. void init()                //初始化函数
  52. {        
  53.         uint num;        //写液晶的循环控制变量
  54.         aa=0;                //中断次数标志
  55.         K1num=0;        //K1按键被按下的标记变量
  56.         K2num=0;        //K2按键被按下的标记变量
  57.         K3num=0;        //K3按键被按下的标记变量
  58.         K4num=0;
  59.         flag1=1;        //控制lcd屏刷新的变量
  60.         flag2=1;        //控制闹钟响闹和继电器开启关闭的标记
  61.         flag3=1;        //控制闹钟响起时,按下K4停止闹钟响闹的标记
  62.         led=1;           //发光二极管初始化
  63.         relay=0;        //继电器初始化
  64.         N=100;                //系统启动时,闹钟时间到发出的声音为连续三次发出“哗”的一声
  65.         miao=0;                //系统初始化时间
  66.         fen=0;
  67.         shi=0;
  68.         fen1=1;                //初始化闹钟的时间
  69.         shi1=0;
  70.         beep=0;                //蜂鸣器初始化
  71.         lcden=0;        //液晶使能端初始化
  72.         write_com(0x38);        //1602液晶初始化,设置16*2显示。5*7点阵,8位数据接口
  73.         write_com(0x0c);        //设置开显示,不显示光标        
  74.         write_com(0x06);        //写一个字符后地址指针自动加1
  75.         write_com(0x01);        //显示清0,数据指针清0
  76.         write_com(0x80);        //将数据指针定位到第一行,第一个字处
  77.         for(num=0;num<15;num++)                //显示闹钟标示:TIMING CLOCK
  78.         {
  79.                         write_date(table[num]);
  80.                         delay(10);
  81.         }
  82.         write_com(0x80+0x40+7);//写出时间显示部分的两个冒号
  83.         write_date(':');

  84.         write_sfm(8,fen);        //送去液晶显示秒,分,时
  85.         write_sfm(5,shi);
  86.         TMOD=0x01;        //设置定时器0为工作方式1
  87.         TH0=(65536-50000)/256;                //定时器装初值
  88.         TL0=(65536-50000)%256;
  89.         EA=1;        //开总中断
  90.         ET0=1;        //开定时器0中断
  91.         TR0=1;        //启动定时器0

  92. }

  93. void keyscan()                //键盘扫描函数
  94. {        
  95.         if(K1==0&&K3num==0)                //判断K1按下,按下前没有按下K3键,则开始修改时间
  96.         {
  97.                 delay(5);
  98.                 if(K1==0&&K1num==0)
  99.                 {        
  100.                         
  101.                         K1num=1;        
  102.                         while(!K1)                //判断是否松开按键,后同
  103.                         if(K1num==1)
  104.                         {
  105.                                 TR0=0;                //关闭计数器0
  106.                                 write_com(0x80+0x40+9);                //第一次按下光标定位到分钟位置
  107.                                 write_com(0x0f);         //光标开始闪烁               
  108.                         }
  109.                 }
  110.         }


  111.         if(K3==0&&K3num==0&&K1num==0)                //判断K3首次被按下,则设置闹钟
  112.         {
  113.                 delay(5);        //延时消抖,后同
  114.                 if(K3==0)
  115.                 {        
  116.                         flag1=0;
  117.                         write_com(0x80+0x40+9);                //第一次按下光标定位到分钟位置
  118.                         while(!K3);
  119.                         K3num=1;
  120.                         write_sfm(8,fen1);        //送去液晶显示定时的分,时
  121.                         write_sfm(5,shi1);
  122.                         write_com(0x0f);        //光标开始闪烁
  123.                         write_com(0x80+0x40+9);        //显示位置回到调节处
  124.                 }
  125.         }

  126.         if(K1==0&&K1num==1)                //判断K1按下,修改系统时间的小时
  127.         {
  128.                 delay(5);
  129.                 if(K1==0)
  130.                 {        
  131.                         write_com(0x80+0x40+6);        //光标定位到小时位置
  132.                         K1num=1;        //置K1num=1
  133.                         while(!K1);
  134.                         shi++;         //则调整时加1
  135.                         if(shi==24) shi=0;        //若满24后将清零
  136.                         write_sfm(5,shi);        //每调节一次送液晶显示一下
  137.                         write_com(0x80+0x40+6);        //显示位置重新回到调节处
  138.                 }
  139.                
  140.         }               
  141.         
  142.         
  143.         if(K2==0&&K1num==1)                //判K2按下,修改系统时间的分钟
  144.         {
  145.                 delay(5);
  146.                 if(K2==0)
  147.                 {        
  148.                         write_com(0x80+0x40+9);                //光标定位到分钟位置
  149.                         K1num=1;
  150.                         while(!K2);
  151.                         fen++;         //则调整分加1
  152.                         if(fen==60)        fen=0;//若满60后将清零
  153.                         write_sfm(8,fen);        //每调节一次送液晶显示一下
  154.                         write_com(0x80+0x40+9);        //显示位置重新回到调节处
  155.                 }
  156.         }

  157.         if(K1num==1||K3num==1)        //当设置时间或闹钟时,K3被按下设置完成。
  158.         {
  159.                 if(K3==0)                //判断K3按下
  160.                 {
  161.                         delay(5);
  162.                         if(K3==0)
  163.                         {
  164.                                 K1num=0;
  165.                                 K3num=0;
  166.                                 while(!K3);
  167.                                 write_com(0x0c);        //取消光标闪
  168.                                 TR0=1;        //启动定时器使时钟开始走
  169.                                 flag1=1;        //flag=1.则修改系统时间时液晶显示的系统时间值,flag=0,则为修改闹钟时间时,屏幕显示的是修改闹钟时间的值
  170.                                 write_sfm(8,fen);//送去液晶显示分,时
  171.                                 write_sfm(5,shi);
  172.                         }
  173.                 }
  174.         }
  175.         if(K2==0&&K1num==0&&K3num==0)        //K2被按下时显示定时时间
  176.         {
  177.                 delay(5);
  178.                 if(K2==0)
  179.                 {        
  180.                         write_sfm(8,fen1);        //送去液晶显示定时的分,时
  181.                         write_sfm(5,shi1);
  182.                         while(!K2);        
  183.                         write_sfm(8,fen);        //K2松开显示当前时间
  184.                         write_sfm(5,shi);

  185.                 }
  186.         }


  187.         if(K1==0&&K3num==1)                //修改小时,判断K1键按下,K3num=1,表示K3按键按下,则此时修改的是闹钟时间的小时
  188.         {        
  189.                 delay(5);
  190.                 if(K1==0)
  191.                 {        
  192.                         write_com(0x80+0x40+6);        //光标定位到小时位置
  193.                         K3num=1;
  194.                         while(!K1);
  195.                         shi1++;         //则调整定时的时加1
  196.                         if(shi1==24)        //若满24后将清零
  197.                         shi1=0;
  198.                         write_sfm(5,shi1);        //每调节一次送液晶显示一下
  199.                         write_com(0x80+0x40+6);        //显示位置重新回到调节处
  200.                 }
  201.         }
  202.         
  203.         if(K2==0&&K3num==1)                //卸螷2按下,修改闹钟时间的分钟
  204.         {
  205.                 delay(5);
  206.                 if(K2==0)
  207.                 {        
  208.                         write_com(0x80+0x40+9);                //光标定位到分钟位置
  209.                         K3num=1;
  210.                         while(!K2);
  211.                         fen1++;         //则调整分加1
  212.                         if(fen1==60)        //若满60后将清零
  213.                         fen1=0;
  214.                         write_sfm(8,fen1);        //每调节一次送液晶显示一下
  215.                         write_com(0x80+0x40+9);        //显示位置重新回到调节处
  216.                 }
  217.         }
  218.         

  219.         if(K4==0&&flag3==0)                //当闹钟响起时,按下K4停止响闹,当闹钟响起时候flag3置为1
  220.         {
  221.                 delay(5);
  222.                 if(K4==0)
  223.                 {        
  224.                         flag2=0;
  225.                         flag3=1;        //此处需置flag3为1,否则闹钟没有响起的时候按下K4键,程序会执行此句
  226.                 }
  227.         }
  228.         if(K4==0&&flag3==1&&K4num==0)        //K4按下设置闹钟的状态为ON或OFF,flag3=1,表示闹钟此时没响起。K4num==0,表示此时为ON状态。
  229.         {
  230.                 delay(5);
  231.                 {
  232.                         K4num=1;        
  233.                 }
  234.         }
  235.         if(K4==0&&flag3==1&&K4num==1)        //K4按下设置闹钟的状态为ON或OFF,flag3=1,表示闹钟此时没响起。K4num==1,表示此时为OFF状态。
  236.         {
  237.                 delay(5);
  238.                 {
  239.                         K4num=0;        
  240.                 }
  241.         }        
  242. }

  243. void clock()        //        闹钟函数 K4—闹铃ON/OFF的状态设置,设置为ON时连续三次发出“哗”的一声,设置为OFF发出“哗”的一?
  244. {
  245.         if((fen==fen1)&&(shi==shi1)&&(flag2==1)&&(K4num==0))                //闹钟的响闹控制                                
  246.         {
  247.                 beep=1;                //此时闹钟响起,连续三次发出哗的一声
  248.                 relay=1;        //闹钟时间到,则继电器启动
  249.                 flag3=0;        //置flag3=0,表示此时闹钟响起,按下K4键执行停止闹钟响闹语句
  250.                 delay(100);        //这些语句是为了使闹钟响起时,发出连续三次哗的声音
  251.                 beep=0;
  252.                 delay(100);
  253.                 beep=1;
  254.                 delay(100);
  255.                 beep=0;
  256.                 delay(100);
  257.                 beep=1;
  258.                 delay(100);
  259.                 beep=0;
  260.                 delay(300);
  261.         }
  262.         else if((fen==fen1)&&(shi==shi1)&&(flag2==1)&&(K4num==1))                //闹钟的响闹控制                                
  263.         {
  264.                 beep=1;                //此时闹钟响起,发出哗的一声
  265.                 relay=1;        //闹钟时间到,则继电器启动
  266.                 flag3=0;        //置flag3=0,表示此时闹钟响起,按下K4键执行停止闹钟响闹语句
  267.         }
  268.         else
  269.         {
  270.                 beep=0;
  271.                 relay=0;
  272.         }
  273. }
  274. void main()                        //主函数
  275. {        
  276.         
  277.         init();//初始化子程序
  278.         while(1)
  279.         {        
  280.                 keyscan();
  281.                 clock();
  282.         }
  283. }

  284. void time0() interrupt 1        //定时器0中断服务程序
  285. {
  286.         TH0=(65536-50000)/256;        //定时器重新装入数值
  287.         TL0=(65536-50000)%256;
  288.         aa++;        //中断次数累加                        

  289.         if(aa==20)        //20次50毫秒为1秒
  290.         {               
  291.                 aa=0;
  292.                 miao++;
  293.                 led=~led;
  294.                 if(miao==60)
  295.                         {
  296.                                 miao=0;
  297.                                 fen++;
  298.                                 flag2=1;//闹钟响起时按下K4键闹钟关闭,此处应重置该变量,使下一次闹钟时间来到时,闹钟仍然可以响起
  299.                                 if(fen==60)
  300.                                 {
  301.                                         fen=0;
  302.                                         shi++;
  303.                                         if(shi==24)
  304.                                         {
  305.                                                 shi=0;
  306.                                         }
  307.                                         if(flag1==1)
  308.                                         {write_sfm(5,shi);}        //小时发生变化则立即吸入屏幕显示
  309.                                 }
  310.                                 if(flag1==1)
  311.                                 {write_sfm(8,fen);}        //分钟发生变化则立即吸入屏幕显示
  312.                         }
  313.                         
  314.                 }        

  315. }

复制代码



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

使用道具 举报

沙发
ID:206457 发表于 2017-6-2 16:21 | 只看该作者
参考学习下~谢谢
回复

使用道具 举报

板凳
ID:265141 发表于 2017-12-22 09:33 | 只看该作者
有联系方式吗?
回复

使用道具 举报

地板
ID:407230 发表于 2018-10-10 22:24 | 只看该作者
很不错的参考
回复

使用道具 举报

5#
ID:414426 发表于 2018-11-7 18:56 | 只看该作者
运行不得。。。。
回复

使用道具 举报

6#
ID:432516 发表于 2018-11-24 19:09 | 只看该作者
参考学习下
回复

使用道具 举报

7#
ID:435622 发表于 2018-11-30 08:29 来自手机 | 只看该作者
原理图打不开
回复

使用道具 举报

8#
ID:413630 发表于 2018-12-25 15:05 | 只看该作者
牛牛牛
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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