2021年整理电子时钟设计及程序

上传人:摩西的****12 文档编号:172124932 上传时间:2021-03-08 格式:DOC 页数:12 大小:236.50KB
返回 下载 相关 举报
2021年整理电子时钟设计及程序_第1页
第1页 / 共12页
2021年整理电子时钟设计及程序_第2页
第2页 / 共12页
2021年整理电子时钟设计及程序_第3页
第3页 / 共12页
2021年整理电子时钟设计及程序_第4页
第4页 / 共12页
2021年整理电子时钟设计及程序_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《2021年整理电子时钟设计及程序》由会员分享,可在线阅读,更多相关《2021年整理电子时钟设计及程序(12页珍藏版)》请在金锄头文库上搜索。

1、电子时钟设计简介该设计主要由单片机AT89C51和液晶显示器组成,实现常用的实时电子钟功能。利用可编程芯片AT89C51强大的功能,我们了实现日历功能、时钟功能。该时钟使用液晶显示器作为显示模块,使用3个弹性小按键作为输入模块,调节年、月、日、星期、时、分、秒。一方案比较与论证根据设计要求,该时钟系统可分输入部分、处理部分和显示数据部分。其中输入部分是键盘输入数据调整要显示的内容,处理部分单片机接收并通过算法处理键盘输入的信息变成显示模块所能接受的信息,显示部分是用来实时显示处理部分处理后的数据。 输入模块处理模块显示模块 输入模块我们选用三个独立弹性小按键来实现,选用矩阵式键盘则太浪费资处理

2、模块我们选用了STC公司的STC89C52芯片来,与Atmel公司生产的AT89S52一样,也是40脚双列直插式封装,这里芯片对刚学单片机的人来说容易入手,其功能也很强大,用来实现一个电子钟完全足够了。显示部分我们可有两种选择:数码管和1602液晶显示器。实现一个电子钟若用数码管则需6个,所占空间相对大了些,而且我们还要实现日历的功能,需要更多的数码管,所点空间翻倍,而且还会造成单片机I/O引脚滥用甚至不够用,用液晶显示器来实现则方便得多,界面也相对友好,但液晶显示器有个缺点就是价格比较贵。因此我们最终选择了1602液晶显示器。另处独立弹性小按键具有价格便宜、容易获得、容易控制等特点。二系统理

3、论分析、计算与电路仿真1、定时器与中断原理电子钟主要是利用单片机的定时器/计数器和中断来实现。定时器实际是加1计数器,单片机每运行一个机器周期定时器就自动加1,当计到所定的数N时,单片机就产生一次中断,停下所做的工作,转而去执行中断服务程序。单片机每个机器周期等于外部晶振的12个振荡周期,当外部晶振是12MHz时,则每个机器周期的时间是Tcy = 121/12=1m(2-1)定数器设为N时,即每计到N时产生一次中断,而一次中断的时间为:t = NTcym (2-2)当产生X(x根据N来设置,两者之积为1000000)次中断后我就知道过了1s,再通过液晶显示出来,这样就达到了让液晶每隔一秒跳一下

4、的目的了。2、proteus仿真结果3、液晶部分 图4-3 液晶1、2端口分别是工作电源的负、正极,15、16是液晶背光灯电源正负极,R4起限流作用,避免电流过大烧坏背光灯。第3端口还可接一电位器,调节液晶显示对比度。无标号的8个端口是数据端,通过一上拉电阻接到单片机的P0口。三系统的软件设计(如必要,含有流程图)1、程序流程图流程图中的X表示液晶中秒、分、时、星期、年、月、日中的任一个。N按2直到X不闪烁Y液晶X闪烁X减1按键4被按下X加1按键3被按下按键2被按下 X闪烁液晶X闪烁NY初始化结束扫描键盘是否被按下的同时定时器是否到1秒往液晶送新数据YN开始不掉电掉电 图5-1 主程序流程图

5、图5-2 扫描键盘的子程序流程四系统测试及结果测试结果总的来说很满意,比预计的还要好。但由于中断函数中代码较长,故存在一定程度的误差,用秒表测试大约为每5分钟慢了一秒,这个问题是用单片机定时器来数时所无法解决的,中断函数必定会较长,处理这一函数会花费一定的时间这就无法做到让时钟走得很精确。解决方法是用一时钟芯片来实现,由于时钟芯片不好买又比较贵(新的20几块一片),暂时就不考虑了,有机会再尝试。1 源程序/主函数放在最后面#include #define uchar unsigned char#define uint unsigned intsbit rs=P24;/定义液晶数据命令选择端sb

6、it lcden=P25;/液晶使能端sbit s1=P20;/按键1sbit s2=P21;/按键2sbit s3=P22;/按键3uchar count,s1num;char shi,fen,miao;/时、分、秒char year,month,day,week;/年月日星期void delay(uint x)/延时子程序uint j,k;for(j=x;j0;j-)for(k=110;k0;k-);/-液晶写命令功能-void write_com(uchar com)rs=0;lcden=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;/-液晶写数据

7、功能-void write_date(uchar date)rs=1;lcden=0;P0=date;delay(5);lcden=1;delay(5);lcden=0;/-写入时、分、秒-?void write_sfm(uchar add,uchar date)uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_date(0x30+shi);write_date(0x30+ge);/-写入年、月、日-void write_nyr(uchar add,uchar date)uchar shi,ge;shi=dat

8、e/10;ge=date%10;write_com(0x80+add);write_date(0x30+shi);write_date(0x30+ge);/-写入星期X-void write_week(uchar we)write_com(0x80+12);switch(we)case 1: write_date(M);delay(5);write_date(O);delay(5);write_date(N);break;case 2: write_date(T);delay(5);write_date(U);delay(5);write_date(E);break;case 3: write

9、_date(W);delay(5);write_date(E);delay(5);write_date(D);break;case 4: write_date(T);delay(5);write_date(H);delay(5);write_date(U);break;case 5: write_date(F);delay(5);write_date(R);delay(5);write_date(I);break;case 6: write_date(S);delay(5);write_date(A);delay(5);write_date(T);break;case 7: write_dat

10、e(S);delay(5);write_date(U);delay(5);write_date(N);break;/-实现初始化功能-void init()lcden=0;shi=1;fen=1;miao=1;day=1;month=1;year=1;week=1;count=0;s1num=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80+1);write_date(2);write_com(0x80+2);write_date(0);write_com(0x80+5);write

11、_date(-);write_com(0x80+8);write_date(-);write_nyr(9,day);write_nyr(6,month);write_nyr(3,year);write_week(week);write_com(0x80+0x40+6);write_date(:);write_com(0x80+0x40+9);write_date(:);write_sfm(10,miao);write_sfm(7,fen);write_sfm(4,shi);TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET

12、0=1;TR0=1;/ -键盘扫描功能-void keyscan()if(s1=0)/键盘1是否被按下delay(5);/如果检测到键盘被按下,延时约if(s1=0)/5毫秒看是否为键下,这样可越过按 /键盘时的抖动时间,防止误判s1num+;while(!s1);if(s1num=1)TR0=0;write_com(0x80+0x40+10);write_com(0x0f);if(s1num=2)write_com(0x80+0x40+7);if(s1num=3)write_com(0x80+0x40+4);if(s1num=4)write_com(0x80+12);if(s1num=5)write_com(0x80+9);if(s1num=6)write_com(0x80+6);if(s1num=7)write_com(0x80+3);if(s1num=8)s1num=0;write_com(0x0c);TR0=1;if(s1num!=0)/键盘2是否被按下if(s2=0)delay(5);if(s2=0)w

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号