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一直處于低電平
單片機源程序如下:
- /********************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;
- }
復制代碼
|