STC12C5A60S2单片机课程设计报告

上传人:pia****nwu 文档编号:141629499 上传时间:2022-08-24 格式:DOC 页数:13 大小:146.51KB
收藏 版权申诉 举报 下载
STC12C5A60S2单片机课程设计报告_第1页
第1页 / 共13页
STC12C5A60S2单片机课程设计报告_第2页
第2页 / 共13页
STC12C5A60S2单片机课程设计报告_第3页
第3页 / 共13页
资源描述:

《STC12C5A60S2单片机课程设计报告》由会员分享,可在线阅读,更多相关《STC12C5A60S2单片机课程设计报告(13页珍藏版)》请在装配图网上搜索。

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#includesbit RS=P37;sbit RW=P36;sbit E=P27;sbit BF=P07;#define LCD_Data P0/*函数声明*/void Lcd_Int(void);void huanying_show(void);void dongtai_show(void);char string1= LIU JING ;/LIU JING char string2= 080104020013 ;/080104020013/*函数功能:主函数*/void main()Lcd_Int(); /1602初始

5、化while(1)huanying_show();dongtai_show();/*函数功能:延时1ms注:不同单片机不同晶振需要对此函数进行修改*/void Lcd_delay1ms()unsigned char i,j;for(i=0;i90;i+)for(j=0;j33;j+);/*函数功能:延时若干毫秒入口参数:n*/void Lcd_delay(unsigned int n)unsigned int i;for(i=0;in;i+)Lcd_delay1ms();/*函数功能:判断液晶模块的忙碌状态返回值:result。result=1,忙碌;result=0,不忙*/bit Lcd_

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

7、S和RW同时为低电平时,可以写入指令RW=0;E=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,故只需写上实

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

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

10、m(0x38);Lcd_delay(5); Lcd_WriteCom(0x38); /3次写设置模式Lcd_delay(5); Lcd_WriteCom(0x0C); /显示模式设置:显示开,有光标,光标不闪烁Lcd_delay(5); Lcd_WriteCom(0x06); /显示模式设置:光标右移,字符不移Lcd_delay(5); Lcd_WriteCom(0x01); /清屏幕指令,将以前的显示内容清除Lcd_delay(5); /*函数功能:LCD的显示*/void huanying_show(void)unsigned int Lcd_i;Lcd_WriteCom(0x01); /

11、清显示:清屏幕指令Lcd_delay(1); Lcd_WriteAddress(0x00); /设置显示位置为第一行的第1个字Lcd_delay(1); for(Lcd_i=0;Lcd_i16;Lcd_i+) /显示字符LIU JING Lcd_WriteData(string1Lcd_i);Lcd_delay(150); Lcd_WriteAddress(0x40); /设置显示位置为第二行的第1个字for(Lcd_i=0;Lcd_i16;Lcd_i+) /显示字符080104020013 Lcd_WriteData(string2Lcd_i);Lcd_delay(150); Lcd_del

12、ay(1000);/右侧移位进来void dongtai_show(void)unsigned int Lcd_i;Lcd_WriteCom(0x01); /清显示:清屏幕指令Lcd_delay(2); Lcd_WriteAddress(0x10); /设置显示位置为最右侧Lcd_delay(2); for(Lcd_i=0;Lcd_i16;Lcd_i+) /显示字符LIU JING Lcd_WriteData(string1Lcd_i);Lcd_delay(2); Lcd_WriteAddress(0x50); /设置显示位置为最右侧for(Lcd_i=0;Lcd_i16;Lcd_i+)/显示

13、字符080104020013 Lcd_WriteData(string2Lcd_i);Lcd_delay(2); for(Lcd_i=0;Lcd_i16;Lcd_i+) /开始左移 Lcd_WriteCom(0x18); /左移指令Lcd_delay(400); Lcd_delay(1000);Lcd_WriteCom(0x08);Lcd_delay(400);Lcd_WriteCom(0x0c);Lcd_delay(400);Lcd_WriteCom(0x08);Lcd_delay(400);Lcd_WriteCom(0x0c);Lcd_delay(400);Lcd_WriteCom(0x0

14、8);Lcd_delay(400);Lcd_WriteCom(0x0c);Lcd_delay(400);Lcd_WriteCom(0x08);Lcd_delay(400);Lcd_WriteCom(0x0c);Lcd_delay(1);Lcd_WriteCom(0x01); /清显示:清屏幕指令Lcd_delay(1);七、实时时钟、温度测量、红外遥控解码等程序的流程图、程序源代码(一)流程图1、实时时钟模块图7.1.1为电子时钟设计框图,系统由主控制器STC12C5A60S2、时钟电路DS1302、显示电路LCD1602及键扫描电路组成。电子万年历的程序主要包括3个方面的内容:一是DS130

15、2从单片机中读取数据进行计数,二是利用按键进行时间的调整,三是MAX7219从单片机中读取数据驱动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为电子时钟程序设计流程图。图7.1.2电子时钟程序设计流程图2、温度测量模块温度测量程序主要包括主程序,读出温度子程序,温度转换子程序,计算温度子程序,显示数据子

16、程序等。主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。这样可以在一秒之内测量一次被测温度,其系统程序流程见图7.2.1所示。Y发DS18B20复位命令发跳过ROM命令发读取温度命令读取操作,CRC校验8字节完?CRC校验正?确?移入温度暂存器结束NNY初始化调用显示子程序1S到?初次上电读出温度值温度计算处理显示数据刷新发温度转换开始命令NYNY 图7.2.1温度测量主程序流程图图7.2.2读温度流程图 3、红外遥控解码模块(1)遥控器发射端程序流程图:(2)遥控器接收端程序流程图:(二)程序源代码1、实时时钟模块/*DS1302时钟

17、显示程序*/#include#include#include#define uint unsigned int#define uchar unsigned char/变量定义sbit SCLK=P14; /DS1302时钟控制总线sbit DATA_IO=P15; /DS1302数据传送总线sbit RESET=P16; /DS1302复位总线sbit ACC0=ACC0; /移位时的第0位sbit ACC7=ACC7; /移位时的第7位uchar table116 ; uchar table216 ; uchar second,minute,hour,day,month,year;/定义秒分

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

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

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

21、turn(Data);/返回读取的数据/时钟芯片初始化函数void Init_Clock(void) uchar Second=ReadClock(0x81);/读取秒数据 if(Second&0x80)/判断时钟芯片是否关闭 WriteClock(0x8e,0x00);/写入允许 WriteClock(0x8c,0x11);/一下写入初始化时间11年11月25日15:05:00 WriteClock(0x88,0x11); WriteClock(0x86,0x25); WriteClock(0x84,0x15); WriteClock(0x82,0x05); WriteClock(0x80,

22、0x00); WriteClock(0x8e,0x80);/禁止写入 void Read_Date(void) uchar ReadValue;/定义变量 ReadValue=ReadClock(0x81); second=(ReadValue&0x70)4)*10 + (ReadValue&0x0F);/将读取的秒数据的BCD码转换成十进制数据 ReadValue=ReadClock(0x83); if (ReadValue0x60) ReadValue=ReadClock(0x83); minute=(ReadValue&0x70)4)*10 + (ReadValue&0x0F); /将读

23、取的分数据的BCD码转换成十进制数据 ReadValue=ReadClock(0x85); if (ReadValue0x24) ReadValue=ReadClock(0x85); hour=(ReadValue&0x70)4)*10 + (ReadValue&0x0F); /将读取的时数据的BCD码转换成十进制数据 ReadValue=ReadClock(0x87); day=(ReadValue&0x70)4)*10 + (ReadValue&0x0F); /将读取的日数据的BCD码转换成十进制数据 ReadValue=ReadClock(0x89); month=(ReadValue&

24、0x70)4)*10 + (ReadValue&0x0F); /将读取的月数据的BCD码转换成十进制数据 ReadValue=ReadClock(0x8d); year=(ReadValue&0xf0)4)*10 + (ReadValue&0x0F); /将读取的年数据的BCD码转换成十进制数据 table10=D; table11=a; table12=t; table13=a; table14=:; table15=2; table16=0; table17=0x30+year/10; table18=0x30+year%10; table19=-; table110=0x30+month

25、/10; table111=0x30+month%10; table112=-; table113=0x30+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

26、%10; table212= ; table213= ; table214= ; table215= ;/时钟显示函数void show_Data()uint i;Lcd_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); void main()Lcd_Int(); /1602

27、初始化 huanying_show();Lcd_WriteCom(0x01);Init_Clock(); /将1302初始化while(1) Read_Date(); show_Data();2、温度测量模块/*DS18B29温度显示程序*/#include#include#include#define uchar unsigned char #define uint unsigned intsbit DQ=P17; /DS18B20与单片机连接口unsigned char a,b;uint tvalue;/温度值uchar disdata12;void delay_18B20(unsigne

28、d int i)/延时1微秒 while(i-); _nop_();_nop_(); void delay1ms(uint m)/延时m毫秒while(m-) delay_18B20(1000);void DS18B20rst()/*ds18b20复位*/ DQ = 1; /DQ复位 delay_18B20(10); /延时 DQ = 0; /DQ拉低 delay_18B20(600); DQ = 1; /拉高 _nop_(); _nop_(); while(DQ); _nop_(); _nop_(); while(DQ); _nop_(); uchar DS18B20rd()/*读数据*/

29、unsigned char i; unsigned char dat; DQ = 1; for (i=8;i0;i-) dat=1; DQ = 0; /给脉冲信号 _nop_(); _nop_(); _nop_(); _nop_(); DQ = 1; /给脉冲信号 delay_18B20(5); if(DQ) dat|=0x80; delay_18B20(50); return(dat); void DS18B20wr(uchar wdata)/*写数据*/ unsigned char d; int i; DQ = 1; for (i=8; i0; i-) d=wdata&0x01; wdat

30、a=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);/*启动温度转换*/ delay1ms(30); DS18B20rst(); DS18B20wr(0xcc);/*跳过读序列号*/ DS18B20wr(0xbe);/*读取温度*/ a=DS18B20rd(); b=DS18B20rd

31、(); tvalue=b; tvalue=tvalue8; tvalue=tvalue|a; if(tvalue&0x8000) tvalue=tvalue+1; tvalue=tvalue*(0.625);return(tvalue); void DS18B20disp()/温度值显示 uint i; disdata0=T; disdata1=e; disdata2=m; disdata3=p; disdata4=t; disdata5=:; disdata6=(int)tvalue/1000+0x30;/百位数 disdata7=(int)(tvalue%1000)/100+0x30;/十

32、位数 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); void initLCD() Lcd_Int(); huanying_show(); int main()a=0x00; b=0x00;initLCD(); Lcd_WriteCom(0x01)

33、; /清屏幕指令,将以前的显示内容清除 delay1ms(1000);while(1) read_temp();/读取温度 DS18B20disp();/显示 return 0;3、红外遥控解码模块#include #include #define uchar unsigned charuchar flag; /标志变量,0x01为下降沿进,0x02为引导码,0x03为连发码unsigned int sys,dat;uchar da4;sbit out=P33;sbit o1=P34;sbit o2=P35;/*/void adjust (void)if(flag=0x01)start();i

34、f(flag=0x02) /getdata();o1=0;else if(flag=0x03) /o2=0;void getdata(void)int i;int j;for(j=0;j4;j+)for(i=0;i1;while(out);TL1=0x00;TH1=0x00;TR1=1;while(out);TR1=0;if(TH17)daj|=0x80;void start (void)while(out);TR0=0;if(TH060)EA=0;TR1=1;while(out);TR1=0;if(TH130)flag=0x02;else if(TH115)flag=0x03; else f

35、lag=0x00; EA=1; void initintterrupt(void)TL0=0x00;TH0=0x00;TL1=0x00;TH1=0x00;IT1=1;EX1=1;EA=1;void Int1_Routine(void) interrupt 2EA=0;TL0=0x00;TH0=0x00;TL1=0x00;TH1=0x00;TMOD=0x91;TR0=1;ET0=1;flag=0x01;EA=1;int main(void)out=1;o1=1;o2=1;initintterrupt();while(1)EA=0;adjust();EA=1;return 0;八、整机硬件、软件联机仿真调试中出现的问题,解决方案、结果九、设计总结十、参考文献

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!