多点温度检测系统实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
多点温度检测系统实验(设计性实验) 一、实验目的
通过仿真搭建和实物搭建相结合,完成多点温度检测单片机系统设计。
二、实验内容
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
#include
#include
#define uint unsigned int
#define uchar unsigned char
uchar 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 Definitions
sbit 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 //default
void LCD_SetInput(unsigned char InputMode){
LCD_Write(LCD_COMMAND, 0x04|InputMode);
}
//初始化LCD
void 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); //精确延时大于480us
DQ = 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; // 给脉冲信号