双机通信发送温度16位数据出现有关问题。高手帮忙看看
双机通信发送温度16位数据出现问题。高手帮忙看看
我是用A单片机采集18b20温度数据然后通过串口把温度数据发给B单片机,两边都通过lcd1602液晶显示。通过串口助手调试时A机发送正常,然后B机接受就出现问题。A机是把温度16位数据分成8位分两次发的,接收时是在原封不动和在一起进行处理。但是就是出现问题了,麻烦高手帮忙看看。所有程序贴过来有五百多行,为方便大家看,我只把串口及主程序贴过来。不重要的全部略去。[code]
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
int temper=0;
int temp=1;
/*------------------------------------------------
串口初始化函数
-----------------------------------------------*/
void UART_Init (void)
{
SCON = 0x50; //REN=1允许串行接受状态,串口工作模式2
TMOD|= 0x20; //定时器工作方式2
//PCON|= 0x80; //波特率提高一倍
TH1 = 0xFd; // //baud*2 /* 波特率4800、数据位8、停止位1。效验位无 (11.0592M)
TL1 = 0xFd;
TR1 = 1; //开启定时器1
ES = 1; //开串口中断
EA = 1; // 开总中断
}
/*-----------------------------------------------
名称:串口通信
频率;11.0592
内容:主机程序,给从机发送信息
-----------------------------------------------*/
void Uart_send(uchar send_dat)
{
SBUF=send_dat;
while(!TI);
TI=0;
}
void Uart_scan()
{
// uchar temperl,temperh;
// temperl=temper/256;
// temperh=temper*256;
if(temp!=temper)
{
// SBUF =temper; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
// SBUF =temper/256;
// while(!TI); // 等特数据传送 (TI发送中断标志)
// TI = 0; // 清除数据传送标志
// SBUF =temper%256;
// while(!TI); // 等特数据传送 (TI发送中断标志)
// TI = 0;
Uart_send(temper/256);
Uart_send(temper%256);
temp=temper;
}
// DelayMs(1000);
// SBUF =temper%256;
// while(!TI);
// TI=0;
// P1=(temper)%100/10;
// DelayMs(1000);
}
/*------------------------------------------------
主函数
-----------------------------------------------*/
void main()
{
uchar *dat,*dat1;
dat="overload:";
dat1="Fixed:";
LCD_Init(); //液晶初始化
LCD_Clear(); //液晶清屏
UART_Init();
while(1)
{
alarm(); //报警函数扫描
keyscan(); //按键函数扫描
temper=read_temp();
//DelayMs(10000);
Uart_scan();
if(temper<0) //用于检测负温度值,去掉不影响程序
{
LCD_Write_String(0,0,'-');
temper=-temper;
}
else
LCD_Write_String(0,0,dat); //第一行显示overload
LCD_Write_Char(9,0,(temper>>4)%100/10+0x30); //显示温度十位,加0x30转成asscii码
我是用A单片机采集18b20温度数据然后通过串口把温度数据发给B单片机,两边都通过lcd1602液晶显示。通过串口助手调试时A机发送正常,然后B机接受就出现问题。A机是把温度16位数据分成8位分两次发的,接收时是在原封不动和在一起进行处理。但是就是出现问题了,麻烦高手帮忙看看。所有程序贴过来有五百多行,为方便大家看,我只把串口及主程序贴过来。不重要的全部略去。[code]
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
int temper=0;
int temp=1;
/*------------------------------------------------
串口初始化函数
-----------------------------------------------*/
void UART_Init (void)
{
SCON = 0x50; //REN=1允许串行接受状态,串口工作模式2
TMOD|= 0x20; //定时器工作方式2
//PCON|= 0x80; //波特率提高一倍
TH1 = 0xFd; // //baud*2 /* 波特率4800、数据位8、停止位1。效验位无 (11.0592M)
TL1 = 0xFd;
TR1 = 1; //开启定时器1
ES = 1; //开串口中断
EA = 1; // 开总中断
}
/*-----------------------------------------------
名称:串口通信
频率;11.0592
内容:主机程序,给从机发送信息
-----------------------------------------------*/
void Uart_send(uchar send_dat)
{
SBUF=send_dat;
while(!TI);
TI=0;
}
void Uart_scan()
{
// uchar temperl,temperh;
// temperl=temper/256;
// temperh=temper*256;
if(temp!=temper)
{
// SBUF =temper; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
// SBUF =temper/256;
// while(!TI); // 等特数据传送 (TI发送中断标志)
// TI = 0; // 清除数据传送标志
// SBUF =temper%256;
// while(!TI); // 等特数据传送 (TI发送中断标志)
// TI = 0;
Uart_send(temper/256);
Uart_send(temper%256);
temp=temper;
}
// DelayMs(1000);
// SBUF =temper%256;
// while(!TI);
// TI=0;
// P1=(temper)%100/10;
// DelayMs(1000);
}
/*------------------------------------------------
主函数
-----------------------------------------------*/
void main()
{
uchar *dat,*dat1;
dat="overload:";
dat1="Fixed:";
LCD_Init(); //液晶初始化
LCD_Clear(); //液晶清屏
UART_Init();
while(1)
{
alarm(); //报警函数扫描
keyscan(); //按键函数扫描
temper=read_temp();
//DelayMs(10000);
Uart_scan();
if(temper<0) //用于检测负温度值,去掉不影响程序
{
LCD_Write_String(0,0,'-');
temper=-temper;
}
else
LCD_Write_String(0,0,dat); //第一行显示overload
LCD_Write_Char(9,0,(temper>>4)%100/10+0x30); //显示温度十位,加0x30转成asscii码