ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:91.15KB ,
资源ID:7781896      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7781896.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(以AT89C51单片机为核心制作一个LCD显示的智.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

以AT89C51单片机为核心制作一个LCD显示的智.docx

1、以AT89C51单片机为核心制作一个LCD显示的智以AT89C51单片机为核心-制作一个LCD显示的智第6章智能电子钟的设计6.1 功能要求1. 设计要求 以AT89C51单片机为核心,制作一个LCD显示的智能电子钟: (1) 计时:秒、分、时、天、周、月、年。 (2) 闰年自动判别。 (3) 五路定时输出,可任意关断(最大可到16路)。 (4) 时间、月、日交替显示。 (5) 自定任意时刻自动开/关屏。 (6) 计时精度:误差1秒/月(具有微调设置)。 (7) 键盘采用动态扫描方式查询。所有的查询、设置功能均由功能键K1、K2完成。2. 工作原理本设计采用市场上流行的时钟芯片DS1302进行

2、制作。DS1302是DALLAS公司推出的涓流充电时钟芯片,内含一个实时时钟/日历和31字节静态RAM,可以通过串行接口与计算机进行通信,使得管脚数量减少。实时时钟/日历电路能够计算2100年之前的秒、分、时、日、星期、月、年的,具有闰年调整的能力。DS1302时钟芯片的主要功能特性:(1) 能计算2100年之前的年、月、日、星期、时、分、秒的信息;每月的天数和闰年的天数可自动调整;时钟可设置为24或12小时格式。(2) 31B的8位暂存数据存储RAM。(3) 串行I/O口方式使得引脚数量最少。(4) DS1302与单片机之间能简单地采用同步串行的方式进行 通信,仅需3根线。(5) 宽范围工作

3、电压2.0-5.5V。(6) 工作电流为2.0A时,小于300nA。(7) 功耗很低,保持数据和时钟信息时功率小于1mW。6.2 方案论证6.3 系统硬件电路的设计6.4 系统程序的设计write_com_date(0xc7,0x30+minute%10); write_com_date(0xc6,0x30+minute/10); hour=read1302(0x85); write_com_date(0xc4,0x30+hour%10); write_com_date(0xc3,0x30+hour/10); day=read1302(0x87); write_com_date(0x8a,0x

4、30+day%10); write_com_date(0x89,0x30+day/10); week=read1302(0x8b); write_com_date(0xcd,0x30+week%10); month=read1302(0x89); write_com_date(0x87,0x30+month%10); write_com_date(0x86,0x30+month/10); year=read1302(0x8d); write_com_date(0x84,0x30+year%10); write_com_date(0x83,0x30+year/10); void keyscan(

5、) /修改调整时间日期 if(key1=0) delay(10); if(key1=0) pos_flag+; while(!key1); keyflag=1; switch(pos_flag) case 1: write_com(0x80+4); /年 write_com(0x0f); /光标闪烁 break; case 2: write_com(0x80+7); /月 break; case 3: write_com(0x80+10); /日 break; case 4: write_com(0x80+0x40+0x0d); /星期 break; case 5: write_com(0x8

6、0+0x40+4); /时钟 break; case 6: write_com(0x80+0x40+7); /分钟 break; case 7: write_com(0x80+0x40+10); /秒钟 break; default:break; if(pos_flag=8) /pos_flag=8则退出调整 pos_flag=0; keyflag=0; /按键标识清零 delay(5); settime(); write_com(0x0c); / 关光标 if(key2=0) /调节加键,按下(低电平)就加 delay(15); if(key2=0) while(!key2); switch

7、(pos_flag) case 1: year+; if(year=99) year=0; write_com_date(0x84,0x30+year%10); write_com_date(0x83,0x30+year/10); break; case 2: month+; if(month=13) month=1; write_com_date(0x87,0x30+month%10); write_com_date(0x86,0x30+month/10); break; case 3: day+; if(year%4=0)&(month=2) /闰年 二月 29天 if(day=30) d

8、ay=1; if(year%4!=0)&(month=2) /平年 二月 28天 if(day=29) day=1; if(month=1|month=3|month=5|month=7|month=8|month=10|month=12) /大月31天 if(day=32) day=1; if(month=4|month=6|month=9|month=11) /小月30天 if(day=31) day=1; write_com_date(0x8a,0x30+day%10); write_com_date(0x89,0x30+day/10); break; case 4: week+; if

9、(week=8) week=1; write_com_date(0xcd,0x30+week); break; case 5: hour+; if(hour=24) hour=0; write_com_date(0xc4,0x30+hour%10); write_com_date(0xc3,0x30+hour/10); break; case 6: minute+; if(minute=60) minute=0; write_com_date(0xc7,0x30+minute%10); write_com_date(0xc6,0x30+minute/10); break; case 7: se

10、cond+; if(second=60) second=0; write_com_date(0xca,0x30+second%10); write_com_date(0xc9,0x30+second/10); break; default:break; if(key3=0) delay(15); if(key3=0) while(!key3); switch(pos_flag) case 1: year-; if(year=0) year=99; write_com_date(0x84,0x30+year%10); write_com_date(0x83,0x30+year/10); brea

11、k; case 2: month-; if(month=0) month=12; write_com_date(0x87,0x30+month%10); write_com_date(0x86,0x30+month/10); break; case 3: day-; if(year%4=0)&(month=2) /闰年 二月 29天 if(day=0) day=29; if(year%4!=0)&(month=2) /平年 二月 28天 if(day=0) day=28; if(month=1|month=3|month=5|month=7|month=8|month=10|month=12)

12、 /大月31天 if(day=0) day=31; if(month=4|month=6|month=9|month=11) /小月30天 if(day=0) day=30; write_com_date(0x8a,0x30+day%10); write_com_date(0x89,0x30+day/10); break; case 4: week-; if(week=0) week=7; write_com_date(0xcd,0x30+week); break; case 5: hour-; if(hour=0) hour=24; write_com_date(0xc4,0x30+hour

13、%10); write_com_date(0xc3,0x30+hour/10); break; case 6: minute-; if(minute=0) minute=59; write_com_date(0xc7,0x30+minute%10); write_com_date(0xc6,0x30+minute/10); break; case 7: second-; if(second=0) second=59; write_com_date(0xca,0x30+second%10); write_com_date(0xc9,0x30+second/10); break; default:

14、break; void main() init_lcd(); delay(2); init_ds1302(); delay(2); Disp_1602(1,0,20 - - week) ; Disp_1602(5,1,: :) ; while(1) if(keyflag=0) display(); keyscan(); #ifndef _lcd_h_#define _lcd_h_#include #define uchar unsigned char#define uint unsigned int sbit lcdrs=P20;sbit lcdrw=P21;sbit lcden=P22;vo

15、id delay(uchar ms) uchar i; for(;ms0;ms-) for(i=110;i0;i-);void write_com(uchar com) /写指令 lcden=0; lcdrs=0; lcdrw=0; P0=com; delay(1); lcden=1; delay(1); lcden=0;void write_data(uchar date) /写数据 lcden=0; lcdrs=1; lcdrw=0; P0=date; delay(1); lcden=1; delay(1); lcden=0;void write_com_date(uchar add,uc

16、har date) write_com(add); delay(1); write_data(date);void Disp_1602(uchar x,uchar y,uchar *p) while(*p) if(y=0) x|=0x80; else x|=0xc0; write_com(x); delay(5); write_data(*p); x+; p+; void init_lcd() delay(15); write_com(0x38); delay(15); write_com(0x38); delay(5); write_com(0x38); write_com(0x0c); w

17、rite_com(0x06); write_com(0x01);#endif#ifndef _ds1302_h_#define _ds1302_h_#include #define uchar unsigned char#define uint unsigned int sbit sclk=P11;sbit io=P10;sbit rst=P12;sbit ACC_7=ACC7;void write1302(uchar add,uchar date) /写入地址、数据 uchar i; rst=0; sclk=0; rst=1; for(i=0;i=1; sclk=1; for(i=0;i=1

18、; sclk=1; rst=0;uchar read1302(uchar add) /读地址、数据 uchar i,dat1,dat2; rst=0; sclk=0; rst=1; for(i=0;i=1; sclk=1; for(i=0;i=1; sclk=0; rst=0; sclk=1; dat1=ACC; dat2=dat1/16; dat1=dat1%16; dat1=dat2*10+dat1; return dat1;void init_ds1302() if(read1302(0x81)&0x0f)=1) write1302(0x8e,0x00); /关闭写保护 #endif6.5调试及性能分析6.5.1 调试与测试6.5.2 性能分析

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1