AT89S51单片机对数字电子钟的设计.doc

上传人:白大夫 文档编号:3249858 上传时间:2019-08-06 格式:DOC 页数:7 大小:29.50KB
返回 下载 相关 举报
AT89S51单片机对数字电子钟的设计.doc_第1页
第1页 / 共7页
亲,该文档总共7页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《AT89S51单片机对数字电子钟的设计.doc》由会员分享,可在线阅读,更多相关《AT89S51单片机对数字电子钟的设计.doc(7页珍藏版)》请在三一文库上搜索。

1、AT89S51单片机对数字电子钟的设计一、设计目的:通过单片机应用产品的设计与调试过程,巩固课程所学理论知识,初步了解单片机应用系统设计与调试的方法。二、设计要求:设计一个以AT89S51单片机为核心的数字电子钟控制器,实现电子钟的时间、日期交替显示、闹钟功能,并可通过按钮开关或键盘切换显示内容、调整参数、设置闹钟,在单片机实验板上模拟调试实现控制器的功能。具体设计要求如下:1开机自检,检查相关接口及数码管显示器、指示灯、蜂鸣器等外设是否正常。28位数码管显示器平常以一定的时间间隔、合适的格式显示时间和日期信息,时间显示时、分、秒;日期显示年(20002099)、月、日;设置闹钟功能时显示时、

2、分、开/关状态。3可通过按键设定时间、日期、闹钟等参数、手动切换显示。按键可用独立式按键或行列式键盘实现。设定参数过程有合适的方式指示当前可修改的内容。4对开关量输入进行软件消抖动处理,参数的设定有容错处理,如:小时不能超过23,日期中每月最大天数、闰年等。5用Protel设计可实现上述功能的控制器的原理图(最小应用系统)。扩展功能(选做):1可设置多次闹钟。2显示星期功能。3参数设定过程中,较长时间无操作,则自动恢复为正常显示方式。4其它自选的扩展功能。三、总体方案设计及说明总体功能框图:硬件:8个LED采用动态扫描以节约驱动成本;走时采用内部T0计时中断;4x4矩阵键盘扫描采用线反转法,以

3、中断扫描计数防止抖动;软件:采用C语言实现。四、系统资源分配说明(接口、存储器分配)1.接口:89S51的P1口接8个LED小灯;89S51的P3_2接蜂鸣器(低电平鸣响);外扩一片8255:89S51单片机的P0口是低8位地址与数据复用的,现在我们用74HC373分离出地址,89S51高位地址的P2_0(A8)接8255的片选端(/CS), 低位地址Q1Q0(A1A0)与8255的A1A0连接,数据位P0_7P0_0分别接8255的D_7D_0。 以此得到的8255端口的地址分别为:PA:xxxxxxx0 xxxxxx00取0x0fefc; PB:xxxxxxx0 xxxxxx01取0x0f

4、efd;PC:xxxxxxx0 xxxxxx10取0x0fefd; CTL:xxxxxxx0 xxxxxx11取0x0feff;8255的PA口控制LED数码管的8个显示段;PB口分别接8个LED数码管的共阳极;PC口分别接4x4矩阵键盘的行线和列线。2.存储分配:struct /闹钟时、分、秒 ,共设6个闹钟(初始状态默认:00-00-F1)uchar hour;uchar minute;uchar isON;alarm6=0,0,0;uchar hour=12,minute=0,second=0;/时、分、秒uchar temp_second; /用于立即切换显示时间/日期uint yea

5、r=2011;/ 年uchar month=12;/ 月uchar day=1; / 日uchar week=6;/ 星期uchar Mdays=0,31,28,31,30,31,30,31,31,30,31,30,31;/各月天数uchar alarm_isON=1; /闹钟总开关uchar alarm_station=0; /闹钟状态uchar ano; /闹钟号(当前时间到的闹钟号)uchar start_minute;/开始响铃的时间(也就是所定闹钟的时间)uint count_ms25=0; /软件计数器(计数40个25毫秒达1s)uchar show_model=0; / 显示模式

6、:0切换显示时间/日期 1切换显示日期/时间const uchar fixTIme=0x00;/时间修正量uchar key=0xff;/获得的当前键值uchar last_key=0xff; /最后一次扫描到的按键(非0xff)uchar key_count=0;/扫描到同一按键的次数uchar Edown=0; /闹钟开关键是否按下uchar led_buf8=24,24,24,24,24,24,24,24; /时间日期显示缓冲区uchar code led_table1=0x0c0,0x0f9,0x0a4,0x0b0, 0x99,0x92,0x82,0x0f8,0x80,0x90,0x8

7、8,0x83,0x0C6,0x0a1,0x86,0x8e,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e,0x7f,0x0bf,0xff;/数码管段码uchar code KBTable = 1,2,3,F,4,5,6,E,7,8,9,C,0,A,B,D;/键值(可有可无)五、软件流程图及说明1.流程图:2.主要程序段说明:(1)显示:动态显示:即各位数码管轮流点亮,对于显示器各位数码管,每隔一段延时时间循环点亮一次。利用人的视觉暂留功能可以看到整个显示,但须保证扫描速度足够快,人的

8、视觉暂留功能才可察觉不到字符闪烁。显示器的亮度与导通电流、点亮时间及间隔时间的比例有关。调整参数可以实现较高稳定度的显示。动态显示节省了驱动和I/O口,降低了能耗。void LED_show(uchar buf)uchar i,num,pLED=0x80;for(i=0;i8;i+)num=bufi;PA=led_table1num; /*送字段码*/PB=pLED; /*送字位码*/pLED=1; /*右移一位*/Delay(1); /*延时*/(2)键盘(本次设计对下面两种扫描方式都进行了实现):a.行扫描法:依次从第一至最末行线上发出低电平信号, 如果该行线所连接的键没有按下的话, 则列

9、线所接的端口得到的是全“1”信号, 如果有键按下的话, 则得到非全“1”信号。/*键盘扫描(行扫描法,延时消抖)*uchar code KBTable = 0xEE,1,0xDE,4,0xBE,7,0x7E,0,0xED,2,0xDD,5,0xBD,8,0x7D,A,0xEB,3,0xDB,6,0xBB,9,0x7B,B,0xE7,F,0xD7,E,0xB7,C,0x77,D,0x00,0xff;uchar Get_key(void); / 获取最终键值 uchar i;uchar line, row, k_value;staTIc uchar lastkey=0xff;CTL=0x88; /

10、CH输入,CL输出 10001000PC=PC / PC0PC3输出0 , 输入PC4 PC7(默认1无键按下)if (PC lastkey=0xff;return 0xff; /无键按下row = PC;Delay(4); /延时,消除抖动if (row != PC)lastkey=0xff;return 0xff; /判为抖动line=0xFE;for (i=0;i4;i+) PC = line; /输出扫描信号row=PC; /读键盘口if (row break;line=(line1)+1;if (i=4) lastkey=0xff; return 0xff; k_value = (r

11、ow for (i=0; i32; i+=2)if (k_value = KBTablei)break;if(lastkey=KBTablei+1)return 0xff;lastkey=KBTablei+1;return KBTablei+1;b.线反转法:线反转法也是识别闭合键的一种常用方法, 该法比行扫描速度快, 但在硬件上要求行线与列线外接上拉电阻。先将行线作为输出线, 列线作为输入线, 行线输出全“0”信号, 读入列线的值, 那么在闭合键所在的列线上的值必为0;然后从列线输出全“0”信号,再读取行线的输入值,闭合键所在的行线值必为 0。这样,当一个键被按下时, 必定可读到一对唯一的行

12、列值。再由这一对行列值可以求出闭合键所在的位置。/一次键盘扫描(线反转法,中断扫描计数去抖)*uchar code KBTable = 1,2,3,F,4,5,6,E,7,8,9,C,0,A,B,D;/key_index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15uchar key_scan(void) /返回 0,1,2。.E,F,0xff uchar key_index,temp=0;CTL=0x88; /CH输入,CL输出 10001000PC=PC /将低四位置0if(PC!=0xF0) /判断按键是否按下 如果按钮按下 会拉低CH其中的一个端口temp=PC; /读PC口temp=temp /屏蔽低四位temp=

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1