亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標(biāo)題:
單片機(jī)之間的串口通信程序問題分析
[打印本頁(yè)]
作者:
hangsy
時(shí)間:
2020-3-25 11:47
標(biāo)題:
單片機(jī)之間的串口通信程序問題分析
U1單片機(jī)負(fù)責(zé)接收串口信號(hào),把接收到的信號(hào)在1602上面顯示且1602同時(shí)顯示DS18B20的溫度,U2單片機(jī)負(fù)責(zé)發(fā)送信號(hào),U2單片機(jī)連接的有一個(gè)ADC8080,通過ADC8080轉(zhuǎn)換后的GP2D12的數(shù)據(jù)會(huì)顯示在四位數(shù)碼管的前三位,最后一位當(dāng)DP2D12檢測(cè)到的距離小于等于30時(shí)會(huì)為0,大于30時(shí)會(huì)為1;染然后把這個(gè)數(shù)據(jù)返回給U1,并在1602的第一行顯示0或1 ,且該顯示的數(shù)據(jù)會(huì)隨著U2傳送的數(shù)據(jù)而變化。
現(xiàn)在我遇到的問題是兩個(gè)單片機(jī)之間有信號(hào)的傳輸,但是無論U2傳輸?shù)男盘?hào)為1還是為0,在U1上的1602都顯示為0,不知道是傳輸?shù)膯栴}還是接受的問題,求大神解答一下!!!!非常感謝!!!!
一下是proteus仿真圖
此時(shí)1602應(yīng)顯示1,但是顯示的卻是0 ,而且在仿真時(shí)U1的3.1口和U2的3.0口一直在高低電平之間切換,而U1的3.0和U2的3.1一直處于低電平
GYW]8153K@)X$K@}88QU8KD.png
(87.62 KB, 下載次數(shù): 19)
下載附件
2020-3-25 11:45 上傳
單片機(jī)源程序如下:
/********************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初始化函數(shù),返回值為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寫字節(jié)函數(shù)
{
uint i,j;
for(j=0;j<8;j++)
{
DSPORT=0;
i++; //大于1us的延時(shí)
DSPORT=dat&0x01;
i=6;
while(i--); //68us
DSPORT=1;
dat>>=1;
}
}
uchar Ds18b20_read() //ds18b20讀字節(jié)函數(shù)
{
uint i,j;
uchar preserve,byte; //preserve用于保存每一位的數(shù)據(jù),byte用于返回?cái)?shù)據(jù)
for(j=8;j>0;j--)
{
DSPORT=0;
i++; //大于1us的延時(shí)
DSPORT=1;
i++;
i++;
preserve=DSPORT;
byte=(byte>>1)|(preserve<<7);
i=4;
while(i--);
}
return byte;
}
void Ds18b20_chanre() //ds18b20溫度轉(zhuǎn)換函數(shù)
{
Ds18b20_Init();
delay(1);
Ds18b20_write(0xcc);
Ds18b20_write(0x44);
}
void Ds18b20_temp() //使溫度傳感器開始讀取數(shù)據(jù)
{
Ds18b20_Init();
delay(1);
Ds18b20_write(0xcc);
Ds18b20_write(0xbe);
}
int Ds18b20_readtemp() //溫度讀取函數(shù)
{
// 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) //數(shù)據(jù)處理函數(shù)
{
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; //選擇發(fā)送命令
LCD1602_RW = 0; //選擇寫入
LCD1602_DATAPINS = com; //放入命令
Lcd1602_Delay1ms(1); //等待數(shù)據(jù)穩(wěn)定
LCD1602_E = 1; //寫入時(shí)序
Lcd1602_Delay1ms(5); //保持時(shí)間
LCD1602_E = 0;
}
void LcdWriteData(uchar dat) //寫入數(shù)據(jù)
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //選擇輸入數(shù)據(jù)
LCD1602_RW = 0; //選擇寫入
LCD1602_DATAPINS = dat; //寫入數(shù)據(jù)
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //寫入時(shí)序
Lcd1602_Delay1ms(5); //保持時(shí)間
LCD1602_E = 0;
}
void LcdInit() //LCD初始化子程序
{
LcdWriteCom(0x38); //開顯示
LcdWriteCom(0x0c); //開顯示不顯示光標(biāo)
LcdWriteCom(0x06); //寫一個(gè)指針加1
LcdWriteCom(0x01); //清屏
LcdWriteCom(0x80); //設(shè)置數(shù)據(jù)指針起點(diǎn)
}
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;//啟動(dòng)
delay(1);
while(!EOC); //eoc等于零的話,在這里等待直到eoc=1,結(jié)束循環(huán),向下執(zhí)行
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;
}
復(fù)制代碼
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1