




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、单片机原理与应用课程名称: 单片机原理与应用 设计题目: 电子钟 院 系: 电子信息工程学院 班 级: 自动化 设 计 者: 全宏宇 指导教师: 一,设计目标LCD显示电子钟的基本功能1,实现时钟功能;2,实现闹铃功能;3,实现秒表功能;4,具有一定的计时精度。LCD显示电子钟的基本要求1,掌握单片机开发编程设计的基本流程;2,了解Keil及Proteus软件的基本使用;3,了解LCD的基本使用;4,学习单片机硬件制作。二,具体实现1,软件平台1)Keil编程Keil 的开发工具的使用的基本过程: 创建 C 或汇编语言的源程序;编译或汇编源文件;纠正源文件中的错误;从编译器和汇编器连接目标文件
2、;测试连接的应用程序。2)Proteus仿真 Proteus软件不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。在编译方面,它也支持IAR,Keil,PLAB等多种编译器。2,硬件开发平台JD51开发板的基本资料 LED 电路,8 只独立LED 发光管,可做指示或各种闪烁效果用。 数码管电路,4只共阳一体8 段数码显示管,可实现各种数据显示,如计数、时钟等。 蜂鸣器电路,可用于设计各种提示音、演奏音乐等。 键盘电路,学习按键控制相关编程。 LCD 显示电路,编程控制LCD 显示。 串口电路,学习编程实现JD51 和PC 或其他符合该通信
3、协议的电路之间的通信。 红外电路,通过选配的红外遥控器,学习红外解码并可实现红外遥控JD51。 温度模块电路,采用一线式温度传感器实现温度的采集并可显示在数码管或者LCD 上,通过温度数据处理便可实现温度控制器功能。 除了以上提到的可编程电路本学习板还有一些常用的不可编程电路,包括电源电路、复位电路、晶振电路等。 本次LCD电子钟实验用到其中的蜂鸣器,按键,LCD显示接口。3,总体设计1) 基本资源的使用本次实验采用了型单片机,液晶显示屏,蜂鸣器。为了实现时钟,定时,闹钟,秒表的功能,用到了单片机的外部中断,计时器中断,及端口资源功能外部中断外部中断INT1 模式选择(时钟,调时,秒表,闹钟)
4、外部中断INT0 秒表的暂停,清零定时器定时器T0 秒表,时钟定时基准定时器T1 音乐闹铃的音符产生I/O端口P1,P2 LCD接口,蜂鸣器2)软件仿真(1)程序设计的一些关键问题(具体参照后面的程序清单)建立Keil工程时,注意对程序编译环境进行设置;设置内容包括器件,频率,产生文件等。 LCD管脚及控制字;LCD管脚的定义控制字1602液晶模块的读写操作,屏幕和光标的操作都是通过指令编程来实现的。指令1:清显示,指令码01H,光标复位到地址00H位置指令2:光标复位,光标返回到地址00H指令3:光标和显示位置设置I/D,光标移动方向,高电平右移,低电平左移,S:屏幕上所有文字是否左移或右移
5、,高电平表示有效,低电平表示无效。指令4:显示开关控制。D:控制整体的显示开与关,高电平表示开显示,低电平表示关显示。C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。指令5:光标或显示移位 S/C :高电平时显示移动的文字,低电平时移动光标指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时为双行显示,F:低电平时显示5X7的点阵字符,高电平时显示5X10的显示字符。指令7:字符发生器RAM地址设置。指令8:DDRAM地址设置。指令9:读忙信号和光标地址 BF:忙标志位,高电平表示忙,此时
6、模块不能接收命令或数据,如果为低电平表示不忙。 LCD实现滚动显示;方法一:采用控制命令,显示后画面移动一个字符;方法二:循环使用显示不同位置,形成滚动效果。秒表主要是产生计时基准.秒,有了基准之后需要解决的问题是如何实现有效的暂停,清零(达到精准动作),采用中断是很不错的结果。闹铃主要是如何实现闹铃关闭的逻辑,if(f&&g)语句可以实现这一动作。提高计时精度 本程序除了调时模式外,其他模式的时候时钟都在跑动,提高了因模式转换而导致的时间精度降低。(2)Proteus仿真在Proteus中画出如下电路图,添加文件,进行虚拟仿真。2) 开发板运行调试在板上烧制程序,根据实际的效
7、果,对中断的反应时间,显示效果做出了调整,整体效果不错,只是音乐的效果不佳,主要是由于如果将蜂鸣器换成扬声器效果会好些,还可以在程序中增加节拍来增加音乐效果。4,硬件制作根据仿真电路图购买元件进行焊接,下载程序效果后,液晶显示器显示乱码,检查电路后已无连接错误,但功能依然没有实现,相关检查在进行中。三,设计体会本次课程设计系统地学习了单片编程开发及实际电路的制作。学习了的语言编程的基本知识,Proteus仿真软件的模拟仿真,开发实验板的使用,本次课设,时间了较多的其他案例,比较全面的掌握了单片机的运营,包括编程,电路,器件等,在知识上有了很多的长进。本次课程设计还有很多其他收获,锻炼了自学的能
8、力,特别是动手实践方面的东西,让我深深感受到理论与实际的差距,实际当中会有一些小的问题,这些问题是意想不到的,需要去思考,去解决,这是很锻炼人的。四,程序#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define ulong unsigned long#define uint unsigned intuchar idata welcome16=" clock "/定义第一行显示数组uchar idata lwelcome16=" clock "/定义
9、第一行显示数组uchar idata llwelcome16=" clock "/定义第一行显示数组uchar idata lllwelcome16=" clock "/定义第一行显示数组uchar idata sslcdtimer16=" 00:00:00 "uchar idata tsslcdtimer16=" 00:00:00 "uchar idata lcdtimer16=" 00:00:00 "/定义第二行显示数组uchar idata mlcdtimer16=" 00: :
10、 "/定义第二行显示数组uchar idata hlcdtimer16=" :00: "/定义第二行显示数组uchar idata setlcdtimer16=" 00:01:00 "uchar timecount;uchar temps;bit timeflag;bit sstimeflag;sbit ring=P20;/蜂鸣闹铃 sbit e=P27;/显示器sbit rw=P26;/显示器sbit rs=P25;/显示器 sbit P10=P10; /测试用闪灯 sbit Key=P32;/秒表暂停,清零sbit Key0=P33;/调时
11、,设定闹钟时间,秒表选择sbit Key1=P34;/调时,设定闹钟时间改变uchar th1_f; /在中断中装载的T0的值高8位uchar tl1_f; /在中断中装载的T0的值低8位uint m=0;uint n=0;ulong i;uint f=0,g=1; uint j,k; uchar code freq314=0xF2,0x42, 0xF3,0xC1, 0xF5,0x17, 0xF5,0xB6, 0xF6,0xD0, 0xF7,0xD1, 0xF8,0xB6, 0xF9,0x21, 0xF9,0xE0, 0xFA,0x8B, 0xFA,0xD7, 0xFB,0x68, 0xFB,
12、0xE8, 0xFC,0x5B , 0xFC,0x8D, 0xFC,0xEE, 0xFD,0x44, 0xFD,0x6D, 0xFD,0xB4, 0xFD,0xF4, 0xFE,0x2D, ; /音乐频率表,低音,中音,高音,系统振荡频率11.0592MHzuint code song1=26,25,23,25,31,26,25,26,23,25,26,25,23,22,21,16,25,23,22,22,23,23,23,26,23,22,21,25,23,22,21,16,21,15,26,25,23,25,31,26,25,26,23,25,26,25,23,22,21,16,25,23
13、,22,22,23,23,23,26,23,22,21,25,23,22,21,16,21,15; /编制音乐 /*/软件延时函数(系统晶振为11.0592MHz),延时时间约为40s/入口条件:无符号整型变量del1,最终的延时时间为(del1*40)s/*void delay(uint del1)uchar del2;for(;del1>0;del1-)for(del2=10;del2>0;del2-);/*/液晶显示器判忙函数/*void busy()uchar temp;temp=0x00;rs=0;rw=1;while(temp&0x80)=0x80)P0=0xf
14、f;e=1;temp=P0;e=0; /*/向液晶显示器写命令函数/*void WR_Com(uchar temp)busy();rs=0;rw=0;P0=temp;e=1;e=0;/*/向液晶显示器写数据函数/*void WR_Data(uchar num)busy();rs=1;rw=0;P0=num;e=1;e=0;/*/向液晶显示器写入显示数据函数/入口条件:液晶显示器行首地址(指示第一行还是第二行)和待显示数组的首地址/*/void disp_lcdchar(uchar addr,uchar temp1)/ WR_Com(addr);/delay(100);/WR_Data(temp
15、1); /void disp_lcd(uchar addr,uchar *temp1)uchar i;WR_Com(addr);delay(100);for(i=0;i<16;i+)WR_Data(temp1i);delay(100);/*/液晶显示器初始化函数/*void lcd_ini()char i;for(i=3;i>0;i-)P0=0x30;rs=0;rw=0;e=1;e=0;delay(100);P0=0x38;rs=0;rw=0;e=1;e=0;delay(100);/*/液晶显示器复位函数/*void lcd_Reset()WR_Com(0x01);delay(10
16、0);WR_Com(0x06);delay(100);WR_Com(0x0c);delay(100); /*/外部中断函数,秒表暂停,清零/*void modess() interrupt 0 using 0 delay(10000); n+;if(n=3)n=0; /*/外部中断函数,模式选择/*void modepp() interrupt 2 using 1delay(30000); m+;if(m=6)n=0;if(m=7)m=0; /*/定时/计数器中断函数,1S及0.01S/*void timer0() interrupt 1 using 2TH0=0xdc;TL0=0x23;ss
17、timeflag=1;if(-timecount=0)timecount=100;timeflag=1; /*/定时/计数器中断函数,装入音乐频率计数初值/*void timer1() interrupt 3 using 3 TL1=tl1_f;TH0=th1_f; /调入预定时值 ring=!ring; /取反音乐输出IO /*/主函数/*void main() P10=1;lcd_ini();lcd_Reset();/*for(i=0;i<10;i+) temps=welcomei; disp_lcdchar(0x80+1,temps); /LCD 单字符从左到右显示 delay(1
18、0000); */disp_lcd(0x80,welcome); delay(10000);disp_lcd(0x80,lwelcome); delay(10000);disp_lcd(0x80,llwelcome); delay(10000);disp_lcd(0x80,lllwelcome);delay(10000);disp_lcd(0x80,llwelcome);delay(10000);disp_lcd(0x80,lwelcome);delay(10000);disp_lcd(0x80,welcome);/LCD滚动显示delay(10000); disp_lcd(0xc0,lcdt
19、imer);P10=0;TMOD=0x11;TH0=0xdc;TL0=0x23;TR0=1; IE=0x86;timeflag=0; /1秒计时标志sstimeflag=0; /0.01秒计时标志timecount=100;while(1) while(m=6)/秒表 IE=0x87; if(n=0) /秒表跑动 if(sstimeflag=1) sstimeflag=0; sslcdtimer11+=1; if(sslcdtimer11>=0x3a) sslcdtimer11=0x30; sslcdtimer10+=1; if(sslcdtimer10>=0x3a) sslcdt
20、imer10=0x30; sslcdtimer8+=1; if(sslcdtimer8>=0x3a) sslcdtimer8=0x30; sslcdtimer7+=1; if(sslcdtimer7>=0x36) sslcdtimer7=0x30; disp_lcd(0xc0,sslcdtimer); if(n=1)/秒表暂停 disp_lcd(0xc0,sslcdtimer); if(n>=2)/秒表清零 disp_lcd(0xc0,tsslcdtimer); for(i=0;i<16;i+) sslcdtimeri=tsslcdtimeri; while(m=0|m
21、>=3) /时钟程序,只要不是调时,就一直运行 IE=0x86; if(timeflag=1) timeflag=0;lcdtimer11+=1;if(lcdtimer11>=0x3a)lcdtimer11=0x30;lcdtimer10+=1;if(lcdtimer10>=0x36)lcdtimer10=0x30;lcdtimer8+=1;if(lcdtimer8>=0x3a)lcdtimer8=0x30;lcdtimer7+=1; if(lcdtimer7>=0x36)lcdtimer7=0x30;lcdtimer5+=1; if(lcdtimer5>=
22、0x3a) lcdtimer5=0x30; lcdtimer4+=1; if(lcdtimer4>=0x33&&lcdtimer5>=0x35) lcdtimer5=0x30; lcdtimer4=0x30; if(m=0) disp_lcd(0xc0,lcdtimer); if(!Key1)/关掉闹钟 g=0; if(lcdtimer8=setlcdtimer8&&lcdtimer7=setlcdtimer7&&lcdtimer5=setlcdtimer5&&lcdtimer4=setlcdtimer4) f=1;
23、/开启闹钟 ,播放音乐 if(f&&g) /*ring=1; delay(10000); ring=0; f=0; */ IE=0x8e; j=song1i/10-1; k=2*(song1i%10-1); th1_f=freqjk; /取出对应的定时值送给T0 tl1_f=freqj+k; TR1=1;for(n=0;n<50000;n+); /音符间延时 i+;TR1=0;f=0; while(m=1) /调时分 if(!Key1) delay(10000); timeflag=0; lcdtimer8+=1; if(lcdtimer8>=0x3a)lcdtim
24、er8=0x30;lcdtimer7+=1;if(lcdtimer7>=0x36) lcdtimer7=0x30; disp_lcd(0xc0,lcdtimer);delay(8000);mlcdtimer11=lcdtimer11;mlcdtimer10=lcdtimer10;mlcdtimer5=lcdtimer5;mlcdtimer4=lcdtimer4;disp_lcd(0xc0,mlcdtimer); while(m=2) /调时时 if(!Key1) delay(10000); lcdtimer5+=1; if(lcdtimer5>=0x3a)lcdtimer5=0x30;lcdtimer4+=1; if(lcdtimer4=0x32&&lcdtimer5>=0x34) lcdtimer5=0x30; lcdtimer4=0x30; disp_lcd(0xc0,lcdtimer);delay(8000); hlcdtimer11=lcdtimer11;hlcdtimer10=lcdtimer10;hlcdtimer8=lcdtime
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 车间职工管理方案模板
- 菜园农场改造方案
- 郑州幼教面试题及答案
- 南充日报面试题及答案
- 墓地整治工程方案
- 先锋团员面试题及答案
- 合作开发项目收益分配与知识产权保护协议
- 销售公司检查活动方案
- 西语财务面试题及答案
- 摩托机车考试题及答案
- JJG 648-2017非连续累计自动衡器(累计料斗秤)
- GB/T 6082-2001直齿插齿刀通用技术条件
- GB/T 2934-2007联运通用平托盘主要尺寸及公差
- 品牌战略定位课件
- 2022年武汉东湖学院辅导员招聘考试笔试试题及答案解析
- 医疗技术分级授权与再授权申请表
- 儿童腺病毒肺炎诊疗规范课件
- MBTI人格理论教学课件
- DB65∕T 2810-2009 核桃玛仁糖-行业标准
- 商业银行风险预警系统整体架构设计
- UPVC双壁波纹管
评论
0/150
提交评论