




免费预览已结束,剩余22页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
物理与机电工程学院课程设计报告课程名称: 单片机课程设计 系 部: 物理与机电工程学院 专业班级: 09电子信息工程2班 学生姓名: 指导教师: 王清辉 完成时间: 2012年3月16日 报告成绩: 评阅意见: 评阅教师 日期 单片机原理课程设计一、设计任务与要求1、具有小时分秒时间显示。2、能够设置闹钟至少5次闹钟时间。3、可利用按键修改时间,具有上午下午的提示信息。二、方案设计与论证方案一:采用实时时钟芯片实时时钟芯片具备年、月、日、时、分、秒计时功能和多点定时功能,计时数据的更新每秒自动进行一次,不需程序干预。计算机可通过中断或查询方式读取计时数据进行显示,因此计时功能的实现无需占用CPU的时间,程序简单。此外,实时时钟芯片多数带有锂电池做后备电源,具备永不停止的计时功能;具有可编程方波输出功能,可用做实时测控系统的采样信号等;有的实时时钟芯片内部还带有非易失性RAM,可用来存放需长期保存但有时也需变更的数据。由于功能完善,精度高,软件程序设计相对简单,且计时不占用CPU时间,因此,在工业实时测控系统中多采用这一类专用芯片来实现实时时钟功能。方案二: 软件控制利用单片机内部的定时/计数器进行中断定时,配合软件延时实现时、分、秒的计时及秒表计时。该方案节省硬件成本,且能使设计者对单片机的指令系统能有更深入的了解,从而掌握单片机应用技术MCS-51汇编语言程序设计方法,因此,本系统设计采用此种软件控制方法来实现计时。而由于ATMEL公司的STC89C52单片机是低功耗的具有4KB在线可编程Flash存储器的单片机。它与通用80C52系列单片机的指令系和引脚兼容。片内的Flash可允许在线重新编程,也可使用通用非易失性存储器编程。它将通用CPU和在线可编程Flash集成在一个芯片上,形成了功能强大、使用灵活和具有较高性能价格比的微控制器。它的功能强大,而且也较容易购买,故本设计中所选的单片机为STC89C52单片机。其中该电子钟主要由单片机,4个独立按键,显示接口电路和复位电路构成。设计课题的总体方案图如图1.1所示。图1.1 总体方案图本电子钟采用ATMEL公司的STC89C52单片机为核心,使用11.0592MHZ 晶振与单片机STC89C52 相连接,通过软件编程的方法实现以24小时为一个周期,同时以LCD显示年、月、日、星期、小时、分钟和秒的要求。该电子钟设有四个按键S1、S2、S3和RESET键,进行相应的操作就可实现校时、复位功能。STC89C52单片机简介:STC89C52是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口。另外 STC89X52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35Mhz,6T/12T可选。三、硬件电路设计多功能电子表单元电路工作原理介绍1、电源电路工作原理 图5.1所示为集成直流稳压电源电路的原理图,本电源电路是由集成稳压器构成的。电路可分成三部分:电源变压器部分、整流滤波部分和稳压部分。变压器原边为工频交流220V电压,经过变压后,变压器副边的电压变为交流11V,11V交流电压经过桥式整流电路整流后变为直流10V电压,直流10V电压作为CW7805的输入电压,CW7805输出+5V电压。图中D2为整流桥,它由四个整流二极管接成电桥形式。C3为滤波电容,C1用于抵消输入端较长接线的电感效应,以防止自激振荡,还可抑制电源的高频脉冲干扰。一般取0.11F。CW7805为三端固定输出集成稳压器,其输入和输出电压都为固定值,它的输入电压为+10V,输出电压为+5V。C2和C4用以改善负载的瞬态响应,消除电路的高频噪声,同时也具有消振作用。2、时钟电路工作原理 图5.2所示为时钟电路原理图,在STC89C52芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,输出端为引脚XTAL2。而在芯片内部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器。时钟电路产生的振荡脉冲经过触发器进行二分频之后,才成为单片机的时钟脉冲信号。 3、复位电路工作原理 图5.3所示为复位电路原理图,复位是单片机的初始化操作,其主要功能是把PC初始化为0000H,使单片机从0000H单元开始执行程序,并使其它功能单元处于一个确定的初始状态。本复位电路采用的是按键复位,它是通过复位端经电阻与VCC电源接通而实现的,它兼具上电复位功能。因本系统的晶振的频率为12MHz,所以,复位信号持续时间应当超过2S才能完成复位操作。4、键盘工作原理 图5.4所示为键盘原理图,本系统采用的是独立式键盘结构,每个按键单独占用一根I/O口线,每个按键的工作不会影响其它I/O口线的状态。它软件是采用查询式结构,首先逐位查询每根I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。 5、显示电路工作原理图3本设计采用LCD1602液晶显示模块,具有很低的功耗,正常工作室电流仅2.0mA/5.0V。通过编程实现总动关闭屏幕能够更有效地降低功耗。电子钟原理图如下所示:图5元件清单:元件序号型号主要参数数量1电阻1K1个2电阻200欧1个3瓷片电容1041个4瓷片电容30PF2个5三极管Pnp90121个6蜂鸣器5V1个7晶振12M1个8轻触按键5个9单片机STC89S521个10排阻10K1排11排针1排12IC座40脚1个13蓝白可调1个14LCD16021个电子钟PCB如下:四、软件设计1、主程序框图:开始定义堆栈区8155、 T0、数据缓冲区、标志位初始化调用键盘扫描程序 否是C/R键? 是地址指针指向计时缓冲区 调用时间设置程序 主程序流程图2、时间设置模块该模块由键盘输入相应的数据来设置当前时间。程序通过调用一个键盘设置子程序通过键盘扫描将键入的6位时间值送入显示缓冲区。设置时间后,时钟要从这个时间开始计时,而时分秒单元各占一个字节,键盘占6个字节。因此程序中要调用一个合字子程序将显示缓冲区中的6位BCD码合并为3位压缩BCD码,并送入计时缓冲区,作为当前计时起始时间。该程序同时要检测输入时间值的合法性,若键盘输入的小时值大于23,分、秒值大于59,则不合法,将取消本次设置,清零重新开始计时。时间设置和键盘设置子程序的流程图如下图所示。保护现场调用键盘设置子程序KETIN调用合字子程序COMB恢复现场返回时间设置流程图保护现场显示缓冲区首地址送R0键盘输入次数送R7调用键盘扫描程序KEYSCAN键号送R0显示缓冲区地址加1循环次数减1否循环结束?是恢复现场返回键盘设置子程序流程图2、设计程序如下:#include #define uchar unsigned char#define uint unsigned intsbit lcden=P20;sbit rs=P35;sbit s4=P13;sbit s1=P11;sbit s2=P12;sbit s3=P10;uchar count,date,s1num,temp,csnum,RCAP2H,RCAP2L;uint nian=2009;char yue,ri,xq=1,shi,fen,miao,shi_c,fen_c,s_c5,f_c5,num_c=1,ri_c;bit flag,setpage,shuaxin;uchar code table= 2009-00-00 MON;uchar code table1= 21:00:00;/初始化要在这里改数值void keyscan();void delay(uint z);void write_com(uchar com);void write_date(uchar date);void write_sfm(uchar add,uchar date);void word(uchar add,unsigned char *str) ;/写字符串void write_nyr(uchar add,uchar date);void write_nian();void init();void clock();#include #define uchar unsigned char#define uint unsigned intsbit lcden=P34;sbit rs=P35;sbit s4=P10;sbit s1=P13;sbit s2=P12;sbit s3=P21;uchar count,date,s1num,temp,csnum;uint nian=2009;char yue,ri,xq=1,shi,fen,miao,shi_c,fen_c,s_c5,f_c5,num_c=1,ri_c;bit flag,setpage,shuaxin;uchar code table= 2009-00-00 MON;uchar code table1= 00:00:00;/初始化要在这里改数值void keyscan();void delay(uint z);void write_com(uchar com);void write_date(uchar date);void write_sfm(uchar add,uchar date);void word(uchar add,unsigned char *str) ;/写字符串void write_nyr(uchar add,uchar date);void write_nian();void init();void clock();void main()init();while(1)keyscan();clock();/执行闹钟程序/以下为时钟程序if(count=20)count=0;miao+;if(miao=60)/如果秒不到60,则只刷新秒miao=0;fen+;if(fen=60)fen=0; shi+;if(shi=24)shi=0; xq+;write_com(0x80+12);if(xq=8)xq=1;if(xq=1)word(12,Mon);if(xq=2)word(12,Tue);if(xq=3)word(12,Wed);if(xq=4)word(12,Thu);if(xq=5)word(12,Fri);if(xq=6)word(12,Sat);if(xq=7)word(12,Sun);ri+;/接下来要大小月,在二月时要判断是否闰年/如果是闰年,则为29天if(yue=7)temp=yue%2;switch(temp) case 0:/0为小月if(yue=2)/如果为二月,则判断是不是闰年,是为29天,不是为28天 if(nian%4=0)&nian%100!=0|(nian%400=0)if(ri=30)ri=1;yue+;write_nyr(6,yue);elseif(ri=29)ri=1;yue+;write_nyr(6,yue);/if(yue=2)if(ri=31)ri=1;/yue+yue+;if(yue=13)yue=1;nian+;write_nian();write_nyr(6,yue);break;case 1:/1为大月 if(ri=32)ri=1;yue+;if(yue=13)yue=1;nian+;write_nian();write_nyr(6,yue);break; /if(yue7)temp=yue%2;switch(temp)case 0:/0为大月if(ri=32)ri=1;/yue+yue+;if(yue=13)yue=1;nian+;write_nian();write_nyr(6,yue);break;case 1:/1为小月if(ri=31)ri=1;/yue+yue+;if(yue=13)yue=1;nian+;write_nian();write_nyr(6,yue);break;/if(yue7) write_nyr(9,ri); /if(shi=24)if(shuaxin=0)write_sfm(4,shi);/if(fen=60)if(shuaxin=0)write_sfm(7,fen);/if(miao=60)if(shuaxin=0)write_sfm(10,miao); /if(count=20) /while(1)void delay(uint z)int x,y;for(x=110;x0;x-)for(y=z;y0;y-);void write_com(uchar com)/写指令函数 rs=0;lcden=0; P0=com; delay(2); lcden=1; delay(2);lcden=0;void write_date(uchar date)/写数据函数rs=1;lcden=0;P0=date;delay(2);lcden=1;delay(2);lcden=0;void init()uchar num;write_com(0x38);/显示模式设置write_com(0x0c);/光标设置write_com(0x06);/光标指针设置write_com(0x01);/显示清屏write_com(0x80);/从第一行开始写for(num=0;num15;num+)write_date(tablenum);delay(2);write_com(0x80+0x40);/从第二行开始写for(num=0;num12;num+)write_date(table1num);delay(2);for(num=0;num5;num+)/初始化闹钟存放数组s_cnum=0;f_cnum=0;RCAP2H=(65536-50000)/256;RCAP2L=(65536-50000)%256;/设置自动重装初值T2CON=0x04;/启动定时器EA=1;/总中断 ET2=1;/开定时器中断TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=0;ET0=1;void write_sfm(uchar add,uchar date)/写时分秒uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_date(0x30+shi);write_date(0x30+ge);void write_nyr(uchar add,uchar date)/写月日uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+add);write_date(0x30+shi);write_date(0x30+ge);void write_nian()uchar shi,ge;shi=nian%100/10;ge=nian%10;write_com(0x80+1);write_date(0x30+2);write_date(0x30);write_date(0x30+shi);write_date(0x30+ge); void word(uchar add,unsigned char *str)/写字符串,如MONwhile(*str != 0)write_date(*str+);*str = 0;write_com(0x80+add);void keyscan()if(s1=0)/okdelay(5);if(s1=0)shuaxin=1;s1num+;while(!s1);/为假就退出,松手后即为假if(csnum=0)/刚开始一定要执行的 write_com(0x01);write_com(0x0f);write_com(0x80+4);word(4,1.time);write_com(0xc0+4);word(0x44,2.clock);write_com(0x84);/光标停在时间那里csnum=1;flag=1;if(csnum=2)/调时间/*/调时间画面初始化while(setpage=0)uchar num;flag=0;write_com(0x01);/显示清屏write_com(0x80);/从第一行开始写for(num=0;num15;num+)write_date(tablenum);write_com(0x80+0x40);/从第二行开始写for(num=0;num12;num+)write_date(table1num);setpage=1;/setpage为1,则不用再次初始化调时画面/while(setpage=0)/*if(s1num=1)/调秒TR2=0;shuaxin=1;write_com(0x80+0x40+10);write_com(0x0f);/光标闪烁if(s1num=2)/调时write_com(0x80+0x40+7);if(s1num=3)/调分write_com(0x80+0x40+4);if(s1num=4)/调星期 write_com(0x80+12);if(s1num=5)/调日 write_com(0x80+9);if(s1num=6)/调月份write_com(0x80+6);if(s1num=7)/调年write_com(0x80+3);if(s1num=8)TR2=1;s1num=0;csnum=0;/调完会到初始状态setpage=0;flag=0;shuaxin=0;/调完退出时要回到刷新状态write_com(0x0c);/关闪烁/if(csnum=2)/调时间if(csnum=3)/调闹钟if(setpage=0)uchar i=0;flag=0;write_com(0x80);write_com(0x0c);write_com(0x01);word(0,you can set 32);write_com(0xc0);word(0,clocks one day);delay(500); /把闹钟存放数组设置一个数,以免write_com(0x01);word(6,clock 01 00:00);write_com(0x0f);setpage=1;/if(setpage=0)if(s1num=1)/调闹钟数write_com(0x80+6);write_com(0x0f);/光标闪烁if(s1num=2)/调时write_com(0x80+10);if(s1num=3)/调分write_com(0x80+13);if(s1num=4)/全部回到初始状态uchar num;s1num=0;csnum=0;/调完会到初始状态setpage=0;flag=0;shuaxin=0;write_com(0x0c);/关闪烁; write_com(0x80);/从第一行开始写for(num=0;num15;num+)write_date(tablenum);delay(2);write_com(0x80+0x40);/从第二行开始写for(num=0;num12;num+)write_date(table1num);delay(2);write_nyr(6,yue);write_nyr(9,ri);write_sfm(4,shi);write_sfm(7,fen);/写回值/if(csnum=3)/调闹钟/if(s1=0)/if(s1=0)OK键处理完毕if(flag=1)/flag为进入设置时间或闹钟画面标志,为1则进入设置if(csnum!=0)if(s2=0)delay(5);if(s2=0)while(!s2);csnum=2;/调时间标志s1num=0;write_com(0x84);if(s3=0)delay(5);if(s3=0)while(!s3);csnum=3;/调闹钟标志s1num=0;write_com(0xc4);/if(flag=1)if(s1num!=0)/OKNUM=1if(s2=0)delay(5);/延时,消抖if(s2=0)/确实按下了,再做下面的处理while(!s2);if(csnum=2)/shijianif(s1num=1)/miaomiao+;if(miao=60)miao=0;write_sfm(10,miao);write_com(0x80+0x40+10);if(s1num=2)/fenfen+;if(fen=60)fen=0;write_sfm(7,fen);write_com(0x80+0x40+7);if(s1num=3)/shishi+;if(shi=24)shi=0;write_sfm(4,shi);write_com(0x80+0x40+4);if(s1num=4)/xingqixq+;if(xq=8)xq=1;if(xq=1)word(12,Mon);if(xq=2)word(12,Tue);if(xq=3)word(12,Wed);if(xq=4)word(12,Thu);if(xq=5)word(12,Fri);if(xq=6)word(12,Sat);if(xq=7)word(12,Sun);write_com(0x80+12);if(s1num=5)/riri+;if(ri=31)ri=0;write_nyr(9,ri);write_com(0x80+9);if(s1num=6)/yueyue+;if(yue=13)yue=0;write_nyr(6,yue);write_com(0x80+6);if(s1num=7)/niannian+;if(nian=2100)nian=2009;write_nian();write_com(0x80+1); /if(csnum=2)/shijianif(csnum=3)/naozhongif(s1num=1)num_c+;if(num_c=33)num_c=1;write_nyr(6,num_c);write_com(0x80+6);if(s1num=2)shi_c+;if(shi_c=24)shi_c=0;s_cnum_c-1=shi_c;write_nyr(10,shi_c);write_com(0x80+10); if(s1num=3)fen_c+;if(fen_c=60)fen_c=0;f_cnum_c-1=fen_c;write_nyr(13,fen_c);write_com(0x80+13); /if(s2=0) /if(s2=0)if(s3=0)delay(5);if(s3=0)while(!s3); if(csnum=2)/shijianif(s1num=1)/miaomiao-;if(miao=-1)miao=59;write_sfm(10,miao);write_com(0x80+0x40+10);if(s1num=2)/fenfen-;if(fen=-1)fen=59;write_sfm(7,fen);write_com(0x80+0x40+7);if(s1num=3)/shishi-;if(shi=-1)shi=23;write_sfm(4,shi);write_com(0x80+0x40+4);if(s1num=4)/xingqixq-;if(xq=0)xq=7;if(xq=1)word(12,Mon);if(xq=2)word(12,Tue);if(xq=3)word(12,Wed);if(xq=4)word(12,Thu);if(xq=5)word(12,Fri);if(xq=6)word(12,Sat);if(xq=7)word(12,Sun);write_com(0x80+12);if(s1num=5)/riri-;if(ri=-1)ri=31;write_nyr(9,ri);write_com(0x80+9);if(s1num=6)/yueyue-;if(yue=-1)yue=12;write_nyr(6,yue);write_com(0x80+6);if(s1num=7)/niannian-;if(nian=2008)nian=2099;write_nian();write_com(0x80+1);/if(csnum=2)/shijianif(csnum=3)/naozhong if(s1num=1)num_c-;if(num_c=0)num_c=32;write_nyr(6,num_c);write_com(0x80+6);if(s1num=2)shi_c-;if(shi_c=-1)shi_c=23;s_cnum_c-1=shi_c;write_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新解读《GB-T 30641-2014食品机械 多功能电动压面机》
- 暑假专项重点提升训练:填空题(含解析)-2024-2025学年西师大版六年级数学下学期
- 新解读《GB-T 7715-2014工业用乙烯》
- 新解读《GB 30862-2014坠落防护 挂点装置》
- 重庆大学安全知识培训课件
- 重大危险源基本知识培训课件
- 重大传染病演练知识培训课件
- 全国一等奖高中语文统编版必修上册《声声慢》 公开课课件
- 老年人民事行为能力课件
- 醉花阴苏轼课件
- TSGD7002-2023-压力管道元件型式试验规则
- 短视频制作实战课件
- 面试礼仪与求职技巧讲义
- 严重创伤的急诊管理课件
- 江西省普通高中学生综合素质评价手册
- 急性阑尾炎【普外科】-课件
- 文化人类学课件完整版
- 四年级语文下册课外阅读《青铜葵花》导读课 课件(共24张PPT)
- 《Section B 1a-1e》获奖教案初中英语九年级全一册-九年级英语教案
- 中医儿科学 手足口病
- GB/T 14842-2007铌及铌合金棒材
评论
0/150
提交评论