欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機之間的串口通信程序問題分析
[打印本頁]
作者:
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.raoushi.com/bbs/)
Powered by Discuz! X3.1