




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于单片机89C52的液晶数字钟设计摘要 设计采用定时计数器工作方式1进行数值上的累加,经过延时程序,lcd1602驱动程序和时间格式转换程序,实现了数字钟的正常运转以及显示。添加整点报时,用1个if语句设置整点条件调用蜂鸣器程序实现功能;添加闹钟功能,通过当前时间与闹钟时间的对比促使蜂鸣器发声。关键词 定时计数器 LCD1602 闹钟 单片机89C52 1. 电路设计1.1主体设计1.1.1设计原理 蜂鸣器LCD1602 At89c52晶振5个四脚独立键(有复位)P1(0.1.2.3)图1.1.1器件设计图 如器件设计图所示,这是器件摆放的位置图。Lcd1602的DB端接单片机的P0端,使用P0端要外接上拉电阻,这里放置10k阻值的排阻。蜂鸣器需要三极管放大后方可使用。开关用四脚独立按键,接P1端。使用12MHz的晶振。1.2各部分设计1.2.1时钟设计单片机的时钟有两种方式产生,分别是内部方式和外部方式。设计采用内部方式。产生时钟的是振荡电路。由一个12MHz的晶振和两个30pF的串联着的电容并联在一起,形成谐振电路。晶振和电容大小涉及电路振荡频率的稳定性和大小,以及起振响应速度。1.2.2复位设计复位有两种,区别在于是否有开关。按一次开关,电位变化形成一次脉冲,使单片机复位。采用10k电阻和10uF的电解电容。1.2.3按键设计有三种模式,分别是工作模式,当前时间设置模式,闹铃时间设置模式。(1)工作模式。就是正常数字钟功能,有整点报时功能。(2)当前时间设置模式。1键进入该模式,之后,1键调时,2键调分,3键确认。(3)闹铃时间设置模式。3键进入该模式,之后,1键调时,2键调分,3键确认,4键打开闹铃。工作模式2键可以查看闹铃时间。1.2.4lcd1602设计Lcd1602的DB端接单片机的P0端,2和15脚接5v,其他的接地。加10k排阻,程序正确,电路无差错,可正常使用。1.2.5蜂鸣器设计蜂鸣器通过三极管放大后使用,作用有闹铃和整点报时的发声。三极管采用pnp型规格。1.3软件仿真Proteus 7.5图1.3仿真图 设计仿真用到的器件在此版本软件上都能找到。仿真实现了,证明程序无错,可以使用。开关BUTTON,单片机AT89C51,晶振CRVSTAL,电容CAP,电解电容CAP-POL,电阻RES,排阻RES-PACK-8,液晶LMD16L,pnp三极管,蜂鸣器用扬声器代替SPEAKER。连接好线路,调好器件电压5v,就可以下载程序,仿真成功实现了。1.4 硬件Altium Designer 10图1.4PCB设计硬件需要此软件绘制电路印制图。器件封装有自带的,也需要自己绘制,建议封装均检查一遍。3.硬件分析3.1硬件的使用按键采用的是四脚独立按键,实质上用到的是两个引脚两个距离比较窄的脚。复位电路中电解电容的使用,不是限制电流的大小,而是控制复位时间,晶振要靠近51芯片3.2调试先仿真后做实物,遇到的问题较少。调试过程,先检查最小系统,包括晶振电路,复位电路。复位时发现,若用瓷片电容,则调换为电容接地,电阻接5V。注意1602接排阻。实物检测1.上电后,正常液晶显示,并报时。2.设置时间,按1键进入,按1键调时,2键调分,3键完成。3.设置闹钟,按1键进入,按1键调时,2键调分,3键完成,4键打开。4.到整点响铃,闹钟时间到响铃。2键可查看闹钟时间。 功能全部实现,除复位键,每个键两个功能。5.结论 设计主要是程序上的运用,辅以相应的器件。用到的器件都是常见,所以操作上并不难。仿真用来查看程序缺漏,减少实物制作过程的失败率,以及防止设计偏离方向。硬件设计上,分部好地线和火线,火线内部,地线外部,两根主线的设计方便器件正确插入。焊接是最后的工序,容易出错,先前工序无错,也容易找出错的地方。 论文讲了项目的程序思想,电路原理,器件的选择以及需要注意的事项。6. 程序#include#include#define uint unsigned int#define uchar unsigned char#define LCD1602_DB P0 /定义1602的DB口为P0口uchar code table=CurrentTime; /当前时间uchar code table1=00:00:00;uchar key1Flag = 0;/定义按键关闭符uchar key2Flag = 0;uchar key3Flag = 0;uchar key4Flag = 0;uchar temp = 0;uchar sec = 0;/秒uchar min = 0;/分uchar hour = 0;/小时uchar clkHour = 0;/闹钟小时uchar clkMin = 0;/分uchar clkFlag = 0;/ 定义闹钟关闭符uchar beepNum = 0;/声音sbit LCD1602_RS = P20;/指令1/数据0选择端sbit LCD1602_RW = P21;/读1写0选择端sbit LCD1602_E = P22;/读1写0使能端sbit Key1 = P10;/定义键位符sbit Key2 = P11;sbit Key3 = P12;sbit Key4 = P13;sbit Speaker = P25;/定义蜂鸣器void Delay1ms()/12.000MHzuchar i, j;i = 12;j = 169;dowhile (-j); while (-i);void Delay20ms()/12.000MHzuchar i, j, k;_nop_();_nop_();i = 1;j = 234;k = 113;dodowhile (-k); while (-j); while (-i);void Beep() /蜂鸣器警报 Speaker = 0;Delay20ms();Speaker = 1;void LcdWaitReady()uchar sta;LCD1602_DB = 0xFF;LCD1602_RS = 0;LCD1602_RW = 1;doLCD1602_E = 1;sta = LCD1602_DB;LCD1602_E = 0;while(sta & 0x80);void LcdWriteCmd(uchar cmd)LcdWaitReady();LCD1602_RS = 0;LCD1602_RW = 0;LCD1602_DB = cmd;LCD1602_E = 1;LCD1602_E = 0;void LcdWriteDat(uchar dat)LcdWaitReady();LCD1602_RS = 1;LCD1602_RW = 0;LCD1602_DB = dat;LCD1602_E = 1;LCD1602_E = 0;void LcdSetCursor(uchar x, uchar y)/时间设置uchar addr;if(y = 0)addr = 0x00 + x;elseaddr = 0x40 + x;LcdWriteCmd(addr | 0x80);void LcdShowStr(uchar x, uchar y, uchar *str) LcdSetCursor(x, y);while(*str != 0)LcdWriteDat(*str+); void InitLcd1602() LcdWriteCmd(0x38);LcdWriteCmd(0x0C);LcdWriteCmd(0x06);LcdWriteCmd(0x01);void WriteAddress(uchar x) LcdWriteCmd(0x80 + x);void DisplayMinTens() /显示分十位WriteAddress(0x49);LcdWriteDat(min / 10) + 0);Delay1ms();void DisplayMinUnits() /显示分个位 WriteAddress(0x4A);LcdWriteDat(min % 10) + 0);Delay1ms();void DisplayHourTens() /显示时十位WriteAddress(0x46);LcdWriteDat(hour / 10) + 0);Delay1ms();void DisplayHourUnits()/显示时个位 WriteAddress(0x47);LcdWriteDat(hour % 10) + 0);Delay1ms();void DisplayClkMinTens() /显示闹钟分十位 WriteAddress(0x49);LcdWriteDat(clkMin / 10) + 0);Delay1ms();void DisplayClkMinUnits() /显示闹钟分个位 WriteAddress(0x4A);LcdWriteDat(clkMin % 10) + 0);Delay1ms();void DisplayClkHourTens() /显示闹钟时十位WriteAddress(0x46);LcdWriteDat(clkHour / 10) + 0);Delay1ms();void DisplayClkHourUnits() /显示闹钟时个位 WriteAddress(0x47);LcdWriteDat(clkHour % 10) + 0);Delay1ms();void DisplayClkSecTens() /显示秒十位 WriteAddress(0x4C);LcdWriteDat(sec / 10) + 0);Delay1ms();void DisplayClkSecUnits() /显示秒个位WriteAddress(0x4D);LcdWriteDat(sec % 10) + 0);Delay1ms();void ScanKey4()if(Key4 = 0)&(clkFlag =1) Delay20ms();if(Key4 = 0)&(clkFlag =1) clkFlag = 0;beepNum = 0;key4Flag = 0;void InitTimer0()/初始化定时器0 TMOD = 0x01; TH0 = (65536 - 50000) / 256;TL0 = (65536 - 50000) % 256;EA = 1;ET0 = 1;TR0 = 1;void main() InitLcd1602();LcdShowStr(0,0,table);LcdShowStr(6,1,table1);InitTimer0();while(1) if(sec = 60) sec = 0;min+;if(min = 60) min = 0;hour+;if(hour = 24) hour = 0;LcdShowStr(0,0,table);DisplayHourTens();DisplayHourUnits();LcdShowStr(8,1,:);DisplayMinTens();DisplayMinUnits();LcdShowStr(11,1,:);DisplayClkSecUnits();DisplayClkSecTens();/=if(Key1 = 0)&(key1Flag = 0) /设置当前时间Delay20ms();if(Key1 = 0)&(key1Flag = 0) TR0 = 0;InitLcd1602();LcdShowStr(0,0,SetCurrentTime);DisplayHourTens();DisplayHourUnits();LcdShowStr(8,1,:);DisplayMinTens();DisplayMinUnits();key1Flag = 1; while(key1Flag = 1) if(Key1 = 0) Delay20ms();if(Key1 = 0) hour+;if(hour = 24) hour = 0;DisplayHourTens();DisplayHourUnits();LcdShowStr(8,1,:);DisplayMinTens();DisplayMinUnits();if(Key2 = 0) Delay20ms();if(Key2 = 0) min+;if(min = 60) min = 0;hour+;DisplayHourTens();DisplayHourUnits();LcdShowStr(8,1,:);DisplayMinTens();DisplayMinUnits();if(Key3 = 0)&(key1Flag = 1) /退出设置当前时间Delay20ms();if(Key3 = 0)&(key1Flag = 1) InitLcd1602();LcdShowStr(0,0,table);DisplayHourTens();DisplayHourUnits();LcdShowStr(8,1,:);DisplayMinTens();DisplayMinUnits();LcdShowStr(11,1,:);DisplayClkSecUnits();DisplayClkSecTens();key1Flag = 0;TR0 = 1;/=if(min=0)&(sec3) /时间到整点 Beep(); Delay20ms();/=if(Key2 = 0)&(key2Flag = 0) /显示闹钟时间Delay20ms();if(Key2 = 0)&(key2Flag = 0) key2Flag = 1;InitLcd1602();while(key2Flag = 1) LcdShowStr(0,0,Clock Time);DisplayClkHourTens();DisplayClkHourUnits();LcdShowStr(8,1,:);DisplayClkMinTens();DisplayClkMinUnits();if(Key2 = 0) Delay20ms();if(Key2 = 0) key2Flag = 0;InitLcd1602();DisplayHourTens();DisplayHourUnits();LcdShowStr(8,1,:);DisplayMinTens();DisplayMinUnits();LcdShowStr(11,1,:);DisplayClkSecUnits();DisplayClkSecTens(); /=if(Key3 = 0)&(key3Flag = 0) /设置闹钟时间Delay20ms();if(Key3 = 0)&(key3Flag = 0) TR0 = 0;InitLcd1602();LcdShowStr(0,0,SetClockTime);DisplayClkHourTens();DisplayClkHourUnits();LcdShowStr(8,1,:);DisplayClkMinTens();DisplayClkMinUnits();key3Flag = 1;while(key3Flag = 1) if(Key1 = 0) Delay20ms();if(Key1 = 0) clkHour+; if(clkHour = 24) clkHour = 0; DisplayClkHourTens(); DisplayClkHourUnits(); LcdShowStr(8,1,:); DisplayClkMinTens(); DisplayClkMinUnits();if(Key2 = 0) Delay20ms();if(Key2 = 0) clkMin+;if(clkMin = 60) clkHour+;clkMin = 0; DisplayClkHourTens(); DisplayClkHourUnits(); LcdShowStr(8,1,:); DisplayClkMinTens(); DisplayClkMinUnits();if(Key3 = 0) /退出设置闹钟时间Delay20ms();if(Key3 = 0) key3Flag = 0;InitLcd1602();TR0 = 1;DisplayHourTens();DisplayHourUnits();LcdShowStr(8,1,:);DisplayMinTens();DisplayMinUnits();LcdShowStr(11,1,:);DisplayClkSecUnits();DisplayClkSecTens();/=if(Key4 = 0)&(key4Flag = 0) /闹钟ON/OFF位设置Delay2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 惠州烟花安全知识培训课件
- 情绪小怪兽课件
- 深海新质生产力
- 新员工培训活动方案
- 公司员工绩效考核方案管理
- 恒温机械设备基础知识培训课件
- 恐龙课件教学课件
- 制定教学工作进度方案
- 2026届山东省青岛胶州市化学高二第一学期期末达标检测试题含答案
- 装修勘察考试题及答案
- 小海豚加油站加盟合同范本
- 初中物理实验教案汇编
- 浙江省消防技术规范难点问题操作技术指南(2020版)
- 武理工水处理生物学课件第11章 污水生物处理系统中的微生物
- 临床实验中不良事件的管理
- 如何开展课题研究
- 英语选修4单词表
- 炼钢厂电工应知应会考试题库500题(含各题型)
- GB/T 3840-1991制定地方大气污染物排放标准的技术方法
- 旅游区奖惩制度管理办法
- 小学语文人教六年级上册《童年》整书阅读课件
评论
0/150
提交评论