1、电子钟(二)一、 课程设计目的:通过对设计电子钟的设计了解89C51,PCF8563及液晶显示的工作原理与编程方法.二、 课程设计要求:通过单片机控制应用时钟芯片8563和串口液晶,实现电子钟。要求显示年、月、日、时、分、秒。三、 系统分析与设计:1:系统总体设计 本实验中的器件:PCB开发板一块;89C51模块;PCF8563时钟芯片一片;串口液晶一个; MAX232芯片一片;该电子钟分为数据产生,数据传输和数据显示三个部分.其中数据产生的是PCF8563模块,数据传输的是89C52和74HC573模块。数据显示的是在串口液晶上。89C51模块:实验中利用89C52模块的P3.4及P3.5引
2、脚向PCF8563的6脚和5脚即SCL和SDA传输数据,来对PCF8563进行初始化,在利用采来的数据将数据地址锁存在74HC573内并在串口液晶上显示。PCF8563模块:该模块是时钟芯片,是低功耗的CMOS时钟芯片,其所有的地址和数据都是通过I2C总线接口串行传递的。每次读写数据后,内嵌的地址寄存器会自动产生增量。本实验就是利用该芯片传来的数据进行显示。串口液晶LCD:该液晶有两行地址,将要显示的数据分别放在这两行中进行显示。2:系统详细设计系统总体框架:系统的总体电路图如图1所示:图1 系统电路图 图2 74HC573与单片机连接图 图3 GAL16V8与单片机连接图图4 单片机与外接器
3、件连接图3:系统流程图:开始8563初始化,LCD初始化向8563写入初始化值读回数据并锁存将数据送入串口液晶显示时间4:原程序清单#include#include#include#define uchar unsigned char#define uint unsigned int#define ulong unsigned long#include #define PCF8563_W 0xa2#define PCF8563_R 0xa3#define WRADDR 0x00#define RDADDR 0x02#define _Nop() _nop_();/*/#define PCF856
4、3_CONTROL_STATE0 0x00 /控制状态寄存器1#define PCF8563_CONTROL_STATE1 0x01 /控制状态寄存器2#define PCF8563_CLKOUT 0x0d /CLKOUT频率寄存器#define PCF8563_TIMER_CONTROL 0x0e /定时器控制寄存器#define PCF8563_TIMER_DATA 0x0f /定时器倒计数数值寄存器#define PCF8563_MINUTE 0x02 /秒#define PCF8563_SECOND 0x03 /分#define PCF8563_HOUR 0x04 /时#define
5、PCF8563_DATE 0x05 /日#define PCF8563_WEEK 0x06 /星期#define PCF8563_MONTH 0x07 /月/世纪#define PCF8563_YEAR 0x08 /年#define PCF8563_MINUTE_ALARM 0x09 /分钟报警#define PCF8563_SECOND_ALARM 0x0a /小时报警#define PCF8563_YEAR_ALARM 0x0b /日报警#define PCF8563_WEEK_ALARM 0x0c /星期报警uchar b16;/*/uchar code CS12= 0x00, 0x28
6、 ;uchar code CS22= 0x12, 0x02 ;uchar code CLKOUT4= 0x80, 0x81, 0x82, 0x83 ;/*/sbit SDA=P35;sbit SCL=P34;/*/sbit bflag=ACC7;uchar FUNC(uchar a,uchar b);/右循环n,m位/*/bit ack;/起动IICvoid Start_I2c() SDA=1; /*发送起始条件的数据信号*/ _Nop(); SCL=1; _Nop(); /*起始条件建立时间大于4.7us,延时*/ _Nop(); _Nop(); _Nop(); _Nop(); SDA=0;
7、 /*发送起始信号*/ _Nop(); /* 起始条件锁定时间大于4s*/ _Nop(); _Nop(); _Nop(); _Nop(); SCL=0; /*钳住I2C总线,准备发送或接收数据 */ _Nop(); _Nop();/*/停止IICvoid Stop_I2c() SDA=0; /*发送结束条件的数据信号*/ _Nop(); /*发送结束条件的时钟信号*/ SCL=1; /*结束条件建立时间大于4s*/ _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); SDA=1; /*发送I2C总线结束信号*/ _Nop(); _Nop(); _Nop(); _No
8、p();/写1BYTE数据(上传数据、释放IIC、ack确认)void SendByte(uchar c) uchar idata BitCnt; for(BitCnt=0;BitCnt8;BitCnt+) /*要传送的数据长度为8位*/ if(cBitCnt)&0x80)SDA=1; /*判断发送位*/ else SDA=0; _Nop(); SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/ _Nop(); _Nop(); /*保证时钟高电平周期大于4s*/ _Nop(); _Nop(); _Nop(); SCL=0; _Nop(); _Nop(); SDA=1; /*8位发送完
9、后释放数据线,准备接收应答位*/ _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); _Nop(); if(SDA=1)ack=0; else ack=1; /*判断是否接收到应答信号*/ SCL=0; _Nop(); _Nop();/读1BYTE数据(置输入状态、读数据)uchar RcvByte() uchar idata retc=0; uchar idata BitCnt; SDA=1; /*置数据线为输入方式*/ for(BitCnt=0;BitCnt8;BitCnt+) _Nop(); SCL=0; /*置时钟线为低,准备接收数据位*/ _Nop(); _
10、Nop(); /*时钟低电平周期大于4.7s*/ _Nop(); _Nop(); _Nop(); SCL=1; /*置时钟线为高使数据线上数据有效*/ _Nop(); _Nop(); retc=retc 失败)bit ISendByte(uchar sla,uchar c) Start_I2c(); /启动总线 SendByte(sla); /发送器件地址 if(ack=0)return(0); SendByte(c); /发送数据 if(ack=0)return(0); Stop_I2c(); /结束总线 return(1);/指定地址写命令/数据(地址=从地址+子地址,no为从指针*s的个
11、数)bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no) uchar idata i; Start_I2c(); /*启动总线*/ SendByte(sla); /*发送器件地址*/ if(ack=0)return(0); SendByte(suba); /*发送器件子地址*/ if(ack=0)return(0);/ reset_wdt(); for(i=0;ino;i+) SendByte(*s); /*发送数据*/ if(ack=0)return(0); s+; Stop_I2c(); /*结束总线*/ return(1);/指定地址读
12、状态/数据(地址=从地址+子地址,no为从指针*s的个数)bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no) uchar idata i; Start_I2c(); /*启动总线*/ SendByte(sla); /*发送器件地址*/ if(ack=0)return(0); SendByte(suba); /*发送器件子地址*/ if(ack=0)return(0); Start_I2c(); SendByte(sla+1); if(ack=0)return(0); for(i=0;i4;a1=(b0&0x0f);a2=34;/*读分并处理*
13、/a3=(b1&0x0f);b1=b14;a4=(b1&0x0f);a5=34;/*读时并处理*/a6=(b2&0x0f);b2=b24;a7=(b2&0x03);/*读日并处理*/a8=(b3&0x0f); b3=b34;a9=(b3&0x03);a10=34;/*读月并处理*/a11=(b5&0x0f);b5=b54;a12=(b5&0x01);a13=34;/*读年并处理*/a14=(b6&0x0f);b6=b64;a15=(b6&0x0f); for(n=0;n8;n+) d=a7-n; display_buffn=memd; display_slcd(8); delay_ms(0x8
14、0); if(a0=5) for(n=0;n8;n+) d=a15-n; display_buffn=memd; display_slcd(8); delay_ms(0x80); delay_ms(0xff); delay_ms(0xff); delay_ms(0xff); delay_ms(0xff); delay_ms(0xff); delay_ms(0xff); 四、系统调试过程中出现的问题1:液晶最初是无显示的,必须通过调节电位器才能显示.GAL在显示是出现了问题,对其进行烧制.2:在显示年月时由于对其有效位未理解透彻,因而出现了显示乱码,在经过改正后得到了结果. 五、系统运行报告 对
15、程序运行下载到单片机后,串口液晶屏上第一行显示出“DATA/2003/12/4。第二行显示TIME/19:59:50。六、总结1:在对时钟芯片8563的数据读回时未理解程序的读回命令,其实就是读回命令将数据读回对其进行显示就可以了,尝试一个数进行显示,最终将数据显示在了LCD上。2:因为串口液晶只能显示ASII码,因此对其进行转换是必须的。在做时直接进行显示,则显示出乱码。经过查资料修正后得出了正确结果。3:通过本次实验,加深了对电路的整体设计思想。对51单片机的设计流程有了一定的了解。对硬件的调试与软件的修改掌握了一些技巧。对51单片机的C程序设计有了一定的掌握。七、参考书目1:马忠梅,单片机的c语言应用程序设计,北京航空航天大学出版社2:王福瑞,单片微机测控系统设计大全,北京航空航天大学出版社3:徐爱钧,单片机高级语言C51应用程序设计,电子工业出版社 4:杨振江,智能仪器与数据采集系统中的新器件及应用,西安电子科技大学出版社
版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。
Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1
陕公网安备 61072602000132号 违法和不良信息举报:0916-4228922