非常给力51单片机电子钟设计_第1页
非常给力51单片机电子钟设计_第2页
非常给力51单片机电子钟设计_第3页
非常给力51单片机电子钟设计_第4页
非常给力51单片机电子钟设计_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、福州大学MCS-51单片机课程设计题 目: 智能电子钟设计 姓 名: 许雄 学 号: 010900614 学 院: 电气工程与自动化学院 专 业: 电气工程与自动化 年 级: 2009 起讫日期: 2012.04.10 2009.4.30 指导教师: 蔡逢煌 目 录1、课程设计目的12、课程设计题目和实现目标13、设计方案14、Proteus仿真原理图15、程序流程图16、程序代码17、调试总结18、设计心得体会19、参考文献11、课程设计目的MCS-51单片机课程设计是与MCS51单片机课程相配套的实践教学环节。MCS51单片机是一门实践性很强的专业基础课,通过课程设计,达到进一步理解单片机

2、的硬件、软件和综合应用方面的知识,培养实践能力和综合应用能力,开拓学习积极性、主动性,学会灵活运用已经学过的知识,并能不断接受新的知识。培养大胆发明创造的设计理念,为今后就业打下良好的基础。通过课程设计,掌握以下知识和技能:1 单片机应用系统的总体方案的设计;2 单片机应用系统的硬件设计;3 单片机应用系统的软件程序设计;4 单片机开发系统的应用和调试能力 2、课程设计题目和实现目标 利用单片机芯片STC89C52RC,时钟芯片DS1302,温度芯片DS18B20,液晶显示芯片LCD1602以及串行口通信芯片MAX232实现智能电子时钟,时间的调整以及秒表的启动,闹铃的设定,报警温度都是通过上

3、位机来实现,本实验主要通过串口调试助手进行模拟远程操控。 3、设计方案 初始化DS1302时钟芯片,将里面的时间(秒,分,时,星期,月份,年)读出来,显示在LCD1602上,同时,通过DS18B20实时在线测量温度 ,同样显示在液晶屏上,利用串行口将温度传输至上位机监测。上位机可发送相关命令来修改时间,设定闹铃,启动秒表,设定报警温度。4、Proteus仿真原理图 5、程序流程开始初始化读取芯片时钟温度测量BCD码转换数据处理1602显示发送至上位机是否发生串口接受中 断 根据接受命令执行相应功能数据处理中断返回6、程序代码(本程序通过结构化编程)A.延时函数以下是delay.h文件#ifnd

4、ef _DELAY_H_#define _DELAY_H_typedef unsigned char uchar;typedef unsigned int uint;extern void delaynms(uint aa);#endif以下是delay.c文件 #includedelay.hvoid delaynms(uint aa) /1ms基准延时程序 uchar bb; while(aa-) for(bb=0;bb115;bb+); B.LCD1602显示函数以下是LCD1602.H文件#includedelay.h#ifndef _LCD1602_H_#define _LCD1602

5、_H_extern void init1602();extern bit BusyTest();extern void write_com(uchar com);extern void write_data(uchar dat);extern void write_1602hls(uchar hang,uchar lie,uchar dat);#endif以下是LCD1602.C文件#include#includeintrins.h#includelcd1602.h#includedelay.hsbit RS=P10;/1602使能引脚sbit E=P25;/1602读写引脚sbit RW=P

6、11;/1602数据/命令选择引脚sbit BF=P07;void init1602() delaynms(15); /延时15ms,首次写指令时应给LCD一段较长的反应时间 write_com(0x38); /显示模式设置:162显示,57点阵,8位数据接口delaynms(5); /延时5ms,给硬件一点反应时间 write_com(0x38);delaynms(5); /延时5ms,给硬件一点反应时间write_com(0x38); /连续三次,确保初始化成功delaynms(5); /延时5ms,给硬件一点反应时间write_com(0x0c); /显示模式设置:显示开,无光标,光标不

7、闪烁delaynms(5); /延时5ms,给硬件一点反应时间write_com(0x06); /显示模式设置:光标右移,字符不移delaynms(5); /延时5ms,给硬件一点反应时间write_com(0x01); /清屏幕指令,将以前的显示内容清除delaynms(5); /延时5ms,给硬件一点反应时间bit BusyTest() bit result;RS=0; /根据规定,RS为低电平,RW为高电平时,可以读状态 RW=1; E=1; /E=1,才允许读写 _nop_(); /空操作 _nop_(); _nop_(); _nop_(); /空操作四个机器周期,给硬件反应时间 re

8、sult=BF; /将忙碌标志电平赋给result E=0; /将E恢复低电平 return result;void write_com(uchar com) while(BusyTest()=1); /如果忙就等待 RS=0; /根据规定,RS和R/W同时为低电平时,可以写入指令 RW=0; E=0; /E置低电平(写指令时,E为高脉冲) 就是让E从0到1发生正跳变,所以应先置0 _nop_(); _nop_(); /空操作两个机器周期,给硬件反应时间 P0=com; /将数据送入P0口,即写入指令或地址 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四个机

9、器周期,给硬件反应时间 E=1; /E置高电平 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四个机器周期,给硬件反应时间 E=0; /当E由高电平跳变成低电平时,液晶模块开始执行命令 void write_data(uchar dat) while(BusyTest()=1); RS=1; /RS为高电平,RW为低电平时,可以写入数据 RW=0; E=0; /E置低电平(根据表8-6,写指令时,E为高脉冲,就是让E从0到1发生正跳变,所以应先置0 P0=dat; /将数据送入P0口,即将数据写入液晶模块 _nop_(); _nop_(); _nop_();

10、_nop_(); /空操作四个机器周期,给硬件反应时间 E=1; /E置高电平 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四个机器周期,给硬件反应时间 E=0; /当E由高电平跳变成低电平时,液晶模块开始执行命令void write_1602hls(uchar hang,uchar lie,char dat) /行列数uchar a;if(hang = 1) a = 0x80; /第一行if(hang = 2) a = 0xc0;/第二行a = a + lie - 1;write_com(a);write_data(dat);C.DS18B20温度函数以下

11、是DS18B20.h文件#include#ifndef _DS18B20_H_#define _DS18B20_H_extern bit init18b20();extern unsigned char read_18b20byte();extern void write_18b20byte(uchar dat);#endif以下是DS18B20.c文件#include#include#include#includedelay.h /用到uchar#includeds18b20.hsbit DQ=P22; /温度信号线unsigned char time;bit init18b20() bit

12、 flag; /储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在 DQ = 1; /先将数据线拉高 for(time=0;time2;time+); /略微延时约6微秒 DQ = 0; /再将数据线从高拉低,要求保持480960us for(time=0;time200;time+); /略微延时约600微秒 ,以向DS18B20发出一持续480960us的低电平复位脉冲 DQ = 1; /释放数据线(将数据线拉高) for(time=0;time10;time+);/延时约30us(释放总线后需等待1560us让DS18B20输出存在脉冲) flag=DQ;

13、 /让单片机检测是否输出了存在脉冲(DQ=0表示存在) for(time=0;time200;time+); /延时足够长时间,等待存在脉冲输出完毕 return (flag); /返回检测成功标志uchar read_18b20byte() uchar i=0;uchar dat; /储存读出的一个字节数据for (i=0;i8;i+) DQ =1; / 先将数据线拉高_nop_(); /等待一个机器周期 DQ = 0; /单片机从DS18B20读书据时,将数据线从高拉低即启动读时序 _nop_(); /等待一个机器周期 DQ = 1; /将数据线人为拉高,为单片机检测DS18B20的输出电

14、平作准备for(time=0;time=1;if(DQ=1) dat|=0x80; /如果读到的数据是1,则将1存入datelse dat|=0x00;/如果读到的数据是0,则将0存入datfor(time=0;time8;time+); /延时3us,两个读时序之间必须有大于1us的恢复期 return(dat); /返回读出的十六进制数据void write_18b20byte(uchar dat) /向DS18B20写一个字节数据/ uchar i=0;for (i=0; i8; i+) DQ =1; / 先将数据线拉高_nop_(); /等待一个机器周期 DQ=0; /将数据线从高拉低

15、时即启动写时序 DQ=dat&0x01; /利用与运算取出要写的某位二进制数据, /并将其送到数据线上等待DS18B20采样for(time=0;time10;time+);/延时约30us,DS18B20在拉低后的约1560us期间从数据线上采样DQ=1; /释放数据线 for(time=0;time=1; /将dat中的各二进制位数据右移1位 for(time=0;time4;time+);/稍作延时,给硬件一点反应时间D.DS1302时钟函数以下是DS1302.h文件#ifndef _DS1302_H_#define _DS1302_H_#includedelay.hextern voi

16、d init1302();extern void write_1302byte(uchar dat);extern uchar read_1302byte();extern void write_1302(uchar add, uchar dat);extern uchar read_1302(uchar add);extern uchar bcdtodec(uchar bcd);extern uchar dectobcd(uchar dec);#endif以下是DS1302.C文件#include#include#includedelay.h#includeds1302.hsbit T_CL

17、K = P21; /实时时钟时钟线引脚 sbit T_IO = P20; /实时时钟数据线引脚 sbit T_RST = P24; /实时时钟复位线引脚 */sbit ACC0 = ACC0;sbit ACC7 = ACC7;void init1302()write_1302(0x8e,0);/表示接下来要写时钟write_1302(0x80,0x58);/写入秒write_1302(0x8e,0);write_1302(0x82,0x59);/写入分write_1302(0x8e,0);write_1302(0x84,0x00);/写入小时write_1302(0x8e,0);write_1

18、302(0x86,0x28);/写入日write_1302(0x8e,0);write_1302(0x88,0x04);/写入月write_1302(0x8e,0);write_1302(0x8a,0x05);/写入星期write_1302(0x8e,0);write_1302(0x8c,0x12);/写入年void write_1302byte(uchar dat) /向1302写一个字节 uchar i;ACC = dat;T_RST = 1;for(i=8; i0; i-)T_IO = ACC0;T_CLK = 1;T_CLK = 0;ACC = ACC 1;uchar read_130

19、2byte() /从1302读取一个字节uchar i;T_RST = 1;for(i=8; i0; i-)ACC = ACC 1;T_IO=1;ACC7 = T_IO;T_CLK = 1;T_CLK = 0;return(ACC);void write_1302(uchar add, uchar dat) /往DS1302写数据,add为地址,dat为数据T_RST = 0;T_CLK = 0;T_RST = 1;write_1302byte(add); / 写地址 _nop_();_nop_();write_1302byte(dat); / 写1Byte数据T_CLK = 1;T_RST

20、= 0;uchar read_1302(uchar add)/从DS1302的add地址读取一个字节uchar tem;T_RST = 0;T_CLK = 0;T_RST = 1;write_1302byte(add); /写地址,命令_nop_();_nop_();tem = read_1302byte(); /读1Byte数据T_CLK = 1;T_RST = 0;return(tem);uchar bcdtodec(uchar bcd) /BCD码转换为十六进制,以便处理uchar data1;data1 = bcd & 0x0f; /取BCD低4位bcd = bcd & 0x70; /

21、剔除BCD的最高位和低4位。data1 += bcd 1;data1 += bcd 3; /用位移代替乘法运算return data1;uchar dectobcd(uchar dec)/十六进制转换为BCD码,以便写入1302uchar bcd;bcd = 0;while(dec = 10) dec -= 10; bcd+; bcd = 4;bcd |= dec;return bcd;E.主函数MAIN.C/*功能: 利用时钟芯片DS1302设计时钟,显示在LCD1602上,具有秒 表功能,秒表和时间可通过串口调试助手启动和调整,同时,利用DS18B20在线监测温度,温度实时传送至上位机串口

22、调试助手,当温度超过设定值时报警,报警温度通过串口调试助手设置上述功能设置方式:通过串口发送三位字符(只能三位,1字母+2数字) 字母表示要设定的参数及对应的参数值:秒钟(m+要设定的两位数值),分钟(f+要设定的两位数值),时钟(s+要设定的两位数值),星期(x+要设定的两位数值),日期(r+要设定的两位数值),月份(y+要设定的两位数值),年份(n+要设定的两位数值),准备计时(z+任意两位数字),开始计时(k+任意两位数字),停止计时(t+任意两位数字),恢复(h+任意两位数值)。设定闹钟:时钟(A+要设定的两位数值),分钟(B+要设定的两位数值),秒钟(C+要设定的两位数值),报警温度

23、(w+要设定的两位数值) 注意:上述A,B,C为大写,其余皆小写主要芯片:STC89C52RC,DS1302,DS18B20,LCD1602本设计采用结构化编程设计者:010900614 许雄时间:2012年4月222012年4月27*/#include#include#includedelay.h#includelcd1602.h#includeds18b20.h#includeds1302.huchar M,W=30,buffer3;char sec, min, hour, day,week, month, year;uchar fenzhong,miaozhong,shizhong;ui

24、nt com;uchar count,miao,fen; /秒表uchar temph,templ,temp; /温度sbit BELL=P23;bit flag;uchar code table=Mon Tue Wed Thu Fri Sat Sun;uchar code send0=The temperature is:;void Time0_Init();void init();void get_temp();void Run_DS1302();void send(uchar n);void show();void warning();void belling();void functi

25、on();void main()init();while(1) show(); get_temp(); Run_DS1302(); warning(); belling(); void warning() /超出设定温度则LED灯闪烁 if(tempW) BELL=BELL; delaynms(50); else BELL=1; void belling() /闹铃函数 uchar i; if(shizhong=hour)&(fenzhong=min)&(miaozhong=sec) for(i=0;i255) temph+; /如果低8位大于255,向高8位进1 temp=(temph4); /实际温度值=(TH*256+TL)/16,即:TH*16+TL/16,遗弃小数部分else temp=(temph4); /实际温度值=(TH*256+TL)/16,即:TH*16+TL/16,遗弃小数部分 void init() Time0_Init(); /定时器初始化 initcom();/ 串口初始化 init1302(); /1302时钟芯片初始化 init1602(); /LCD1602初

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论