1、STC12C5A60S2单片机课程设计报告一、课程设计基本情况介绍1.1课程设计的基本目的与任务本课程设计旨在驾驭本专业学生理论指导实践能力以及电子产品工程设计与开发能力。本实践课所要达到的主要目的是:1、通过本次课程设计,是对学生综合能力的检,提高学生综合运用专业知识,强化单片机应用系统设计与防震能力。2、本次课程设计是在生产实习所完成的“单片机核心板+电子钟模块+MP3模块+RFID模块+无线传输模块+GPS模块+脉搏传感模块”的基础上设计该硬件系统的工作程序。1.2课程设计的基本内容1、在生产实习设计单片机硬件系统的基础上,设计相应的应用软件系统。2、在LCD1602上显示学号程序设计。
2、3、基于DS1302的实时时钟软件设计。4、基于DS18B20的温度测量软件设计。5、基于TL1838A的红外遥控解码软件设计。6、设计应用软件系统框图和流程图,完成所设计软件的调试。1.3课程设计的教学要求1、通过资料查阅及学习了解单片机应用系统的软件设计方法及单片机编程、软硬件联机调试技巧。2、独立设计并编写下列应用程序:(1)LCD1602学号显示程序;(2)DS1302实时时钟程序;(3)DS18B20温度测量程序;(4)TL1838A红外遥控解码程序;3、独立完成所设计程序与硬件系统的联机仿真。二、整机系统框图(硬件、软件)该设计方案是以STC12C5A60S2单片机为核心,采用LC
3、D液晶屏幕显示模块、实时时钟模块、温度测量模块、红外遥控解码等模块所构建的系统,能在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 mai
5、n()Lcd_Int(); /1602初始化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,忙碌;
6、result=0,不忙*/bit Lcd_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
7、); /忙就等待RS=0; /根据规定,RS和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
8、注:此函数已经加上了0x80,故只需写上实际地址就行*/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; /将数据送
9、入P0口,即将数据写入液晶模块_nop_();_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(
10、5); /延时5msLcd_WriteCom(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;
11、Lcd_WriteCom(0x01); /清显示:清屏幕指令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);Lc
12、d_delay(150); Lcd_delay(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
13、=0;Lcd_i16;Lcd_i+)/显示字符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(
14、400);Lcd_WriteCom(0x08);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及键扫描电路组成。电子万年历的
15、程序主要包括3个方面的内容:一是DS1302从单片机中读取数据进行计数,二是利用按键进行时间的调整,三是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所示。 图7.2.1温度测量主程序流程图图7.2.2读温度流程图 3、红外遥控解码模块(1)遥控器发射端程序流程图:(2)遥控器接收端程序流程图:(二)程序源代码1、实时时钟模块/*DS1302时钟显示程序*/#include#include#include#define uint unsigned int#define uchar unsigned char/变量定义sbit
17、 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;/定义秒分时日月年变量 /*DS1302时钟部分子程序*/向DS1302写入一个字节的函数void SentByte(uchar byte)uchar i;ACC=byte;for(i=8;i
18、0;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=DATA_IO;/将数据线上的1位数据存入累加器中 SCLK=1;/时钟上升沿发送数据有效 SCLK=0;/清时钟总线 return(ACC);/函数最终返回读取的1字节数据/向D
19、S1302的某个地址里写入数据函数void WriteClock(uchar Address,uchar Data)/Address:要写入数据的DS1302地址;Data:要写的数据RESET=0;/复位引脚为低电平所有数据传送中止SCLK=0;/清时钟总线RESET=1;/复位引脚为高电平逻辑控制有效delay(10);SentByte(Address);/写入地址命令SentByte(Data);/写入1字节数据SCLK=1;/时钟总线置高RESET=0;/逻辑操作完毕,清复位总线/读取DS1302某地址的数据uchar ReadClock(uchar Address)/Address:
20、要读取数据的DS1302地址uchar Data;/定义数据变量RESET=0;/复位引脚为低电平所有数据传送终止SCLK=0;/清时钟总线RESET=1;/复位引脚为高电平逻辑控制有效delay(1);SentByte(Address|0X01);/写入地址命令,读取地址为写入地址+1HData=ReceiveByte();/读取1字节数据SCLK=1;/时钟总线置高RESET=0;/逻辑操作完毕,清复位总线return(Data);/返回读取的数据/时钟芯片初始化函数void Init_Clock(void) uchar Second=ReadClock(0x81);/读取秒数据 if(S
21、econd&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,0x00); WriteClock(0x8e,0x80);/禁止写入 void Read_Date(void) uchar ReadValue;/定义变量 ReadValue=Rea
22、dClock(0x81); second=(ReadValue&0x70)4)*10 + (ReadValue&0x0F);/将读取的秒数据的BCD码转换成十进制数据 ReadValue=ReadClock(0x83); if (ReadValue0x60) ReadValue=ReadClock(0x83); minute=(ReadValue&0x70)4)*10 + (ReadValue&0x0F); /将读取的分数据的BCD码转换成十进制数据 ReadValue=ReadClock(0x85); if (ReadValue0x24) ReadValue=ReadClock(0x85);
23、 hour=(ReadValue&0x70)4)*10 + (ReadValue&0x0F); /将读取的时数据的BCD码转换成十进制数据 ReadValue=ReadClock(0x87); day=(ReadValue&0x70)4)*10 + (ReadValue&0x0F); /将读取的日数据的BCD码转换成十进制数据 ReadValue=ReadClock(0x89); month=(ReadValue&0x70)4)*10 + (ReadValue&0x0F); /将读取的月数据的BCD码转换成十进制数据 ReadValue=ReadClock(0x8d); year=(ReadV
24、alue&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/10; table111=0x30+month%10; table112=-; table113=0x30+day/10; table114=0x30+day%10; table1
25、15= ; 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= ;/时钟显示函数void show_Data()uint i;Lcd_Write
26、Address(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初始化 huanying_show(); Lcd_WriteCom(0x01); Init_Clock(); /将1302初始化 while(1) Read_Date(); show_Data();2、温度测量模块/*DS18B29温度显示程序*/#include#include#include#define uchar unsigned char #define uin
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1