多点温度检测系统实验(设计性实验) 一、实验目的通过仿真搭建和实物搭建相结合,完成多点温度检测单片机系统设计。
二、实验内容1、方案一: 用8279芯片为键盘和数码显示控制芯片,完成灵活的设置与显示设计,建立基本的串行口(MAX232接口),普通的I/0口,A/D转换口功能,采样多个点,并按键显示不同的通道采样数据。
方案二: 以8255或8155芯片为键盘显示控制芯片,建立基本的串行口(MAX232楼口),普通的I/0日,VD转换转换口功能,采样多个点,并按键显示不同的通道采样数据。
2、用Proteus仿真软件搭建仿真硬件电路图。
验证编制软件。
3、用prote199s布原理图、建PCB板图。
4、实物器件焊接搭建。
三、硬件设计硬件元件参考清单单片机AT89C5 1 瓷片电容CAP30PF 晶振CRYSTAL12MHZ 电解电容CAP-ELEC 电阻RES 按钮BUTTON 发光数码管LED 插针8*2开关SWTTCH 排阳RES PACK-8 8*2排座单排20*1插针DS18B20 8255芯片热敏电阻74LS 138芯片74LS373 74LS245 DAC0809 232芯片以DS18B20为传感器、AT89C51单片机为控制核心组成多点温度测试系统。
四、实验程序以及系统框图:(一)系统框图:(二)实验程序:#include <REG51.H>#include <intrins.h>#include <math.h>#define uint unsigned int#define uchar unsigned charuchar temp_value; //温度值uchar TempBuffer[7];void show_time(); //液晶显示程序uchar temp_value1; //温度值uchar TempBuffer1[7];char xiaoshu=0;char xiaoshu1=0;void show_time1();/***********1602液晶显示部分子程序****************/char done,count,temp,flag,up_flag,down_flag;//Port Definitionssbit LcdRs = P2^0;sbit LcdRw = P2^1;sbit LcdEn = P2^2;sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口sbit DQ = P1^7; //温度传送数据IO口sbit DQ1=P1^6;//内部等待函数unsigned char LCD_Wait(void){LcdRs=0;LcdRw=1; _nop_();LcdEn=1; _nop_();LcdEn=0;return DBPort;}//向LCD写入命令或数据#define LCD_COMMAND 0 // Command#define LCD_DATA 1 // Data#define LCD_CLEAR_SCREEN 0x01 // 清屏#define LCD_HOMING 0x02 // 光标返回原点void LCD_Write(bit style, unsigned char input){LcdEn=0;LcdRs=style;LcdRw=0; _nop_();DBPort=input; _nop_();LcdEn=1; _nop_();LcdEn=0; _nop_();LCD_Wait();}//设置显示模式#define LCD_SHOW 0x04 //显示开#define LCD_HIDE 0x00 //显示关#define LCD_CURSOR 0x02 //显示光标#define LCD_NO_CURSOR 0x00 //无光标#define LCD_FLASH 0x01 //光标闪动#define LCD_NO_FLASH 0x00 //光标不闪动void LCD_SetDisplay(unsigned char DisplayMode){LCD_Write(LCD_COMMAND, 0x08|DisplayMode);}//设置输入模式#define LCD_AC_UP 0x02#define LCD_AC_DOWN 0x00 // default#define LCD_MOVE 0x01 // 画面可平移#define LCD_NO_MOVE 0x00 //defaultvoid LCD_SetInput(unsigned char InputMode){LCD_Write(LCD_COMMAND, 0x04|InputMode);}//初始化LCDvoid LCD_Initial(){LcdEn=0;LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵LCD_Write(LCD_COMMAND,0x38);LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动}//液晶字符输入的位置void GotoXY(unsigned char x, unsigned char y){if(y==0)LCD_Write(LCD_COMMAND,0x80|x);if(y==1)LCD_Write(LCD_COMMAND,0x80|(x-0x40));}//将字符输出到液晶显示void Print(unsigned char *str){while(*str!='\0'){LCD_Write(LCD_DATA,*str);str++;}}/************************ds18b20子程序*************************//***********ds18b20延迟子函数(晶振12MHz )*******/void delay_18B20(unsigned int i){while(i--);}/***************ds18b20初始化函数*****************/void Init_DS18B20(void) {unsigned char x=0;DQ = 1; //DQ复位delay_18B20(8); //稍做延时DQ = 0; //单片机将DQ拉低delay_18B20(80); //精确延时大于480usDQ = 1; //拉高总线delay_18B20(14);x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay_18B20(20);}/***********ds18b20读一个字节**************/unsigned char ReadOneChar(void){uchar i=0;uchar dat = 0;for (i=8;i>0;i--) {DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;delay_18B20(4);}return(dat);}/*************ds18b20写一个字节****************/void WriteOneChar(uchar dat){unsigned char i=0;for (i=8; i>0; i--){ DQ = 0;DQ = dat&0x01;delay_18B20(5); DQ = 1;dat>>=1;}}/**************读取ds18b20当前温度************/void ReadTemp(void){unsigned char a=0;unsigned char b=0;char t;long tt;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换delay_18B20(100); // this message is wery importantInit_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度delay_18B20(100);a=ReadOneChar(); //读取温度值低位b=ReadOneChar(); //读取温度值高位temp_value=b<<4;temp_value+=(a&0xf0)>>4;t=a&0x0f;tt=t*625;xiaoshu=tt/1000;}void temp_to_str(){ //温度数据转换成液晶字符显示TempBuffer[0]=temp_value/10+'0'; //十位TempBuffer[1]=temp_value%10+'0'; //个位TempBuffer[2]='.';TempBuffer[3]=xiaoshu+'0';TempBuffer[4]=0xdf;TempBuffer[5]='C';TempBuffer1[6]='\0';}void Delay1ms(unsigned int count){unsigned int i,j;for(i=0;i<count;i++)for(j=0;j<120;j++);}void show_time(){//液晶显示程序ReadTemp(); //开启温度采集程序temp_to_str();GotoXY(0,0);Print("NO.1");GotoXY(0,1); //温度数据转换成液晶字符Print("TEMP:");GotoXY(6,1); //液晶字符显示位置Print(TempBuffer); //显示温度Delay1ms(400); //扫描延时}/********************************ds18b20子程序*******************************//*********************ds18b20延迟子函数(晶振12MHz )*******************//****************ds18b20初始化函数****************/void Init_DS18B201(void) {unsigned char x=0;DQ1 = 1; //DQ复位delay_18B20(8); //稍做延时DQ1 = 0; //单片机将DQ拉低delay_18B20(80); //精确延时大于480usDQ1 = 1; //拉高总线delay_18B20(14);x=DQ1; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay_18B20(20);}/**************ds18b20读一个字节**************/unsigned char ReadOneChar1(void){uchar i=0;uchar dat = 0;for (i=8;i>0;i--){DQ1 = 0; //给脉冲信号dat>>=1;DQ1 = 1; //给脉冲信号if(DQ1)dat|=0x80;delay_18B20(4);}return(dat);}/*************ds18b201写一个字节****************/void WriteOneChar1(uchar dat){unsigned char i=0;for (i=8; i>0; i--){DQ1 = 0;DQ1 = dat&0x01;delay_18B20(5);DQ1 = 1;dat>>=1;}}/**************读取ds18b201当前温度************/void ReadTemp1(void){unsigned char a=0;unsigned char b=0;unsigned char t=0;long tt;Init_DS18B201();WriteOneChar1(0xCC); // 跳过读序号列号的操作WriteOneChar1(0x44); // 启动温度转换delay_18B20(100); // this message is very importantInit_DS18B201();WriteOneChar1(0xCC); //跳过读序号列号的操作WriteOneChar1(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度delay_18B20(100);a=ReadOneChar1(); //读取温度值低位b=ReadOneChar1(); //读取温度值高位temp_value1=b<<4;temp_value1+=(a&0xf0)>>4;t=a&0x0f;tt=t*625;xiaoshu1=tt/1000;}void temp_to_str1() //温度数据转换成液晶字符显示{ TempBuffer1[0]=temp_value1/10+'0'; //十位TempBuffer1[1]=temp_value1%10+'0'; //个位TempBuffer1[2]='.';TempBuffer1[3]=xiaoshu1+'0';TempBuffer1[4]=0xdf; //温度符号TempBuffer1[5]='C';TempBuffer1[6]='\0';}void show_time1(){//液晶显示程序ReadTemp1(); //开启温度采集程序temp_to_str1();GotoXY(0,0);Print("NO.2");GotoXY(0,1); //温度数据转换成液晶字符Print("TEMP:");GotoXY(6,1); //液晶字符显示位置Print(TempBuffer1); //显示温度Delay1ms(400); //扫描延时}main(){LCD_Initial(); //液晶初始化Init_DS18B20( ) ; //DS18B20初始化Init_DS18B201( );GotoXY(1,0);Print("HELLO");GotoXY(1,1);Print("LET’S DO IT");//("design by wy!");ReadTemp();ReadTemp1();Delay1ms(2000);LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);while(1){show_time(); //液晶显示数据// flag=0;Delay1ms(2000);LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);show_time1();// flag=0;Delay1ms(2000);LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);}}五、电路图六、实验结果与分析1、Keil代码运行状况:2、isis仿真运行画面:1)数码管初始画面2)两秒后显示第一个传感器所测温度3)再两秒后显示第二个传感器所测温度(接下来重复显示两个传感器温度)七、思考本次实验通过仿真搭建和实物搭建相结合,以DS18B20为传感器、AT89C51单片机为控制核心,完成了多点温度检测单片机系统的设计。