《片单机课程设计学校作息时间控制系统设计--大学毕设论文.doc》由会员分享,可在线阅读,更多相关《片单机课程设计学校作息时间控制系统设计--大学毕设论文.doc(17页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、单片机原理及应用课程设计说明书题目学校作息时间控制系统的设计系(部)专业(班级)姓名学号指导教师起止日期 系部:电信系 专业:2011级电子信息工程课题名称学校作息时间控制系统的设计设计内容及要求(1)课题内容:以单片机为核心,设计一个智能化作息时间控制器。该控制器要求的功能有:按本校作息时间接通/断开蜂鸣器,每次响铃时间为10 秒;用12864 液晶屏作显示器,第一行显示“作息时间控制系统”,第二行显示设计者姓名和学号,第三行显示实时时钟,显示的内容要求有时、分、秒各两位,第四行显示最近的闹铃时间。发挥部分:设置按键对小时和分钟调节;可以通过键盘任意调整响铃时间。(2)要求:完成该系统的硬件
2、和软件的设计,在Proteus 软件上仿真通过后,提交一篇课程设计说明设计工作量1、汇编或C51语言程序设计;2、程序调试;3、在Proteus 上进行仿真成功后,进行实验板下载调试;4、提交一份完整的课程设计说明书,包括设计原理、程序设计、程序分析、仿真分析、调试过程,参考文献、设计总结等。进度安排起止日期设计内容(或预期目标)备注第一天课题介绍,答疑,收集材料,C51介绍第二天设计方案论证,练习编写C51程序第三天第六天程序设计第六天第八天程序调试、仿真第九天第十天系统测试并编写设计说明书教研室意见 年 月 日系(部)主管领导意见 年 月 日目录程序4一、设计内容及要求131.1 设计内容
3、131.2 设计要求13二、设计目的13三、设计原理133.1 总的设计133.2 分模块设计133.3 设计示意图14四、仿真分析144.1 调节工作模式154.2 闹钟实现154.3 温度测量16五、心得体会17六、参考文献17程序#include reg52.h #include #define uchar unsigned char #define uint unsigned int #define IO_ADDR P2 #define delayNOP(); _nop_();_nop_();_nop_();_nop_(); sbit RS=P10; sbit RW=P11; sbit
4、 EN=P12; sbit RST=P13; sbit PSB=P15; sbit mode=P00;/key1模式 sbit inc=P01;/kye2分 sbit dec=P02;/key3 时 sbit fmq=P34;/蜂鸣器接口/= code uchar data116=作息时间控制系统; code uchar data2=吴智勇 2011026103; code uchar data3=时间: : : ; code uchar data4=打铃: : : ; uchar disp_buff416;/定义一个二维数组,4行,16个字符 uchar hour,min,sec,minis
5、ec; uchar mode_value=0 ,xf; /调节模式 uchar ds202 = 8,0,8,45,8,55,9,40,10,0,10,45,10,55,11,40,14,0,14,45,14,55,15,40,16,0,16,45,16,55,17,40,19,0,19,45,19,55,20,40;/=/*/void delay(int ms) while(ms-) uchar i; for(i=0;i250;i+) _nop_(); _nop_();_nop_();_nop_(); /=void delayus(uint i) uchar y; while(-i) for(
6、y=0;y2;y+) ; /=uchar read_data(void)/读状态。/返回值1-空。0-忙。 uchar temp; RS=0; RW=1; delayus(2); EN=1; delayNOP(); IO_ADDR=0XFF; temp=IO_ADDR;/读输入口。 temp=temp&0x80; EN=0; if(temp=0x00) return(0); else return(1);/注:如需软件仿真,需要将此处改为1/=void write_data(uchar type,uchar date)/写命令或写数据。 while(read_data(); /delayus(
7、100); if(type)/写数据1 RS=1; else/0/写命令 RS=0; delayus(1);/1。5US RW=0; delayus(1);/1。5US EN=0; delayus(1); delayus(1); delayus(1); IO_ADDR=date; delayNOP(); EN=1; delayNOP(); EN=0; delayus(10);/* void init_system()/12864初始化部分。 PSB=1; RST=1; delayus(4); RST=0; delay(3); RST=1; delay(3); write_data(0,0x30
8、);/功能设定,8位并行接口 delay(5); write_data(0,0x30);/功能设定,基本指令集。 delay(5); write_data(0,0x30);/功能设定,8位并行接口 delay(5); write_data(0,0x01);/清屏, delay(5); write_data(0,0x01);/清屏, delay(5); write_data(0,0x02);/将地址指针移到开头位置。 write_data(0,0x0c);/整体显示开。 write_data(0,0x01);/清屏, write_data(0,0x01);/清屏,/= /=void displa
9、y_buff()/显示2维数组内的内容。 uchar i; uchar *point; point=&disp_buff00; /write_data(0,0x01);/清屏, /delayus(5); /write_data(0,0x02);/地址归0 /delayus(10); /write_data(0,0x06);/地址归0 /一行一行的显示/ /行地址:0X80 0X90 0X88 0X98 write_data(0,0X80);/移到0X80位置。 delayus(1); for(i=0;i16;i+) write_data(1,*point); point+; delayus(1
10、); /=/= write_data(0,0X90); delayus(1); for(i=0;i16;i+) write_data(1,disp_buff1i); delayus(1); write_data(0,0X88); for(i=0;i16;i+) write_data(1,disp_buff2i); delayus(1); write_data(0,0X98); for(i=0;i20) minisec=0;if(+sec59) sec=0; if(+min59) min=0; if(+hour24) hour=0;min=0; sec=0; void delaysj(unsig
11、ned char j)/延时程序unsigned char i;while(j-)for(i=0;i50;i+); /蜂鸣器 void s_fmq()unsigned char j=2; /蜂鸣器叫while(j-)fmq=0;delaysj(200);/*闹铃判断*/void nling() uchar i ; for(i=0;i20;i+) if(hour=dsi0&min=dsi1) /判断是否到闹铃时间 if(sec10) s_fmq(); /调用蜂铃 /调节模块 void tiaojie() uchar i;if(mode=0)while(!mode);mode_value+;/zi
12、fu(0xbc,0xb8,2,mode_value,&shu); switch(mode_value) /模式0:正常工作。显示“天天向上”case 0:/uchar i; for(i=0;i16;i+) disp_buff0i=data1i; disp_buff1i=data2i; break ;case 1: / 模式1:可以修改时间,其中inc是改分钟,dec是改小时if(inc=0) while(!inc);min+;if(min=60) min=0;if(dec=0) while(!dec);if(min=0) min=60; min-;/if(dec=0) while(!dec);
13、hour+; if(hour=24) hour=0;/uchar i; for(i=0;i16;i+) disp_buff2i=data3i; disp_buff25=(hour/10)+0x30; disp_buff26=(hour%10)+0x30; disp_buff28=(min/10)+0x30; disp_buff29=(min%10)+0x30; disp_buff211=(sec/10)+0x30; disp_buff212=(sec%10)+0x30; display_buff(); ;break;case 2:if(inc=0) while(!inc);hour+;if(h
14、our=24) hour=0; /模式2:选择一个需要改变的闹铃/if(inc=0) while(!inc);min+;if(min=60) min=0;if(dec=0) while(!dec);if(hour=0) hour=24;hour-; /uchar i; for(i=0;i16;i+) disp_buff2i=data3i; disp_buff25=(hour/10)+0x30; disp_buff26=(hour%10)+0x30; disp_buff28=(min/10)+0x30; disp_buff29=(min%10)+0x30; disp_buff211=(sec/1
15、0)+0x30; disp_buff212=(sec%10)+0x30; display_buff();/zifu(0xbe,0x40,2,xf/10,&shu);/zifu(0xbe,0x48,2,xf%10,&shu);/zifu(0xbe,0x68,2,2,&fuhao); /zifu(0xbe,0x70,2,dsxf1/10,&shu);/zifu(0xbe,0x78,2,dsxf1%10,&shu);/zifu(0xbe,0x50,2,0,&fuhao);/zifu(0xbe,0x58,2,dsxf0/10,&shu);/显示“调整后的闹铃时间”/zifu(0xbe,0x60,2,d
16、sxf0%10,&shu); ;break;case 3: / 模式3:修改选定的闹铃的分钟if(inc=0) while(!inc);dsxf1+;if(dsxf1=60) dsxf1=0;if(dec=0) while(!dec);if(dsxf1=0) dsxf1=60;dsxf1-; /uchar i; for(i=0;i16;i+) disp_buff3i=data4i; disp_buff35=dsxf0/10+0x30; disp_buff36=dsxf0%10+0x30; disp_buff38=dsxf1/10+0x30; disp_buff39=dsxf1%10+0x30;
17、 disp_buff311=0+0x30; disp_buff312=0+0x30; display_buff();/显示“调整后的闹铃时间” ;break ;case 4: / 模式4:修改选定的闹铃的小时 if(inc=0) while(!inc);dsxf0+;if(dsxf0=24) dsxf0=0; if(dec=0) while(!dec);dsxf0-; if(dsxf0=0) dsxf0=23; /uchar i; /for(i=0;i16;i+) / / disp_buff3i=data4i; / disp_buff35=dsxf0/10+0x30; disp_buff36=
18、dsxf0%10+0x30; disp_buff38=dsxf1/10+0x30; disp_buff39=dsxf1%10+0x30; disp_buff311=0+0x30; disp_buff312=0+0x30; display_buff();/ hanzi(0xbe,0x40,2,2,&zi); / 显示“时”/ zifu(0xbe,0x58,2,dsxf0/10,&shu);/显示“调整后的闹铃时间”/ zifu(0xbe,0x60,2,dsxf0%10,&shu);/ zifu(0xbe,0x68,2,2,&fuhao); / zifu(0xbe,0x70,2,dsxf1/10,
19、&shu);/ zifu(0xbe,0x78,2,dsxf1%10,&shu); ;break;case 5: mode_value=0 ;break;/模式5:确认修改,返回正常工作状态default:break;/从打铃时间表中找出下一个要打铃的时间uchar Locate (void) /uchar xf;/n; xf=0; while(xf20) if(hourdsxf0) break; else if(hour=dsxf0)&(min=dsxf1) break; xf+; /n+; if(xf=20) xf=0;/xf=0; return(xf); void shizhong() u
20、char i; for(i=0;i16;i+) disp_buff0i=data1i; disp_buff1i=data2i; disp_buff2i=data3i; disp_buff3i=data4i; disp_buff25=(hour/10)+0x30; disp_buff26=(hour%10)+0x30; disp_buff28=(min/10)+0x30; disp_buff29=(min%10)+0x30; disp_buff211=(sec/10)+0x30; disp_buff212=(sec%10)+0x30; /闹铃 disp_buff35=dsxf0/10+0x30;
21、 disp_buff36=dsxf0%10+0x30; disp_buff38=dsxf1/10+0x30; disp_buff39=dsxf1%10+0x30; disp_buff311=0+0x30; disp_buff312=0+0x30; display_buff();/*/* */* 延时函数 */* /= */* void main(void) P0=0XFF; P2=0XFF; EA=1; ET0=1; TH0=0X4C; TL0=0X00; TMOD=0X01; TR0=1; init_system(); while(1) tiaojie(); shizhong(); nlin
22、g(); Locate (); /s_fmq(); 一、设计内容及要求1.1 设计内容 以单片机为核心,设计一个智能化作息时间控制器。该控制器要求功能有:按本校作息时间接通/断开蜂鸣器,每次响铃时间为10秒;用12864液晶屏作显示器,第一行显示“作息时间控制系统”,第二行显示设计者姓名和学号,第三行显示实时时钟,显示的内容有时、分、秒各两位,第四行显示最近的闹钟时间。 发挥部分:设计按键对小时和分钟调节;可以通过键盘任意调整闹铃时间。 1.2 设计要求 完成该系统的硬件和软件的设计,在Proteus软件上仿真通过后,提交一篇课程设计说明书。采用汇编或者C51语言程序设计均可。二、设计目的 通
23、过这次课程设计培养同学的独立思考和独立操作能力,更深层次的了解自己的专业和身边一些电子系统的简单设计。三、设计原理3.1 总的设计首先对设计要求有个整体了解,明白需要实现哪些功能,实现这些功能需要哪些元器件,要驱动这些元器件需要编写什么程序,怎么编写,最后进行总体调试。本次作息时间的设计,使用了单片机AT89C51,LCD和AMPIRE12864。温度元件为DS18B20,还有一个声音播放器SOUNDER。对于LCD和DS18B20要进行初始化。将本次设计分成5个模块分别进行设计,分成:温度模块、LCD显示模块、时间模块、声音模块、调节模块。分模块设计好了以后,再综合起来设计主程序,实现所需要
24、求。3.2 分模块设计1. LCD显示模块设计:该模块包括的函数为LCD-inti()/的初始化、checkbusy()/检查LCD是 否忙碌、writecode()/写命令、writedata()/写数据、hanzi()/显示汉字、zifuz()/显示数字或字符。 2.温度模块设计:该函数为inti()/DS18B20的初始化、readchar()/读一个字节、writechar()/写一个字节、readtemp()/读取温度、worktemp()/温度计算。 3.时间模块设计:本次是采用T0中断的工作方式1获取时间的。其函数为void timer()interrupt1/T0中断函数、wo
25、rkhour()/时间计算。 4.声音模块设计:该模块比较简单,其函数为voids_fmq()/蜂鸣器叫、nling()/判断是否闹铃。 5.调节模块设计:该模块要实现5个模式调节和转变。模式0:正常工作状态;模式1:修改时间;模式2:选择一个需要改变的闹钟;模式3修改选定的闹钟分钟;模式4:修改选定的闹钟小时。3.3 设计示意图图1 总设计示意图四、仿真分析 通过设计程序实现课程设计要求,通过仿真验证程序是否正确,仿真所用到的元器件有AT89C51、LCD液晶屏、三个独立按键、一个发声装置、8个电阻。仿真图如图2所示:图2 仿真电路图 4.1 调节工作模式 调节模式的实现只用了三个按键,分别
26、是mode、inc和dec按钮。如图三所示:图3 三个调节按键 开始仿真时,进入设定好的模式0,此时液晶显示屏显示的是初始值,然后按下mode按键,则进入模式1:进入修改时间,即设定闹钟时间。此时修改分钟按INC按键,修改小时按DEC按键,再次按下mode按键,则进入模式2:选择要修改的闹铃。此时液晶显示的第二个闹铃,可以按下inc按键加,也可以按下dec按键减。再次按下mode按键,则进入模式3:修改选定的闹钟分钟。此时修改的是闹钟的分钟,inc按键加,、dec按键减。再次按下mode按键,则进入模式4:修改选定的闹钟小时,inc加,dec按键减。再次按下mode按键。则回到模式0:正常工作
27、。 4.2 闹钟实现 程序初始化的时候对10个闹钟进行了赋值,闹钟时间自己设定,我设定的分别是8:00、8:20、8:30、8:40、8:50、9:00、9:30、10:00、10:15、10:30 。如果要修改闹钟时间,可以依次进入调节模式2、3、4进行修改。当到了闹铃时间时,则蜂鸣器会响起来。蜂鸣器如图4所示图4 蜂鸣器4.3 温度测量 本次设计采用了DSB18B20温度芯片,该芯片能测量环境中的温度变化,通过单片机的处理就可以显示实时温度值,当环境温度改变时,显示出来的温度会随着改变。图5 DS18B20温度芯片 液晶显示采用的是12864液晶显示屏,其仿真图如图6所示:图6 12864
28、液晶显示屏五、心得体会刚开始进行课程设计的时候,在老师一番讲解之后,觉得会比较简单。但实际情况并非如此,一开始就纠结与到底使用汇编语言编写程序还是用C51语言编写程序,在自己百般无奈和同学的建议下选择了C51编写程序。第一天回来后再网上和图书馆查阅资料后,把我给看傻了,一个个程序都那么长,但C51明显比汇编的相对简单明了多了。在参考网上的程序之后,自己也慢慢的进入了编写程序的状态,一步一步的用C51实现课程设计的要求。在编写程序的过程中确实遇到了不少困难,很多东西都不知道该如何用C语言表达,只能去请教班上的精通C语言的同学,看到别的同学很快就完成了这次课程设计,呆在实验室的人一天比一天少,自己
29、内心却是挺着急的,很想早点完成课程设计的要求,但最后还是没能在给定的时间完成这次课程设计,没能完全达到本次课程设计的要求,自己内心也颇为郁闷。通过这次课程设计,给我一个严重的教训,无论做什么都不要太过于自信,要多和同学交流。一定要尽早的完成老师的要求,不要总是拖拖拉拉。总的来说,虽然没能完全达到老师的要求,但这次课程设计给了我血的教训,有过刻骨的记忆,以后一定要努力做好最基本的自己。六、参考文献1.单片机原理与应用/曾屹 刘辉等编著-中南大学出版社,2009年2月2. 单片机C51程序设计教材与实验/祁伟等编著-北京航空航天大学出版社,2006年1月 3.单片机微型机计算机技术/刘国荣等编著-机械工业出版社,2000年1月4.百度文库