当前位置:文档之家› 微机课设实验报告

微机课设实验报告

微机课程设计数字温度计实验报告一、题目:上位机:完成界面设计与通讯程序1、能够显示两个温度值,温度精度0.5度,当超出报警温度阈值时,温度值后又提示字幕。

2、能够设定报警温度阈值3、每隔一秒将温度值保存至文件存档。

当超出报警温度阈值时,温度值后面有提示。

4、可以对串口进行设置。

下位机:完成电路设计与控制程序1、用两个DS18B20测温。

2、通过串口与上位机通信,并传输温度值,接受阈值设置。

3、当超出报警温度阈值时,有相应指示灯提示。

4、将当前温度显示LCD1602液晶屏上,当超出报警温度阈值时,温度值后有提示。

二、原理DS18B20是DALLS公司推出的“1—wire”接口的数字温度传感器,可以直接将温度转换为9~12串行信号供单片机处理。

由于这种传感器只有一个IO口,是单总线串行接口,单片机可以利用串行通信将数据读出并按照LCD 的协议显示在1602液晶屏上。

同时,通过PC机与单片机之间的串行通信,可以用PC机控制温度的警戒值以及记录不同时间测量的温度。

三、原理图图3.1 LCD、18B20以及串口与单片机最小系统连接图图3.2电源模块四、流程图1、上位机流程图图4.1.1发送数据流程图图4.1.2 接受数据流程图2、下位机流程图图4.2.2读出温度子程序流程图图4.2.1总流程图图4.2.4计算温度子程序流程图图4.2.3 温度转换流程图图4.2.6温度值显示在LCD1602上图4.2.5 显示数据刷新子程序五、源程序1、上位机程序:见附录1;2、下位机程序:见附录2;3、实验结果显示(上位机):见附录3。

六、问题与解决1、电路图绘制使用Altium Designer绘制电路图,因为是现学绘制,因此对于绘制过程中的单片机等器件的封装问题由于软件数据库的容量,其中并没有提供单片机芯片的封装。

因此是询问了同学以及上网下载数据库,对于MAX232则是直接用矩形框绘制。

2、下位机程序编写下位机的程序主要用keil4编写,出现的问题是遗忘了很多编写注意事项,只能采集温度,而无法正常显示在LCD1602液晶屏上,查找了LCD1602的数据手册以及基础显示程序,可以显示温度。

但是,在于上位机的信号传送时又出问题,只能发送数据,无法接收,以至于无法控制阈值温度,后来队友侯棋文解决了。

七、总结本次课程设计题目是数字温度计,分为上位机程序界面曲线阈值控制以及下位机程序以及下位机的温度采集显示。

上位机程序用C#编写,下位机用keil编写,我主要是下位机程序。

从DS18B20的初始化采集温度,到LCD1602的初始化显示温度学到了很多也暴露了很多基础不扎实的问题。

串口的通信数据传送还未把握住。

不过收获了很多,重新系统的学习了程序的编写及其具体使用,对于主动学习有了跟明显的理解。

同事注重问题交流以及询问。

八、工作量说明侯棋文负责上位机程序的编写(c#)绘制流程图以及指导队友下位机的程序编写;林天颂负责下位机程序的编写(c)绘制流程图和电路图的绘制。

附录1:下位机程序//头文件:#include "reg51.h"#include "ds18b20.h" //引入DS18B20头文件/********宏定义***********************************************************/#define LCD_Data P0#define Busy 0x80 //用于检测LCD状态字中的Busy标识//变量定义:unsigned char datasend[3];unsigned char ly_dis[4];//定义显示缓冲区unsigned char l_posit=0; //显示位置//引脚定义:sbit LCD_RS=P1^0;//定义引脚sbit LCD_RW=P1^1;sbit LCD_E=P1^2;/********函数声明*************************************************************/void WriteDataLCD(unsigned char WDLCD); //写数据void WriteCommandLCD(unsigned char WCLCD,BuysC); //写命令unsigned char ReadDataLCD(void); //读数据unsigned char ReadStatusLCD(void); //读状态void LCDInit(void); //初始化void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData); //相应坐标显示字节内容void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData); //相应坐标开始显示一串内容void Delay5Ms(void); //延时void Delay400Ms(void); //延时//函数声明://void display(void);//显示函数,显示缓冲区内容void delay(void);void delaysend(int ms){int i;for (i=0;i<ms;i++){;}}//主函数,C语言的入口函数:void main(){float temp;int canhigh = 0;int canlow = 0;unsigned int i=0;float tt;int ltemp;unsigned char ldat;TMOD=0X20; //设置定时器1为模式2,做为波特率发生器TL1=0xF3; //2400波特率的初值,板子使用12M晶振,初值=256-12000000/32/12/2400TH1=0xF3; //TR1=1; //启动波特率发生SCON=0x50;datasend[0] = 0xff;//lcd开始Delay400Ms(); //启动等待,等LCD讲入工作状态LCDInit(); //初始化Delay5Ms(); //延时片刻(可不要)while(1){if(i==0)tmpchange(); //温度转换if(i==100){tt=tmp()*0.0625; //得到真实十进制温度值,因为DS18B20//可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度。

ltemp=tt*10+0.5; //放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作。

if(ltemp<0){ //判断第一位显示整数还是负号ly_dis[0]=0xbf;ltemp=0-ltemp;}elsely_dis[0]=ltemp/1000;//显示百位值ltemp=ltemp%1000;ly_dis[1]=ltemp/100; //显示温度十位值ltemp=ltemp%100;ly_dis[2]=ltemp/10; //显示温度个位值ly_dis[3]=ltemp%10; //显示小数点后一位datasend[1] = ly_dis[0]*10+ly_dis[1];datasend[2] = ly_dis[2]*10+ly_dis[3];SBUF=datasend[0]; //将接收到的数据发送出去while(!TI); //等待发送完成TI=0;delaysend(500);SBUF=datasend[1]; //将接收到的数据发送出去while(!TI); //等待发送完成TI=0;delaysend(500);SBUF=datasend[2]; //将接收到的数据发送出去while(!TI); //等待发送完成TI=0;delaysend(500);}DisplayOneChar(0,1,(unsigned char)(48+ly_dis[0])); //将数据在LCD1602上显示DisplayOneChar(1,1,(unsigned char)(48+ly_dis[1]));DisplayOneChar(2,1,(unsigned char)(48+ly_dis[2]));DisplayOneChar(3,1,46);DisplayOneChar(4,1,(unsigned char)(48+ly_dis[3]));temp = ly_dis[0]*100+ly_dis[1]*10+ly_dis[2]+ly_dis[3]/10.0;if (temp>32&&canhigh ==0) //如果超过阈值上限显示警告“HIGH”{canhigh = 1;DisplayOneChar(0,0,'H');DisplayOneChar(1,0,'I');DisplayOneChar(2,0,'G');DisplayOneChar(3,0,'H');}if (temp<32&& canhigh==1) //如果超过阈值上限,在显示警告同时显示温度值{DisplayOneChar(0,0,' ');DisplayOneChar(1,0,' ');DisplayOneChar(2,0,' ');DisplayOneChar(3,0,' ');canhigh = 0;}if (temp<29&&canlow ==0) //如果低于阈值下限显示警告“LOW”{canlow = 1;DisplayOneChar(0,0,'L');DisplayOneChar(1,0,'O');DisplayOneChar(2,0,'W');}if (temp>29&&canlow ==1) //如果低于阈值上下限,在显示警告同时显示温度值{canlow = 0;DisplayOneChar(0,0,' ');DisplayOneChar(1,0,' ');DisplayOneChar(2,0,' ');// DisplayOneChar(3,0,'H');}i++;if(i==3000)i=0;//display(); //调用显示delay();}}/***********写数据********************************************************/void WriteDataLCD(unsigned char WDLCD){ReadStatusLCD(); //检测忙LCD_Data = WDLCD;LCD_RS = 1;LCD_RW = 0;LCD_E = 0; //若晶振速度太高可以在这后加小的延时LCD_E = 0; //延时LCD_E = 1;}/***********写指令********************************************************/ void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测{if (BuysC) ReadStatusLCD(); //根据需要检测忙LCD_Data = WCLCD;LCD_RS = 0;LCD_RW = 0;LCD_E = 0;LCD_E = 0;LCD_E = 1;}/***********读数据********************************************************/ unsigned char ReadDataLCD(void){LCD_RS = 1;LCD_RW = 1;LCD_E = 0;LCD_E = 0;LCD_E = 1;return(LCD_Data);}/***********读状态*******************************************************/ unsigned char ReadStatusLCD(void){LCD_Data = 0xFF;LCD_RS = 0;LCD_RW = 1;LCD_E = 0;LCD_E = 0;LCD_E = 1;while (LCD_Data & Busy); //检测忙信号return(LCD_Data);}/***********初始化********************************************************/ void LCDInit(void){LCD_Data = 0;WriteCommandLCD(0x38,0); //三次模式设置,不检测忙信号Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,1); //显示模式设置,开始要求每次检测忙信号WriteCommandLCD(0x08,1); //关闭显示WriteCommandLCD(0x01,1); //显示清屏WriteCommandLCD(0x06,1); //显示光标移动设置WriteCommandLCD(0x0C,1); //显示开及光标设置}/***********按指定位置显示一个字符*******************************************/void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData){Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; //算出指令码WriteCommandLCD(X, 0); //这里不检测忙信号,发送地址码WriteDataLCD(DData);}/***********按指定位置显示一串字符*****************************************/ void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData){unsigned char ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1while (DData[ListLength]>=0x20){ //若到达字串尾则退出if (X <= 0xF){ //X坐标应小于0xFDisplayOneChar(X, Y, DData[ListLength]); //显示单个字符ListLength++;X++;}}}/***********短延时********************************************************/ void Delay5Ms(void){unsigned int TempCyc = 5552;while(TempCyc--);}/***********长延时********************************************************/ void Delay400Ms(void){unsigned char TempCycA = 5;unsigned int TempCycB;while(TempCycA--){TempCycB=7269;while(TempCycB--);}}//延时子函数,短暂延时void delay(void){unsigned char i=10;while(i--);}附录2:上位机程序附录3:实验结果上位机界面截图:。

相关主题