数字电子钟课程设计.doc_第1页
数字电子钟课程设计.doc_第2页
数字电子钟课程设计.doc_第3页
数字电子钟课程设计.doc_第4页
数字电子钟课程设计.doc_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

西安科技大学基于52单片机 数字电子钟课程设计题 目: 数字电子钟 院 (系): 电气与控制工程学院 专 业: 自动化 学生姓名: 王慧、邵云杰、徐铣蔚 指导教师: 杨良煜 、刘晓荣 2013、01、08 摘 要单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。单片机体积小、重量轻、抗干扰能力强、环境要求不高、价格低廉、可靠性高、灵活性好、开发较为容易。由于具有上述优点,在我国,单片机已广泛地应用在工业自动化控制、自动检测、智能仪器仪表、家用电器、电力电子、机电一体化设备等各个方面。本设计采用LCD液晶屏幕显示系统,以AT89C52单片机为核心,由键盘、温度采集、定时闹铃、日期提醒等功能模块组成。基于题目基本要求,本系统对时间显示、闹铃方式进和温度采集系统行了重点设计。本系统大部分功能由软件来实现,吸收了硬件软件化的思想,大部分功能通过软件来实现,使电路简单明了,系统稳定性大大提高。本系统不仅成功的实现了要求的基本功能,多数发挥部分也得到了实现,而且还具有一定的创新功能。关键字:单片机、 LCD液晶显示;温度采集;定时闹铃 目 录摘 要2前 言31设计方案41.1 显示模块41.2 温度模块41.3 键盘模块41.4 时钟模块51.5其他模块52总体框架53硬件电路53.1单片机最小系统:63.2温度测量模块:73.3 LCD液晶显示模块:73.4整体电路图84系统软件设计流程94.1主程序流程84.2 温度测量流程图104.3键值处理流程104.3处理事件流程115程序代码126 元件清单137 心得体会14附程序15参考文献30 前言时钟,自从它发明的那天起,就成为人类的朋友,但随着时间的推移,科学技术的不断发展,人们对时间计量的精度要求越来越高,应用越来越广。怎样让时钟更好的为人民服务,怎样让我们的老朋友焕发青春呢?这就要求人们不断设计出新型时钟。现今,高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟,石英表,石英钟都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调校,数字式电子钟用集成电路计时时,译码代替机械式传动,用LED显示器代替显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时,分,秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。时钟电路在计算机系统中起着非常重要的作用,是保证系统正常工作的基础。在一个单片机应用系统中,时钟有两方面的含义:一是指为保障系统正常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢;二是指系统的标准定时时钟,即定时时间,它通常有两种实现方法:一是用软件实现,即用单片机内部的可编程定时/计数器来实现,但误差很大,主要用在对时间精度要求不高的场合;二是用专门的时钟芯片实现,在对时间精度要求很高的情况下,通常采用这种方法,典型的时钟芯片有:DS1302,DS12887,X1203等都可以满足高精度的要求。本文主要介绍用单片机内部的定时/计数器来实现电子时钟的方法,本设计由单片机AT89S51芯片和LED数码管为核心,辅以必要的电路,构成了一个单片机电子时钟。1设计方案1.1 显示模块显示模块采用Lcd1602。Lcd1602液晶显示具有丰富多样性、灵活性、电路简单、易于控制而且功耗小等优点,对于信息量多的系统,是比较适合的。1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。因为1602识别的是ASCII码,试验可以用ASCII码直接赋值,在单片机编程中还可以用字符型常量或变量赋值,如A。 1.2 温度模块温度模块采用DS18B20,其独特的一线接口,只需要一条口线通信多点能力,简化了分布式温度传感应用 无需外部元件 可用数据总线供电,电压范围为3.0 V至5.5 V 无需备用电源 测量温度范围为-55 C至+125 。华氏相当于是-67 F到257华氏度 -10 C至+85 C范围内精度为0.5 。温度传感器可编程的分辨率为912位 温度转换为12位数字格式最大值为750毫秒,用户可定义的非易失性温度报警设置。应用范围包括恒温控制,工业系统,消费电子产品温度计,或任何热敏感系统。DS18B20的数字温度计提供9至12位(可编程设备温度读数。信息被发送到/从DS18B20 通过1线接口,所以中央微处理器与DS18B20只有一个一条口线连接。为读写以及温度转换可以从数据线本身获得能量,不需要外接电源。 因为每一个DS18B20的包含一个独特的序号,多个DS18B20可以同时存在于一条总线。这使得温度传感器放置在许多不同的地方。它的用途很多,包括空调环境控制,感测建筑物内温设备或机器,并进行过程监测和控制。1.3 键盘模块键盘模块采用44矩阵键盘。在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P2口)就可以构成44=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。1.4时钟模块时钟模块采用定时器0提供时钟源。定时/计数器0可以工作在4种工作方式中。工作方式0是13位的计数器;工作方式1是16位的计数器;工作方式2带有数据自动重装的功能,因此,定时更精确。经常用于波特率发生器。;工作方式3是将它当做两个8位的定时器来用。主要与另一个定时器工作于方式2时配套使用。为了方便处理和提高精度采用方式2。但要提供秒信号还需要一个计数器来记录中断的次数以产生秒信号。1.5其他模块程序提供校时功能,通过44矩阵键盘校时,键盘功能键(即键值大于9的6个键)和键盘的数字键(即键值为09的9个键)来校时。程序可以通过设定的时间计算出当天是星期几。并在Lcd1602的左上角显示出来。程序日期模块的年份区间为2000年到2099年一百年的时间。2总体框架AT89S52Lcd1602DS18B2044矩阵键盘蜂鸣器图1总体框架3硬件电路3.1单片机最小系统: 最小系统包括晶体振荡电路、复位开关和电源部分。图2为AT89C52单片机的最小系统。MCS-51是标准的40引脚双列直插式集成电路芯片,引脚分布请参照-单片机引脚图:l P0.0P0.7 P0口8位双向口线(在引脚的3932号端子)。 l P1.0P1.7 P1口8位双向口线(在引脚的18号端子)。l P2.0P2.7 P2口8位双向口线(在引脚的2128号端子)。 l P3.0P3.7 P3口8位双向口线(在引脚的1017号端子)。P0做一般的I/O使用,但内部无上拉电阻,作为输入或输出时应在外部接上拉电阻。 P1口只做I/O口使用:其内部有上拉电阻。P3 除了作为I/O使用外(其内部有上拉电阻),还有一些特殊功能,由特殊寄存器来设置2 图2 最小系统电路图程序下载接口图3-4如图3-4所示,由AT89S ISP构成的两排十针下载口,板图上有一个小方框,为1号引角;下载线的凸口为正方向,凸口的右侧边的第一个插孔为1号引角。3.2温度测量模块:温度测量传感器采用DALLAS公司DS18B20的单总线数字化温度传感器,测温范围为-55125,可编程为9位12位A/D转换精度,测温分辨率达到0.0625,采用寄生电源工作方式,CPU只需一根口线便能与DS18B20通信,占用CPU口线少,可节省大量引线和逻辑电路。接口电路如图3所示。图3 DS18B20测量电路3.3. LCD液晶显示模块:LCD液晶显示模块采用LCD1602型号,具有很低的功耗,正常工作时电流仅2.0mA/5.0V。通过编程实现自动关闭屏幕能够更有效的降低功耗。LCD1602分两行显示,每行可显示多达16个字符。LCD1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,通过内部指令可实现对其显示多样的控制,并且还能利用空余的空间自定义字符。 3.4. 整体电路图4系统软件设计流程4.1主程序流程开 始初始化Lcd1602初始化时间和日期初始化定时器处理事件 是否有键按下 否 是处理按键结 束图7 系统主程序流程4.2. 温度测量流程图如图11所示: 图11 温度测量程序流程图、键值处理4.3键值处理流程是否有按键 否 读取键值 清屏,状态标志为1键值为0x0a是否清屏,状态标志为2键值为0x0b是否设定时间键值为0x0c是否设定日期键值为0x0d是否状态标志为3键值为0x0e是否状态标志为0键值为0x0e 是结 束图9 键值处理流程图事件处理4.4 处理事件流程图 是否有秒信号秒信号清零 是显示时间和日期状态标志为0 否状态标志为1 是显示温度 否状态标志为2设定闹钟 是 否状态标志为3 否 是显示时间和日期 否闹钟时间是否到了 是结 束 图8 温度测量流程图5程序代码主程序代码5#includeFeiyun.huchar sws=3;void Init()LcdInit();TimeDateInit();TimerInit();void KeyPro()KEY temp;ReadKey(&temp);if(temp.c_key=0x0a)cls,sws=1;if(temp.c_key=0x0b)cls,sws=2;if(temp.c_key=0x0c)Set(0x08);if(temp.c_key=0x0d)Set(0x47);if(temp.c_key=0x0e)sws=3;if(temp.c_key=0x0f)sws=0;void MsgPro() if(timer.iscg&0xf0) timer.iscg&=0x0f;DateCg();if(sws=0) BuzzClose;TimeShow(); DateShow(); else if(sws=1) TempShow();else if(sws=2) AlarmClock();else if(sws=3)TimeShow(); DateShow(); if(CheckTime() BuzzOpen; void main()Init();while(1) MsgPro();if(KeyDown) KeyPro(); 6 元件清单元件名称数量型号芯片1个AT89C52芯片座1个DIP40液晶显示器1个1602温度传感器1个DS18B20复位开关17个电阻2个10k电阻1个1k瓷片电容2个33pf电解电容1个10uf无源晶振1个12MHZ排阻I1个RESPACK_8电池盒3组5号电池电路板排阵、导线若干7 心得体会王慧 自动化1002班 1006050203这次课程设计里我学到了很多在书本上所没有学到过的知识。以前在上课的时候,老师经常强调在写一个程序的时候,一定要事先把程序原理方框图化出来,但是我开始总觉得这样做没必要,很浪费时间。但是,这次课程设计完全改变了我以前的那种错误的认识,以前我接触的那些程序都是很短、很基础的,但是在课程设计中碰到的那些需要很多代码才能完成的任务,画程序方框图是很有必要的。因为通过程序方框图,在做设计的过程中,我们每一步要做什么,每一步要完成什么任务都有一个很清楚的思路,而且在程序测试的过程中也有利于查错。其次,以前对于编程工具的使用还处于一知半解的状态上,但是经过一段上机的实践,对于怎么去排错、查错,怎么去看每一步的运行结果,怎么去了解每个寄存器的内容以确保程序的正确性上都有了很大程度的提高。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。邵云杰 自动化1002班 1006050208回顾起此课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。,课程设计的过程中遇到问题,可以说得是困难重重,但可喜的是最终都得到了解决。实验过程中,也对团队精神的进行了考察,让我们在合作起来更加默契,在成功后一起体会喜悦的心情。果然是团结就是力量,只有互相之间默契融洽的配合才能换来最终完美的结果。 此次设计也让我明白了思路即出路,有什么不懂不明白的地方要及时请教或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识,收获颇丰。徐铣蔚 自动化1001班 1006050102 两周的课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。在设计过程中,与同学分工设计,和同学们相互探讨,相互学习,相互监督。学会了合作,学会了运筹帷幄,学会了宽容,学会了理解,也学会了做人与处世。 课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职业工作前一个必不少的过程”千里之行始于足下”,通过这次课程设计,我深深体会到这句千古名言的真正含义我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实的基础。 通过这次单片机数字电子钟设计,我在多方面都有所提高,综合运用本专业所学课程的理论和生产实际知识进行一次数字电子钟的设计设计工作的实际训练从而培养和提高独立工作能力,巩固与扩充了课程所学的内容,掌握设计的方法和步骤,掌握设计的基本的技能,同时各科相关的课程都有了全面的复习,独立思考的能力也有了提高。在这次设计过程中,体现出设计电路的能力以及综合运用知识的能力,体会了学以致用、突出劳动成果的喜悦心情,从中发现自己平时学习的不足和薄弱环节,从而加以弥补。 【附程序】1、时间日期的设置初始化#includeFeiyun.huchar hour=0;uchar min=0;uchar sec=0;uchar year=0;uchar month=0;uchar day=0;uchar ahour=0;uchar amin=0;void TimeDateInit() /时间和日期的初始化year=11;month=6;day=19;hour=23;min=0;sec=0;ahour=23;amin=1;uchar isleep(y) return !(y%4);uchar GetMDM(y,m) uchar mon=31,28,31,30,31,30,31,31,30,31,30,31;if(m=2) return mon1+isleep(y);else return monm-1;uint GetMDY(y) if(isleep(y)return 366;else return 365;uchar GetWeek() uint num=0;uchar i,week;for(i=1;iyear;i+) num+=GetMDY(i);for(i=1;iGetMDM(year,month) day=1,month+; if(month12) month=1,year+;void TimeCg() /时间模块 sec+; if(sec=60) sec=0,min+; if(min=60) min=0,hour+; String TimetoStr() uchar time6;uchar buf6;uchar i;time0=hour/10-1+1;time1=hour%10-1+1;time2=min/10-1+1;time3=min%10-1+1;time4=sec/10-1+1;time5=sec%10-1+1;for(i=0;i6;i+)bufi=timei;return buf;void TimeShow() /用LCD1602显示时间 String time;time=TimetoStr();LcdStr(0x04,Time);LcdData(0x08,hour);LcdChar(0x0a,-);LcdData(0x0b,min);LcdChar(0x0d,-);LcdData(0x0e,sec);String DatetoStr() /日期模块uchar Date6;uchar buf6;uchar i;Date0=year/10+1-1;Date1=year%10+1-1;Date2=month/10+1-1;Date3=month%10+1-1;Date4=day/10+1-1;Date5=day%10+1-1;for(i=0;i6;i+)bufi=Datei;return buf;void WeekShow() uchar wk=Sun Mon Tue Wed Thu Fri Sat Erro; uchar D=Date 20;uchar week=0;uchar i;pd(0x00);week=GetWeek();for(i=0;i4;i+)write_data(wkweek*4+i);pd(0x40);for(i=0;i7;i+)write_data(Di);void DateShow()String date;WeekShow();date=DatetoStr();write_data(date0);write_data(date1);write_data(-);write_data(date2);write_data(date3);write_data(-);write_data(date4);write_data(date5);pd(0x50);void Loadbuf(uchar p,String buf) if(p=0x08)buf0=hour/10;buf1=hour%10;buf2=min/10;buf3=min%10;buf4=sec/10;buf5=sec%10; if(p=0x47)buf0=year/10;buf1=year%10;buf2=month/10;buf3=month%10;buf4=day/10;buf5=day%10;void Save(uchar p,String buf)if(p=0x08)hour=buf0*10+buf1;min=buf2*10+buf3;sec=buf4*10+buf5;if(p=0x47)year=buf0*10+buf1;month=buf2*10+buf3;day=buf4*10+buf5;void Set(uchar p) uchar i=0; uchar tmp8=0,1,1,2,3,3,4,5; uchar imr8=1,3,4,4,6,6,7,0; uchar iml8=7,0,1,1,3,4,4,6; uchar buf6=0,0,0,0,0,0; uchar dat=0x10; Loadbuf(p,buf); while(dat!=0x0f)&(dat!=0x0e) if(KeyDown) dat=scankey(); if(dat0x10) if(dat0x0a) buftmpi=dat; write_data(buftmpi+1-1); dat=0x10; i=imri; else switch (dat) case 12: dat=0x10; i=imli;break; case 13: dat=0x10; i=imri;break; case 14: Save(p,buf);break; case 15:break; pd(p+i); pd(0x50); void setahour() uchar dat=0xff,state;pd(0x45);while(dat!=0x0e) if(dat0x10) if(state=0) state+; ahour=ahour%10; ahour=ahour+dat*10; LcdData(0x45,ahour); pd(0x46);else state=0; ahour=ahour/10; ahour=ahour*10; ahour=ahour+dat; LcdData(0x45,ahour); pd(0x45);if(KeyDown) dat=scankey();else dat=0xff; pd(0x50);void setamin() uchar dat=0xff,state;pd(0x4c);while(dat!=0x0e) if(dat0;t-); void reset(void) /DS18B20复位函数 uchar state=1; while(state) while(state) DQ=1; _nop_();_nop_(); DQ=0; delay_us(50); DQ=1; delay_us(6); state=DQ; delay_us(45); state=DQ; DQ=1;void write_byte(uchar val)/写一个字节 uchar i; for(i=8;i0;i-) DQ=1;_nop_();_nop_(); DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_(); DQ=val&0x01; delay_us(6); val=val/2; DQ=1; _nop_(); uchar read_byte(void) /读一个字节 uchar i;uchar value=0;for(i=8;i0;i-) DQ=1;_nop_();_nop_(); value=1; DQ=0; _nop_();_nop_();_nop_();_nop_(); DQ=1;_nop_();_nop_();_nop_();_nop_(); if(DQ)value|=0x80; delay_us(6); DQ=1;return(value);void gettemp() uchar a,b;uint t; reset();write_byte(0xcc);write_byte(0xbe);a=read_byte(); /读取高字节b=read_byte(); /读取低字节reset();write_byte(0xcc);write_byte(0x44);/处理读取温度t t=b;t0xfff) /判断温度是为正还是为负 t=t+1; /负值换算 t=t*(0.625); /温度扩大10倍,精确到1位小数if(temp-t)100|(t-temp)100)temp=t;void TempShow() /温度读取函数 char buf4;gettemp(); buf0=temp%1000/100+0x30; /十位数 buf1=temp%100/10+0x30; /个位数buf2=.; buf3=temp%10+0x30; /小数位pd(0x40); write_data(buf0);write_data(buf1);write_data(buf2);write_data(buf3);write_data(du);write_data(C);LcdStr(0x00,The Temperature:);3、扫描函数#includeFeiyun.huchar code Key=1,2,3,10,4,5,6,11,7,8,9,14,0,12,13,15;uchar code check=0xe7,0xd7,0xb7,0x77,0xeb,0xdb,0xbb,0x7b,0xed,0xdd,0xbd,0x7d,0xee,0xde,0xbe,0x7e;uchar code num=0123456789UDLREQ;uchar scankey(void) /扫描函数uchar readkey,key,i;uchar x_key,y_key; /X为行,Y为竖uchar dat;scan:P2=0xf0;delay(20); /去抖if(P2!=0xf0) /确认有键按下y_key=P2; /读Y键值P2=0x0f;while(P2=0x0f); x_key=P2; /读X键值while(P2!=0x0f); /是否释放键 readkey=y_key|x_key; /读取键值特征码;else goto scan; /重新扫描for(i=0;i16;i+)if(readkey=checki) key=i;key=Keykey;if(key=0) dat=key;else scankey();delay(20);while(KeyDown); return dat;uchar ReadKey(KEY *dat) char temp,buf;if(KeyDown) temp=1;buf=scankey();if(buf!=dat-c_key|dat-iscg=0)dat-iscg=1;dat-l_key=dat-c_key;dat-c_key=buf;elsetemp=0;dat-iscg=0;return temp;4、液晶显示器#includeFeiyun.hvoid write_com(uchar com)lcdrs=0;lcdrw=0;P0=com;delay(1);lcden=1;delay(1);lcden=0;void write_data(uchar date) lcdrs=1;lcdrw=0;P0=date;delay(1);lcden=1;delay(1);lcden=0; void LcdInit(void)lcden=0;write_com(0x38);write_com(0x0f);write_com(0x06);write_com(0x01);void LcdChar(uchar p,uchar dat)pd(p);write_data(dat);pd(0x50);void LcdStr(uchar p,String str)pd(p);while(*str!=0) write_data(*str); str+; /指向下一个要发送的数据 pd(0x50);void LcdData(uchar p,uchar dat)pd(p);write

温馨提示

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

评论

0/150

提交评论