桂林电子科技大学毕业设计(论文)报告用纸 第18 页
第三部分是供电。15脚GND接地、16脚VCC接+5V。
本设计选用RE-232作为串行通信是因为其串行通信简单易控制,且I/O口少,成本低。符合本设计的各项要求。
4 软件设计
4.1 Keil uVision 4软件介绍
Keil C51是美国Keil software公司(ARM公司)出品的51系列兼容单片机C语言软件开发系统,C语言在功能、结构性、可读性、可维护性上比汇编语言更具有优势,因为易学易用,适合每个阶段的开发人员,不管专业的应用工程师,还是在校学习软件开发的学生。
Keil C51软件包含了丰富的库函数和功能强大的集成开发调试工具。C51工具包的整体结构,其中uVision与Ishell分别是C51 for Windows和for Dos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。开发人员可以将编辑好的C或汇编源文件分别有C51及A51编译器生成目标文件(.OBJ)。目标文件再由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中[11]。
另外,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。
Keil uVision4是2011年3月ARM公司发布最新集成开发环境RealView MDK开发工具中集成了最新版本,其编译器、调试工具实现与ARM器件的最完美匹配。 4.2 程序设计思想与开发环境
在本设计中,软件系统采用模块化的编程方式,把整体程序分成若干部模块,每个模块具有相对的独立性,也可通过函数调用的发式相互关联。模块化的编程发式利于程序的调试、修改和维护,其思路清晰有条理,便于阅读,被各类开发人员广泛的使用。
本系统软件设计采用C语言编程,开发环境: PC操作系统Windows 7,单片机开发平台keil uVision 4,程序下载软件为STC_ISP_V483。
18
桂林电子科技大学毕业设计(论文)报告用纸 第19 页
4.3 主程序设计
在本设计中,软件根据设计的要求进行编写,要求将红外对管传感器、DS18B20温度传感器、DS1302时钟芯片所测得数据送进STC89C52单片中,再由其将速度、路程、温度、时间等参数送至LCD12864中显示。主程序工作流程如图4-1所示。
图4-1主程序流程图
4.4 各个模块程序设计
4.4.1 红外对管测速模块程序设计
当单片机获取从红外对管测速模块中产生的脉冲个数时,无法马上得出当前车轮的速度和里程,要经过单片机定时器的计算才能得出结果,本系统默认车轮的周长为1米,使用者可以自己设置车轮的大小。本系统通过单片机计算单位时间内接收脉冲的个数来得出速度,再将单位时间内的速度相加得到其路程数,系统计算时间为0.5秒计算一次。在Proteus仿真的结果与计算结果一致。下图4-2为测速子程序设计的流程图。
19
桂林电子科技大学毕业设计(论文)报告用纸 第20 页
图4-2 测速流程图
程序核心代码如下: if(flag)
{
flag = 0; TR0 = 0; EX0 = 0; Couter = 0;
//关闭定时器0 //关闭外部中断
//500ms显示一次速度
Speed = Couter/2; //一个脉冲等于25cm
//清零
bai=Speed/100; shi=Speed0/10; ge=Speed0; Write_Address(2,5); Write_Data(d[bai]); Write_Data(d[shi]); Write_Data(d[ge]);
20
桂林电子科技大学毕业设计(论文)报告用纸 第21 页
{
TR0=1; //打开定时器0
//打开外部中断
EX0 = 1;
}
if((Speed == 0)&(flag1 == 1)) //路程显示
void timer0(void) interrupt 1 //定时器0中断服务程序 TH0=(65536-50000)/256; TL0=(65536-50000)%6; num++; if(num==10) { }
void int0(void) interrupt 0 //外部中断0服务程序 {
Couter++; //计算速度 Couter1++; //计算路程
4.4.2 DS18B20温度测量模块程序设计
本设计采用DS1820温度传感器进行温度测量,并将其测得数据在LCD12864上显示,因为DS18B20只有一条数据输出线,所以一定要采用一位读取,读取到的温度值分别存入高/低八位寄存器中,显示时要将十六位进制数值转换成十进制。温度测量模块的程序流程如下图4-3所示。
EX0 = 0; num = 0; TR0 = 0; flag =1;
//清零计数
//关闭定时器0 //打开标志位
//定时500ms 显示一次速度
}
21
桂林电子科技大学毕业设计(论文)报告用纸 第22 页
图4-3温度测量模块程序流程图
温度测量模块程序核心代码如下:
bit Init_DS18B20(void) //函数功能:将DS18B20传感器初始化,读取应答信号 出口参数:flag
{
bit flag; DQ = 1;
for(time=0;time<2;time++) ; DQ = 0;
for(time=0;time<200;time++) ; DQ = 1;
for(time=0;time<10;time++) ; flag=DQ; for(time=0;time<200;time++) ; return (flag); }
unsigned char ReadOneChar(void) 节数据 出口参数:dat
{
//函数功能:从DS18B20读取一个字
22