STC12C5A60S2单片机课程设计报告_第1页
STC12C5A60S2单片机课程设计报告_第2页
STC12C5A60S2单片机课程设计报告_第3页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、一、课程设计基本情况介绍1.1课程设计的基本目的与任务本课程设计旨在驾驭本专业学生理论指导实践能力以及电子产品工程设计与开发能力。本实践课所要达到的主要目的是:1、通过本次课程设计,是对学生综合能力的检,提高学生综合运用专业知识,强化单片机应用系统设计与防震能力。2、本次课程设计是在生产实习所完成的单片机核心板+电子钟模块+MP3模块+RFID模块+无线传输模块+GPS模块+脉搏传感模块”的基础上设计该硬件系统的工作程序。1.2课程设计的基本内容1、在生产实习设计单片机硬件系统的基础上,设计相应的应用软件系统。2、在LCD1602上显示学号程序设计。3、基于DS1302的实时时钟软件设计。4、

2、基于DS18B20的温度测量软件设计。5、基于TL1838A的红外遥控解码软件设计。6、设计应用软件系统框图和流程图,完成所设计软件的调试。1.3课程设计的教学要求1、通过资料查阅及学习了解单片机应用系统的软件设计方法及单片机编程、软硬件联机调试技巧。2、独立设计并编写下列应用程序:(1)LCD1602学号显示程序;(2)DS1302实时时钟程序;(3)DS18B20温度测量程序;(4)TL1838A红外遥控解码程序;3、独立完成所设计程序与硬件系统的联机仿真。二、整机系统框图(硬件、软件)该设计方案是以STC12C5A60S2单片机为核心,采用LCD液晶屏幕显示模块、实时时钟模块、温度测量模

3、块、红外遥控解码等模块所构建的系统,能在LCD1602液晶屏上显示当前的日期(年、月、日)、时间(时、分、秒)数据、当前环境温度值和红外遥控解码值。用户可通过遥控器或单片机核心板上的按键来进行日期和时间的设置。本系统设计大部分功能由软件来实现,电路简单明了,系统稳定性也得到大大提高。1、总体硬件设计框架图:总体硬件设计框架图2、总体软件设计框架图/三、整机硬件电路原理图(见99SE图)1、核心板电路原理图2、蜂鸣器驱动电路3、按键电路4、单片机复位电路5、LCD1602液晶显示电路6、电子钟模块接口电路四、软件系统设计思想/五、系统软件资源分配表(调试程序、工作程序)/六、显示学号的调试程序流

4、程图、程序源代码1、程序流程图/2、程序源代码/*LCD1602*/#include#includesbitRS=P3A7;sbitRW=P3A6;sbitE=P2A7;sbitBF=P0A7;#defineLCD_DataP0/*函数声明*/voidLcd_Int(void);voidhuanying_show(void);voiddongtai_show(void);LIUJING;/LIUJING080104020013;/080104020013函数功能:主函数*/charstring1=charstring2=/*voidmain()/1602初始化(Lcd_Int();while(

5、1)(huanying_show();dongtai_show();一/*函数功能:延时1ms注:不同单片机不同晶振需要对此函数进行修改*/voidLcd_delay1ms()(unsignedchari,j;for(i=0;i90;i+)for(j=0;j33;j+);/*函数功能:延时若干毫秒入口参数:n*/voidLcd_delay(unsignedintn)(unsignedinti;for(i=0;in;i+)Lcd_delay1ms();/*函数功能:判断液晶模块的忙碌状态返回值:resultoresult=1,忙碌;result=0,不忙*/bitLcd_BusyTest(voi

6、d)(bitresult;RS=0;RW=1;E=1;_nop_();/_nop_();_nop_();_nop_();/根据规定,RS为低电平,RW为高电平时,可以读状态/E=1,才允许读写空操作空操作四个机器周期,给硬件反应时间result=BF;/将忙碌标志电平赋给resultE=0;returnresult;/*函数功能:将模式设置指令或显示地址写入液晶模块入口参数:dictate*/*voidLcd_WriteCom(unsignedchardictate)(while(Lcd_BusyTest()=1);忙就等待RS=0;根据规定,RS和RW同时为低电平时,可以写入指令RW=0;E

7、=0;/E置低电平(写指令时,就是让E从0到1发生正跳变,所以应先置0_nop_();_nop_();/空操作两个机器周期,给硬件反应时间LCD_Data=dictate;_nop_();_nop_();_nop_();_nop_();/空操作四个机器周期,给硬件反应时间E=1;/E置高电平_nop_();_nop_();_nop_();_nop_();/空操作四个机器周期,给硬件反应时间E=0;/当E由高电平跳变成低电平时,液晶模块开始执行命令/*函数功能:指定字符显示的实际地址入口参数:x注:此函数已经加上了0x80,故只需写上实际地址就行*/*voidLcd_WriteAddress(u

8、nsignedcharx)(Lcd_WriteCom(x|0x80);/显示位置的确定方法规定为80H+地址码x/*函数功能:将数据(字符的标准ASCII码)写入液晶模块入口参数:y(为字符常量)*/voidLcd_WriteData(unsignedchary)(while(Lcd_BusyTest()=1);RS=1;/RS为高电平,RW为低电平时,可以写入数据RW=0;E=0;/E置低电平(写指令时,就是让E从0到1发生正跳变,所以应先置0LCD_Data=y;/将数据送入P0口,即将数据写入液晶模块_nop_();_nop_();_nop_();_nop_();/空操作四个机器周期,给

9、硬件反应时间E=1;/E置高电平_nop_();_nop_();_nop_();_nop_();/空操作四个机器周期,给硬件反应时间E=0;/当E由高电平跳变成低电平时,液晶模块开始执行命令/*函数功能:对lcd的显示模式进行初始化设置*/voidLcd_Int(void)(Lcd_delay(15);延时15ms,首次写指令时应给LCD一段较长的反应时间Lcd_WriteCom(0x38);/显示模式设置:16*2显示,5*7点阵,8位数据接口Lcd_delay(5);/延时5msLcd_WriteCom(0x38);Lcd_delay(5);Lcd_delay(5);Lcd_WriteCo

10、m(0x0C);/Lcd_delay(5);Lcd_WriteCom(0x06);Lcd_WriteCom(0x38);/3次写设置模式显示模式设置:显示开,有光标,光标不闪烁/显示模式设置:光标右移,字符不移Lcd_delay(5);Lcd_WriteCom(0x01);清屏幕指令,将以前的显示内容清除Lcd_delay(5);/*函数功能:LCD的显示*/voidhuanying_show(void)unsignedintLcd_i;Lcd_WriteCom(0x01);清显示:清屏幕指令Lcd_delay(1);Lcd_WriteAddress(0x00);/设置显示位置为第一行的第1个

11、字Lcd_delay(1);for(Lcd_i=0;Lcd_i16;Lcd_i+)/显示字符LIUJINGLcd_WriteData(string1Lcd_i);Lcd_delay(150);Lcd_WriteAddress(0x40);/设置显示位置为第二行的第1个字for(Lcd_i=0;Lcd_i16;Lcd_i+)/显示字符080104020013Lcd_WriteData(string2Lcd_i);Lcd_delay(150);Lcd_delay(1000);/右侧移位进来voiddongtai_show(void)unsignedintLcd_i;Lcd_WriteCom(0x0

12、1);清显示:清屏幕指令Lcd_delay(2);Lcd_WriteAddress(0x10);/设置显示位置为最右侧Lcd_delay(2);for(Lcd_i=0;Lcd_i16;Lcd_i+)/显示字符LIUJINGLcd_WriteData(string1Lcd_i);Lcd_delay(2);Lcd_WriteAddress(0x50);/设置显示位置为最右侧for(Lcd_i=0;Lcd_i16;Lcd_i+)/显示字符080104020013Lcd_WriteData(string2Lcd_i);Lcd_delay(2);for(Lcd_i=0;Lcd_i程序源代码显示动仁控Wc

13、DfiTC12C5A60S2时钟电路DS1302、显示取数据驱动LED数码管显示时间图7.1.1电子时钟设计框图STC12C5A60S2单片机主要I/O口的分配,P1.4、P1.5、P1.6分别接DS1302的SCLK,MCUIO,RST端,P0口接LCD1602八位数据口,P2.7、P3.6、P3.7分别接LCD1602的E、RW、RS端,P2.0-P2.3分别接按键K1-K4.下图7.1.2为电子时钟程序设计流程图。开始卜复位端产生个高电平4变重初始化4*写入DS1如2地址”使DS1302没有写保护显示驱动程序初I始化.延时一段时间夏位湍产生个高电平4地,址增加.写DS13M地址。菸时一段

14、时瓦k昼寸;驱动程是读向该地址写教据*地址噌加-驱动LCD髭示4数据是否图7.1.2电子时钟程序设计流程图2、温度测量模块温度测量程序主要包括主程序,读出温度子程序,温度转换子程序,计算温度子程序,显示数据子程序等。主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。这样可以在一秒之内测量一次被测温度,其系统程序流程见图7.2.1所示O调用显示NY温算出值计读度度专业学习资料图7.2.1温度测量主程序流程图图7.2.2读温度流程图3、红外遥控解码模块(1)遥控器发射端程序流程图扫描键号转至相应的发射程序(2)遥控器接收端程序流程图L氏氐申,

15、盼冲E十蜘5C屯MfNR永ffZ一7Y*虾个歧一衬点公乖矛呈,!二|中质返回|(二)程序源代码时钟显示程序*/1、实时时钟模块/*DS1302#include#include#include#defineuintunsignedint#defineucharunsignedchar/变量定义sbitSCLK=P1A4;sbitDATA_IO=P1A5;sbitRESE=P1A6;sbitACC0=ACCA0;sbitACC7=ACCA7;uchartable116;uchartable216;ucharsecond,minute,hour,day,month,year;/*DS1302时钟部分

16、子程序/向DS1302写入一个字节的函数/DS1302/DS1302/DS1302时钟控制总线数据传送总线复位总线/移位时的第/移位时的第定义秒分时日月年变量*/voidSentByte(ucharbyte)(uchari;ACC=byte;for(i=8;i0;i-)/相当于汇编中的RRC(DATA_IO=ACC0;/将自己的最低位传到时钟的数据总线上SCLK=1;/时钟上升沿发送数据有效SCLK=0;/清时钟总线ACC=ACC1;/将累加器中的数据右移1位/从DS1302读取一个字节函数ucharReceiveByte(void)(uchari;for(i=8;i0;i-)/相当于汇编中的

17、RRC(ACC=ACC1;/将累加器中的数据右移1位ACC7=DATA_IO;/将数据线上的1位数据存入累加器中SCLK=1;/时钟上升沿发送数据有效SCLK=0;/清时钟总线return(ACC);/函数最终返回读取的1字节数据/向DS1302的某个地址里写入数据函数voidWriteClock(ucharAddress,ucharData)/Address:要写入数据的DS1302地址;Data:要写的数据(RESET=0;/复位引脚为低电平所有数据传送中止SCLK=0;/清时钟总线RESET=1;/复位引脚为高电平逻辑控制有效delay(10);SentByte(Address);/写入

18、地址命令SentByte(Data);/写入1字节数据SCLK=1;/时钟总线置高RESET=0;/逻辑操作完毕,清复位总线/读取DS1302某地址的数据ucharReadClock(ucharAddress)/Address:要读取数据的DS1302地址(ucharData;/定义数据变量RESET=0;/复位引脚为低电平所有数据传送终止SCLK=0;/清时钟总线RESET=1;/复位引脚为高电平逻辑控制有效delay(1);SentByte(Address|0X01);/写入地址命令,读取地址为写入地址+1HData=ReceiveByte();/读取1字节数据SCLK=1;/时钟总线置高

19、RESET=0;/逻辑操作完毕,清复位总线return(Data);/返回读取的数据/时钟芯片初始化函数voidInit_Clock(void)(ucharSecond=ReadClock(0x81);/读取秒数据if(Second&0x80)/判断时钟芯片是否关闭(WriteClock(0x8e,0x00);/写入允许WriteClock(0x8c,0x11);/一下写入初始化时间11年11月25日15:05:00WriteClock(0x88,0x11);WriteClock(0x86,0x25);WriteClock(0x84,0x15);WriteClock(0x82,0x05);Wr

20、iteClock(0x80,0x00);WriteClock(0x8e,0x80);/禁止写入voidRead_Date(void)(ucharReadValue;/定义变量ReadValue=ReadClock(0x81);second=(ReadValue&0x70)4)*10+(ReadValue&0x0F);/码转换成十进制数据ReadValue=ReadClock(0x83);if(ReadValue0x60)ReadValue=ReadClock(0x83);minute=(ReadValue&0x70)4)*10+(ReadValue&0x0F);/码转换成十进制数据ReadVa

21、lue=ReadClock(0x85);if(ReadValue0x24)ReadValue=ReadClock(0x85);hour=(ReadValue&0x70)4)*10+(ReadValue&0x0F);/ReadValue=ReadClock(0x87);day=(ReadValue&0x70)4)*10+(ReadValue&0x0F);/ReadValue=ReadClock(0x89);month=(ReadValue&0x70)4)*10+(ReadValue&0x0F);/码转换成十进制数据ReadValue=ReadClock(0x8d);year=(ReadValue

22、&0xf0)4)*10+(ReadValue&0x0F);码转换成十进制数据将读取的秒数据的BCD将读取的分数据的BCD将读取的时数据的BCD码将读取的日数据的BCD码将读取的月数据的BCD/将读取的年数据的BCDtable10=D;table11=a;table12=t;table13=a;table14=:;table15=2;table16=0;table17=0x30+year/10;table18=0x30+year%10;table19=-;table110=0x30+month/10;table111=0x30+month%10;table112=-;table113=0x30+

23、day/10;table114=0x30+day%10;table115=;table20=;table21=;table22=;table23=;table24=0x30+hour/10;table25=0x30+hour%10;table26=:;table27=0x30+minute/10;table28=0x30+minute%10;table29=:;table210=0x30+second/10;table211=0x30+second%10;table212=;table213=;table214=;table215=;/时钟显示函数voidshow_Data()(uinti;L

24、cd_WriteAddress(0x00);/设置显示位置为第一行的第1个字for(i=0;i16;i+)/显示字符(Lcd_WriteData(table1i);delay(10);Lcd_WriteAddress(0x40);/设置显示位置为第二行的第1个字for(i=0;i16;i+)/显示字符(Lcd_WriteData(table2i);delay(10);voidmain()(Lcd_Int();/1602初始化huanying_show();Lcd_WriteCom(0x01);Init_Clock();/将1302初始化while(1)(Read_Date();show_Dat

25、a();一2、温度测量模块/*DS18B29温度显示程序*/#include#include#include#defineucharunsignedchar#defineuintunsignedintsbitDQ=P1A7;/DS18B20与单片机连接口unsignedchara,b;uinttvalue;/温度值uchardisdata12;voiddelay_18B20(unsignedinti)/延时1微秒(while(i-);_nop_();_nop_();-voiddelay1ms(uintm)/延时m毫秒(while(m-)delay_18B20(1000);voidDS18B20

26、rst()/*ds18b20复位*/(DQ=1;/DQ复位delay_18B20(10);/延时DQ=0;/DQ拉低delay_18B20(600);DQ=1;/拉高_nop_();_nop_();while(DQ);_nop_();_nop_();while(DQ);_nop_();ucharDS18B20rd()/*读数据*/(unsignedchari;unsignedchardat;DQ=1;for(i=8;i0;i-)(dat=1;DQ=0;/给脉冲信号_nop_();_nop_();_nop_();_nop_();DQ=1;/给脉冲信号delay_18B20(5);if(DQ)(d

27、at|=0x80;delay_18B20(50);return(dat);voidDS18B20wr(ucharwdata)/*写数据*/(unsignedchard;inti;DQ=1;for(i=8;i0;i-)(d=wdata&0x01;wdata=1;if(d)(DQ=0;delay_18B20(2);DQ=1;delay_18B20(60);else(DQ=0;delay_18B20(60);DQ=1;_nop_();_nop_();read_temp()/*读取温度值并转换*/(DS18B20rst();DS18B20wr(0xcc);/*DS18B20wr(0x44);/*del

28、ay1ms(30);DS18B20rst();DS18B20wr(0xcc);/*DS18B20wr(0xbe);/*a=DS18B20rd();b=DS18B20rd();tvalue=b;tvalue=tvalue8;tvalue=tvalue|a;if(tvalue&0x8000)tvalue=tvalue+1;tvalue=tvalue*(0.625);return(tvalue);voidDS18B20disp()/温度值显示(uinti;disdata0=T;disdata1=e;跳过读序列号启动温度转换跳过读序列号读取温度*/*/*/*/disdata2=m;disdata3=p

29、;disdata4=t;disdata5=:;disdata6=(int)tvalue/1000+0x30;/百位数disdata7=(int)(tvalue%1000)/100+0x30;/十位数disdata8=(int)(tvalue%100)/10+0x30;/个位数disdata9=.;disdata10=(int)tvalue%10+0x30;/小数位disdata11=C;Lcd_WriteAddress(0x40);/设置显示位置为第二行的第1个字for(i=0;i12;i+)/显示字符Lcd_WriteData(disdatai);delay(100);voidinitLCD()Lcd

温馨提示

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

评论

0/150

提交评论