|
|
100黑币
分布式温度测量系统设计,为什么我运行出来就显示127°怎么改都没办法
U5主机代码
#include <reg52.h>
#include <stdio.h>
typedef unsigned char u8;
typedef unsigned int u16;
#define LCD_DATA_PORT P1
sbit LCD_RS = P2^6;
sbit LCD_RW = P2^5;
sbit LCD_EN = P2^7;
sbit LED_HIGH = P2^0;
sbit LED_LOW = P2^1;
char Disp_Temp = 0;
char Temp_String[16];
void delay_ms(u16 ms) {
u16 i, j;
for(i=0; i<ms; i++)
for(j=0; j<110; j++);
}
void LCD_WriteCmd(u8 cmd) {
LCD_RS = 0; LCD_RW = 0; LCD_EN = 0;
LCD_DATA_PORT = cmd;
delay_ms(1);
LCD_EN = 1; delay_ms(1); LCD_EN = 0;
}
void LCD_WriteData(u8 dat) {
LCD_RS = 1; LCD_RW = 0; LCD_EN = 0;
LCD_DATA_PORT = dat;
delay_ms(1);
LCD_EN = 1; delay_ms(1); LCD_EN = 0;
}
void LCD_Init() {
delay_ms(15);
LCD_WriteCmd(0x38);
LCD_WriteCmd(0x0C);
LCD_WriteCmd(0x06);
LCD_WriteCmd(0x01);
delay_ms(5);
}
void LCD_ShowString(u8 x, u8 y, char *str) {
u8 addr;
if (y == 0) addr = 0x80 + x;
else addr = 0xC0 + x;
LCD_WriteCmd(addr);
while (*str) {
LCD_WriteData(*str++);
}
}
void Check_Alarm(char t) {
if (t > 70) {
LED_HIGH = 0;
} else {
LED_HIGH = 1;
}
if (t < -20) {
LED_LOW = 0;
} else {
LED_LOW = 1;
}
}
void UART_Init() {
TMOD = 0x20;
TH1 = 0xFD;
TL1 = 0xFD;
TR1 = 1; REN = 1; SM0 = 0; SM1 = 1; EA = 1; ES = 1;
}
void main() {
u16 count = 0;
LED_HIGH = 1;
LED_LOW = 1;
UART_Init();
LCD_Init();
LCD_ShowString(0, 0, "System Init...");
delay_ms(500);
LCD_WriteCmd(0x01);
while(1) {
sprintf(Temp_String, "Temp: %d C ", (int)Disp_Temp);
LCD_ShowString(0, 0, Temp_String);
if(Disp_Temp > 70)
LCD_ShowString(0, 1, "Warning: HIGH! ");
else if(Disp_Temp < -20)
LCD_ShowString(0, 1, "Warning: LOW! ");
else
LCD_ShowString(0, 1, "Status: Normal ");
Check_Alarm(Disp_Temp);
count++;
if(count > 100) {
count = 0;
SBUF = 0x01;
while(!TI); TI = 0;
}
delay_ms(10);
}
}
void UART_Routine() interrupt 4 {
if(RI) {
Disp_Temp = SBUF;
RI = 0;
}
}
U6从机代码
#include <reg52.h>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit DQ = P2^0;
char temp_val = 0;
void delay_us(u16 us) {
while(us--) {
_nop_();
_nop_();
}
}
bit DS18B20_Init() {
bit ack;
DQ = 1;
_nop_();
DQ = 0;
delay_us(250);
DQ = 1;
delay_us(30);
ack = DQ;
delay_us(200);
return ack;
}
void DS18B20_WriteByte(u8 dat) {
u8 i;
for(i=0; i<8; i++) {
DQ = 0;
_nop_();
DQ = dat & 0x01;
delay_us(30);
DQ = 1;
dat >>= 1;
_nop_();
}
}
u8 DS18B20_ReadByte() {
u8 i, dat = 0;
for(i=0; i<8; i++) {
dat >>= 1;
DQ = 0;
_nop_();
DQ = 1;
_nop_(); _nop_(); _nop_();
if(DQ) dat |= 0x80;
delay_us(30);
}
return dat;
}
char Get_Temperature() {
u8 L, H;
if(DS18B20_Init() == 1) return 0;
DS18B20_WriteByte(0xCC);
DS18B20_WriteByte(0x44);
DS18B20_Init();
DS18B20_WriteByte(0xCC);
DS18B20_WriteByte(0xBE);
L = DS18B20_ReadByte();
H = DS18B20_ReadByte();
return (H << 4) | (L >> 4);
}
void UART_Init() {
TMOD = 0x20; TH1 = 0xFD; TL1 = 0xFD; TR1 = 1; REN = 1; SM0 = 0; SM1 = 1; EA = 1; ES = 1;
}
void main() {
UART_Init();
while(1) {
temp_val = Get_Temperature();
{
volatile u16 x = 30000;
while(x--);
}
}
}
void UART_Routine() interrupt 4 {
if(RI) {
if(SBUF == 0x01) { SBUF = temp_val; while(!TI); TI = 0; }
RI = 0;
}
}
|
最佳答案
查看完整内容
在没有充分经验的前提下不要试图直接设计复杂的应用。可以先设计单个DS18B20的测温LCD1602显示系统。调试成功后再扩展为多个DS18B20分布式温度测量系统,既可以采用单总线分布式方式也可以采用各自独立的分布方式。在此基础上调通后再拆分为主从机。无非就是将本系统显示缓存中的数据通过串口在另一个系统中显示。只要按上述步骤逐一调通,其实没有什么难度。
|