标题:
单片机之间的串口通信程序问题分析
[打印本页]
作者:
hangsy
时间:
2020-3-25 11:47
标题:
单片机之间的串口通信程序问题分析
U1单片机负责接收串口信号,把接收到的信号在1602上面显示且1602同时显示DS18B20的温度,U2单片机负责发送信号,U2单片机连接的有一个ADC8080,通过ADC8080转换后的GP2D12的数据会显示在四位数码管的前三位,最后一位当DP2D12检测到的距离小于等于30时会为0,大于30时会为1;染然后把这个数据返回给U1,并在1602的第一行显示0或1 ,且该显示的数据会随着U2传送的数据而变化。
现在我遇到的问题是两个单片机之间有信号的传输,但是无论U2传输的信号为1还是为0,在U1上的1602都显示为0,不知道是传输的问题还是接受的问题,求大神解答一下!!!!非常感谢!!!!
一下是proteus仿真图
此时1602应显示1,但是显示的却是0 ,而且在仿真时U1的3.1口和U2的3.0口一直在高低电平之间切换,而U1的3.0和U2的3.1一直处于低电平
GYW]8153K@)X$K@}88QU8KD.png
(87.62 KB, 下载次数: 19)
下载附件
2020-3-25 11:45 上传
单片机源程序如下:
/********************U1的程序*******************************************/
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define LCD1602_DATAPINS P1
uint temp=0,TJ=0,J=2,ADC;
sbit DSPORT=P2^3; //温度(DS18B20)
sbit LCD1602_E=P2^2;
sbit LCD1602_RW=P2^1;
sbit LCD1602_RS=P2^0;
sbit EN1=P2^4;
uchar Display_1[]="beam ";
uchar Display_2[]="T's 11.11 W's 0";
void Init()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
SCON=0x50;
PCON=0x00;
TR1=1;
EA=1;
}
void delay(uint time)
{
uint i;
for(time;time>0;time--)
for(i=110;i>0;i--);
}
uchar Ds18b20_Init() //Ds18b20初始化函数,返回值为1表示存在,为0表示不存在
{
uint i=70;
DSPORT=0;
while(i--); //642us
DSPORT=1;
i=0;
while(DSPORT)
{
delay(1);
i++;
if(i>5)
return 0;
}
return 1;
}
void Ds18b20_write(uchar dat) //ds18b20写字节函数
{
uint i,j;
for(j=0;j<8;j++)
{
DSPORT=0;
i++; //大于1us的延时
DSPORT=dat&0x01;
i=6;
while(i--); //68us
DSPORT=1;
dat>>=1;
}
}
uchar Ds18b20_read() //ds18b20读字节函数
{
uint i,j;
uchar preserve,byte; //preserve用于保存每一位的数据,byte用于返回数据
for(j=8;j>0;j--)
{
DSPORT=0;
i++; //大于1us的延时
DSPORT=1;
i++;
i++;
preserve=DSPORT;
byte=(byte>>1)|(preserve<<7);
i=4;
while(i--);
}
return byte;
}
void Ds18b20_chanre() //ds18b20温度转换函数
{
Ds18b20_Init();
delay(1);
Ds18b20_write(0xcc);
Ds18b20_write(0x44);
}
void Ds18b20_temp() //使温度传感器开始读取数据
{
Ds18b20_Init();
delay(1);
Ds18b20_write(0xcc);
Ds18b20_write(0xbe);
}
int Ds18b20_readtemp() //温度读取函数
{
// int temp=0;
uchar temph,templ;
Ds18b20_chanre();
Ds18b20_temp();
templ=Ds18b20_read();
temph=Ds18b20_read();
temp=temph;
temp<<=8;
temp|=templ;
return temp;
}
void datapros(int temp) //数据处理函数
{
float tp;
if(temp<0)
{
temp=temp-1;
temp=~temp;
tp=temp;
temp=tp*0.0625*100+0.5;
}
else
{
tp=temp;
temp=tp*0.0625*100+0.5;
}
Display_2[4]=temp % 10000 / 1000+'0';
Display_2[5]=temp % 1000 / 100+'0';
Display_2[7]=temp % 100 / 10+'0';
Display_2[8]=temp % 10+'0';
TJ = temp%10000/10;
}
void Lcd1602_Delay1ms(uint c) //误差 0us
{
uchar b;
for(c; c>0; c--)
for(b=113;b>0;b--);
}
void LcdWriteCom(uchar com) //写入命令
{
LCD1602_E = 0; //使能
LCD1602_RS = 0; //选择发送命令
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = com; //放入命令
Lcd1602_Delay1ms(1); //等待数据稳定
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5); //保持时间
LCD1602_E = 0;
}
void LcdWriteData(uchar dat) //写入数据
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //选择输入数据
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = dat; //写入数据
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5); //保持时间
LCD1602_E = 0;
}
void LcdInit() //LCD初始化子程序
{
LcdWriteCom(0x38); //开显示
LcdWriteCom(0x0c); //开显示不显示光标
LcdWriteCom(0x06); //写一个指针加1
LcdWriteCom(0x01); //清屏
LcdWriteCom(0x80); //设置数据指针起点
}
void show()
{
uchar i;
LcdInit();
for(i=0;i<16;i++)
{
LcdWriteData(Display_1[i]);
}
LcdWriteCom(0x40+0x80);
for(i=0;i<16;i++)
{
LcdWriteData(Display_2[i]);
}
// while(1);
delay(5000);
}
void Fan()
{
if(TJ<250)
{
EN1=0;
Display_2[15]='0';
}
else
{
EN1=1;
Display_2[15]='1';
}
}
void main()
{
Init();
EN1=0;
while(1)
{
temp=Ds18b20_readtemp();
datapros(temp);
Fan();
while(RI==0);
RI=0;
ADC=SBUF;
if(ADC==0)
J=0;
else if(ADC==1)
J=1;
Display_1[8]=J+'0';
show();
}
}
//void Init()interrupt 4
//{
// while(RI==0);
// RI=0;
// ADC=SBUF;
// if(ADC==0)
// J=0;
// else if(ADC==1)
// J=1;
//}
/**********************************以下是U2的程序**************************************/
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
uint number[]={0,1,2,3,4,5,6,7,8,9,10};
uint num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0X00};
sbit wei_1=P2^0;
sbit wei_2=P2^1;
sbit wei_3=P2^2;
sbit wei_4=P2^3;
sbit EOC=P3^0;
sbit OE=P3^1;
sbit ST=P3^2;
sbit CLK=P3^6;
uint adc_out,a1,a2,a3,J,temp=2;
void Init()
{
// TMOD=0x20;
SCON=0X50;
TH1=0xfd;
TL1=0xfd;
PCON=0x00;
TR1=1;
}
void ADC_Init()
{
TMOD=0X20;
TH0=(65536-2)/256;
TL0=(65536-2)%256;
EA=1;
ET0=1;
TR0=1;
}
void delay(uint time)
{
uint i;
for(time;time>0;time--)
for(i=110;i>0;i--);
}
void judgement()
{
if((adc_out*49/25)>=94)
{
J=0;
temp=0;
}
else
{
J=1;
temp=1;
}
}
void adc_display()
{
P2=0xFF;
judgement();
a1=(adc_out*49/25)/100;
a2=(adc_out*49/25)/10%10;
a3=(adc_out*49/25)%100%10;
wei_1=0;
P0=num[number[a1]];
delay(1);
wei_1=1;
wei_2=0;
P0=num[number[a2]];
delay(1);
wei_2=1;
wei_3=0;
P0=num[number[a3]];
delay(1);
wei_3=1;
wei_4=0;
P0=num[number[J]];
delay(1);
wei_4=1;
}
void adc0808()
{
OE=0;
ST=0;
ST=1;//清0
ST=0;//启动
delay(1);
while(!EOC); //eoc等于零的话,在这里等待直到eoc=1,结束循环,向下执行
OE=1;
adc_out=P1;
OE=0;
// adc_display();
// return adc_out;
}
void main()
{
ADC_Init();
Init();
while(1)
{
adc0808();
adc_display();
SBUF=temp;
while(TI==0);
TI=0;
}
}
void T0_time()interrupt 1
{
TH0=(65536-2)/256;
TL0=(65536-2)%256;
CLK=~CLK;
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1