STC12C5A60S2单片机课程设计汇本报告_第1页
STC12C5A60S2单片机课程设计汇本报告_第2页
STC12C5A60S2单片机课程设计汇本报告_第3页
免费预览已结束,剩余18页可下载查看

下载本文档

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

文档简介

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

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

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

4、程序源代码* *LCD1602 *#in clude<reg51.h> #in clude< intrin s.h>sbit RS=P3A7; sbit RW=P3A6;sbit E=P2A7;sbit BF=P0A7;#define LCD Data P0*函数声明 *void Lcd_I nt(void);void hua nyin g_show(void); void don gtai_show(void);char stri ng1=" char stri ng2=" /* void mai n() Lcdn t();while(1)LIU

5、JING 080104020013 函数功能:主函数/1602 初始化"/LIU JING”;/080104020013*3 / 14hua nyin g_show(); don gtai_show();- /*函数功能:延时1ms注:不同单片机不同晶振需要对此函数进展修改*/*void Lcd_delay1ms() un sig ned char i,j; for(i=0;i<90;i+) for( j=0;j<33;j+) ;/* 函数功能:延时假设干毫秒 入口参数:n* void Lcd_delay (un sig ned int n)un sig ned int

6、i;for(i=0;i< n;i+)Lcd_delay1ms();/*函数功能:判断液晶模块的忙碌状态返回值:result。result=1,忙碌;result=0,不忙*/bit Lcd_BusyTest(void)bit result;RS=0;/根据规定,RS为低电平,RW为高电平时,可以读状态RW=1;E=1;/E=1,才允许读写_nop_(); / 空操作_n op_();_n op_();_nop_(); /空操作四个机器周期,给硬件反响时间result=BF; /将忙碌标志电平赋给resultE=0;retur n result;*函数功能:将模式设置指令或显示地址写入液晶

7、模块入口参数:dictate*/void Lcd_Write( un sig ned char dictate)while(Lcd_BusyTest()=1); 忙就等待RS=0;/根据规定,RS和RW同时为低电平时,可以写入指令RW=0;E=0;E置低电平写指令时,就是让 E从0到1发生正跳变,所以应先置"0"_n op_();_nop_(); /空操作两个机器周期,给硬件反响时间LCD_Data=dictate;_n op_();_n op_();_n op_();_nop_(); /空操作四个机器周期,给硬件反响时间E=1;E置高电平_n op_();_n op_()

8、;_n op_();_nop_(); II空操作四个机器周期,给硬件反响时间E=0; II当E由高电平跳变成低电平时,液晶模块开场执行命令I*函数功能:指定字符显示的实际地址入口参数:x注:此函数已经加上了0x80,故只需写上实际地址就行*Ivoid Lcd_WriteAddress( un sig ned char x)Lcd_Write(x|0x80); II显示位置确实定方法规定为"80H+地址码x"I*函数功能:将数据字符的标准 ASCII码写入液晶模块入口参数:y为字符常量*Ivoid Lcd_WriteData( un sig ned char y)while(

9、Lcd_BusyTest()=1);RS=1;7/RS为高电平,RW为低电平时,可以写入数据RW=0;E=0; IIE置低电平写指令时,就是让 E从0到1发生正跳变,所以应先置"0" LCD_Data=y; II将数据送入P0 口,即将数据写入液晶模块_n op_();_n op_();_n op_();_nop_(); II空操作四个机器周期,给硬件反响时间E=1; IIE置高电平_n op_();_n op_();_n op_();_nop_(); II空操作四个机器周期,给硬件反响时间E=0; II当E由高电平跳变成低电平时,液晶模块开场执行命令I*函数功能:对 LC

10、D的显示模式进展初始化设置 *ivoid Lcd_I nt(void)Lcd_delay(15); II延时15ms,首次写指令时应给 LCD 一段较长的反响时间 Lcd_Write(0x38);II显示模式设置:16*2显示,5*7点阵,8位数据接口Lcd_delay(5); II 延时 5msLcd_Write(0x38);Lcd_delay(5);Lcd_Write(0x38); 3次写设置模式Lcd_delay(5);显示模式设置:显示开,有光标,光标不闪烁Lcd_delay(5);Lcd_Write(0x06);Lcd_delay(5);Lcd_Write(0x01);Lcd_del

11、ay(5); *Lcd_Write(OxOC); /显示模式设置:光标右移,字符不移/清屏幕指令,将以前的显示容去除函数功能: LCD 的显示 */void hua nyin g_show(void)un sig ned int Lcd_i;Lcd_Write(0x01); /清显示:清屏幕指令Lcd_delay(1);Lcd_WriteAddress(OxOO);/设置显示位置为第一行的第1个字Lcd_delay(1);for(Lcd=0;Lcd16;Lcd+) /显示字符 LIU JING Lcd_WriteData(stri ng1Lcd_i);Lcd_delay(150); Lcd_W

12、riteAddress(0x40);/设置显示位置为第二行的第1个字for(Lcd=0;Lcd16;Lcd+) /显示字符 080104020013 Lcd_WriteData(stri ng2Lcd_i);Lcd_delay(150); Lcd_delay(1000);/右侧移位进来 void don gtai_show(void)un sig ned int Lcd_i;Lcd_Write(0x01); /清显示:清屏幕指令Lcd_delay (2);Lcd_WriteAddress(0x10); /设置显示位置为最右侧Lcd_delay (2);for(Lcd=0;Lcd16;Lcd+)

13、/ 显示字符 LIU JINGLcd_WriteData(stri ng1Lcd_i);Lcd_dela y( 2);Lcd_WriteAddress(0x50); /设置显示位置为最右侧 for(Lcd=0;Lcd16;Lcd+)/显示字符 080104020013 Lcd_WriteData(stri ng2Lcd_i);Lcd_dela y( 2);for(Lcd=0;Lcd16;Lcd+) /开场左移Lcd_Write(0x18); /-左移指令Lcd_delay(400); Lcd_delay(1000);Lcd_Write(0x08);Lcd_delay(400);Lcd_Writ

14、e(0x0c);Lcd_delay(400);Lcd_Write(0x08);Lcd_delay(400);Lcd_Write(0x0c);Lcd_delay(400);Lcd_Write(0x08);Lcd_delay(400);Lcd_Write(0x0c);Lcd_delay(400);Lcd_Write(0x08);Lcd_delay(400);Lcd_Write(0x0c);Lcd_delay(1);时钟嶋(DS1J02)主控电路STC12C5A60S2ma电路取数据驱动LED数码管显示时间。图电子时钟设计框图STC12C5A60S2 单片机主要 I/O 口的分配, P1.4、P1.

15、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 / 14开始图7.1.2电子时钟程序设计流程图2、温度测量模块温度测量程序主要包括主程序,读出温度子程序, 温度转换子程序,计算温度子程序,显示数据子程序等。主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值, 温度测量每1s进展一次。这样可以在一秒之测量一次被测温度,其系统程序流程见图所示。发DS1

16、8B20复位命令发跳过ROM命令发读取温度命令读取操作,CRC校验图温度测量主程序流程图21 / 14图读温度流程图3、红外遥控解码模块1遥控器发射端程序流程图:2I±_-亠低电应V W i-Lfc幷F叮氐七1千ji禾訣m姝z 一1 I 1 MT HU二程序源代码1、实时时钟模块/*DS1302时寸钟显示程序 */#in clude<reg51.h>#in clude< intrin s.h>#i nclude<LCD1602.h>#defi ne uint un sig ned int#defi ne uchar un sig ned char/

17、变量定义sbit SCLK=P1A4;sbit DATA_IO=P1A5;sbit RESeT=P"6;sbit ACC0=ACCA0;sbit ACC7=ACCA7;uchar table116;uchar table216;uchar sec ond,minu te,hour,day, mon th,year;/*DS1302时钟局部子程序/向DS1302写入一个字节的函数/DS1302/DS1302/DS1302时钟控制总线 数据传送总线 复位总线/移位时的第/移位时的第定义秒分时日月年变量*/void Sen tByte(uchar byte)uchar i;ACC=byte

18、;for(i=8;i>0;i-)/相当于汇编中的 RRC DATA_IO=ACCO; 将自己的最低位传到时钟的数据总线上SCLK=1;时钟上升沿发送数据有效SCLK=0;清时钟总线ACC=ACC>>1;/将累加器中的数据右移1位/从DS1302读取一个字节函数uchar ReceiveByte(void)uchar i;for(i=8;i>0;i-) /相当于汇编中的 RRC ACC=ACC>>1;/将累加器中的数据右移1位ACC7=DATA_IO;/将数据线上的1位数据存入累加器中SCLK=1;/时钟上升沿发送数据有效SCLK=0;/清时钟总线return

19、(ACC);/函数最终返回读取的1字节数据/向DS1302的某个地址里写入数据函数void WriteClock(uchar Address,uchar Data)/Address:要写入数据的 DS1302 地址;Data:要写的数据RESET=0;复位引脚为低电平所有数据传送中止SCLK=0;/清时钟总线RESET=1;/复位引脚为高电平逻辑控制有效delay(10);Sen tByte(Address);/写入地址命令Se ntByte(Data);/写入1字节数据SCLK=1;/时钟总线置高RESET=0;/逻辑操作完毕,清复位总线/读取DS1302某地址的数据uchar ReadCl

20、ock(uchar Address)/Address:要读取数据的 DS1302 地址uchar Data;/定义数据变量RESET=0;/复位引脚为低电平所有数据传送终止SCLK=0;/清时钟总线RESET=1;/复位引脚为高电平逻辑控制有效delay(1);Se ntByte(Address|0X01);写入地址命令,读取地址为写入地址+1HData=ReceiveByte();/ 读取 1 字节数据SCLK=1;/时钟总线置高RESET=0;/逻辑操作完毕,清复位总线return(Data);/返回读取的数据/时钟芯片初始化函数void In it_Clock(void) uchar S

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

22、) uchar ReadValue;/定义变量ReadValue=ReadClock(0x81);seco nd=(ReadValue&0x70)>>4)*10+ (ReadValue&0x0F);将读取的秒数据的BCD码转换成十进制数据ReadValue=ReadClock(0x83);if (ReadValue>0x60) ReadValue=ReadClock(0x83);min ute=(ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); /BCD码转换成十进制数据将读取的分数据的ReadV

23、alue=ReadClock(0x85);if (ReadValue>0x24)ReadValue=ReadClock(0x85); hour=(ReadValue&0x70)>>4)*10BCD码转换成十进制数据ReadValue=ReadClock(0x87); day=(ReadValue&0x70)>>4)*10BCD码转换成十进制数据ReadValue=ReadClock(0x89);mo nth=(ReadValue&0x70)>>4)*10 BCD码转换成十进制数据ReadValue=ReadClock(0x8d)

24、; year=(ReadValue&0 xf0)>>4)*10BCD码转换成十进制数据table1O='D: table11='a: table12='t: table13='a' table14=':'table15='2'table16='O' table17=0x30+year/10; table18=0x30+year%10; table19='-'table110=0x30+mo nth/10;table111=0x30+mo nth%10; table112=

25、'-'table113=0x30+day/10; table114=0x30+day%10; table115=''table20=''table21=''table22=''table23=''table24=0x30+hour/10; table25=0x30+hour%10;table2 6=':'table27=0x30+mi nute/10;table28=0x30+mi nu te%10; table29=':'table210=0x30+seco nd/

26、10;table211=0x30+seco nd%10; table212=''table213=''table214=''table215=''+ (ReadValue&0x0F);+ (ReadValue&0 x0F);+ (ReadValue&0x0F);+ (ReadValue&0 x0F);/将读取的时数据的/将读取的日数据的/将读取的月数据的/将读取的年数据的/时钟显示函数void show_Data()1个字1个字ui nt i;Lcd_WriteAddress(OxOO); /设置显

27、示位置为第一行的第 for(i=0;i<16;i+)/显示字符 Lcd_WriteData(table1i);delay(10); Lcd_WriteAddress(0x40); /设置显示位置为第二行的第 for(i=0;i<16;i+)/显示字符 Lcd_WriteData(table2i);delay(10); void mai n()Lcd_I nt();/1602 初始化hua nyin g_show();Lcd_Write(0x01);Init_Clock();/ 将 1302 初始化while(1) Read_Date();show_Data(); -2、温度测量模块

28、/*DS18B29温度显示程序*/#in clude<reg51.h>#in clude< intrin s.h>#i nclude<LCD1602.H> #defi ne uchar un sig ned char#defi ne uint un sig ned intsbit DQ=P1A7;/DS18B20 与单片机连接口un sig ned char a,b;uint tvalue;/ 温度值uchar disdata12;void delay_18B20(u nsig ned int i)/ 延时 1 微秒 while(i-);_nop_();_n

29、op_(); 亠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;/ 拉高_n op_();_n op_();while(DQ);_n op_();_n op_();while(DQ);_n op_();uchar DS18B20rd()/* 读数据 */ un sig ned char i;un sig ned char d

30、at;DQ = 1;for (i=8;i>0;i-)dat>>=1;DQ = 0; /给脉冲信号_n op_();_no p_();_no p_();_no p_();DQ = 1; /给脉冲信号delay_18B20(5);if(DQ)dat|=0x80; delay_18B20(50); return(dat);void DS18B20wr(uchar wdata)/* un sig ned char d;int i;DQ = 1;for (i=8; i>0; i-) d=wdata&0x01;wdata>>=1;if(d)写数据*/DQ = 0

31、; delay_18B20(2); DQ=1;delay_18B20(60); elseDQ=0; delay_18B20(60);DQ=1;_n op_(); _n op_(); read_temp()/*读取温度值并转换*/DS18B20rst();DS18B20wr(0xcc);* DS18B20wr(0x44);* delay1ms(30);DS18B20rst();DS18B20wr(0xcc);*DS18B20wr(0xbe);* a=DS18B20rd(); b=DS18B20rd(); tvalue=b;跳过读序列号*/启动温度转换*/跳过读序列号*/读取温度*/tvalue=

32、tvalue<<8; tvalue=tvalue|a; if(tvalue&0x8000) tvalue=tvalue+1;tvalue=tvalue*(0.625); return(tvalue);void DS18B20disp()温度值显示 uint i;disdataO=T; disdata1='e'disdata2='m:disdata3='p:disdata4='t:disdata5=':'disdata 6=( in t)tvalue/1000+0x30;百位数disdata7=(i nt)(tvalue%1000)/100+0x30;十位数disdata8=(i nt)(tvalue%100)/10+0x30;个位数disdata9='.'disdata10=(i nt)tvalue%10+0x30;小数位disdata11=C;Lcd_WriteAddress(0x40);/设置显示位置为第二行的第1个字for(i=0;i<12;i+)/ 显示字符 Lcd_WriteData(disdatai);deiay(100);void ini tLCD()Lcdn t();hu

温馨提示

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

评论

0/150

提交评论