|
超聲波檢測停車位信息,傳給另一個單片機顯示信息,為什么仿真不出來,代碼有問題嗎?主機代碼
- #include <REGX52.H>
- #include <stdio.h>
- #include<intrins.h>
- sbit csb=P1^0; // 第一路 Trig
- sbit csbint=P1^1; // 第一路 Echo
- sbit csb1=P1^3; // 第二路 Trig
- sbit csbint1=P1^2; // 第二路 Echo
- sbit csb2=P1^5; // 第三路 Trig
- sbit csbint2=P1^4; // 第三路 Echo
- sbit csb3=P1^7; // 第四路 Trig
- sbit csbint3=P1^6; // 第四路 Echo
- sbit RS = P0^7; //定義端口
- sbit RW = P0^6;
- sbit EN = P0^5;
- #define RS_CLR RS=0
- #define RS_SET RS=1
- #define RW_CLR RW=0
- #define RW_SET RW=1
- #define EN_CLR EN=0
- #define EN_SET EN=1
-
- unsigned char cc[]={' ',' ',' ',' ','T','o','t','a','l',':','4',' ',' ',' ',' ',' '};
- unsigned char dd[]={'F','r','e','e',':',' ',' ',' ',' ','B','u','s','y',':',' ',' '};
-
- unsigned int a1,a2,a3,a4,s,j,s1,s2,s3,s4,kw;
- float csbc;
- void DelayUs2x(unsigned char t)
- {
- while(--t);
- }
- void DelayMs(unsigned char t)
- {
- while(t--) //大致延時1mS
- {
- DelayUs2x(245);
- DelayUs2x(245);
- }
- }
- void MasterUART_init(void)
- {
- SCON = 0x50;
- TMOD = 0x20;
- TH1 = 0xFD;
- TL1 = 0xFD;
- TR1 = 1;
- }
- void Send(unsigned char dat)
- {
- SBUF=dat;
- while(TI==0)
- ; //等待
- TI=0;
- }
- void write_com(unsigned char com) //寫命令
- {
- RS_CLR;
- RW_CLR;
- P2=com;
- DelayMs(2);
- EN_SET;
- DelayMs(2);
- EN_CLR;
- }
- void write_data(unsigned char date) //寫一個字符
- {
- RS_SET;
- RW_CLR;
- P2=date;
- DelayMs(2);
- EN_SET;
- DelayMs(2);
- EN_CLR;
- }
- void init() //初始化
- {
- write_com(0x38);
- write_com(0x0c);
- write_com(0x06);
- write_com(0x01);
- }
- /*------------------------------------------------
- 寫入字符串函數
- ------------------------------------------------*/
- void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
- {
- if (y == 0)
- {
- write_com(0x80 + x);
- }
- else
- {
- write_com(0xC0 + x);
- }
- while (*s)
- {
- write_data( *s);
- s ++;
- }
- }
- main()
- {
- TH0=0;
- TL0=0;
- TMOD=0X11; //T1,T0為16位定時器
- EA=0;
- init();
- while(1)
- {
-
- ///////////////////////////////////////////
- // 第一路 測距模塊 //
- ///////////////////////////////////////////
- csb=0; //啟動一次模塊
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- csb=1;
- ET0=1; //啟動計數器T0,用以計時
- TR0=1;
- EA=1;
- j=150; //延時
- while(j--)
- {
- }
- csbint=1;
- j=0;
- while(csbint) //判斷接收回路是否收到超聲波的回波
- {
- j++;
- if(j>=2500) //如果達到一定時間沒有收到回波,則將csbint置零,退出接收回波處理程序
- csbint=0;
- }
- TR0=0;
- s1=TH0*256+TL0; //讀取時間數據
- TH0=0;
- TL0=0;
- csbc=0.034;
- csbc=csbc/2;
- s1=s1*csbc-8;
- ///////////////////////////////////////////
- // 第二路 測距模塊 //
- ///////////////////////////////////////////
- csb1=0; //啟動一次模塊
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- csb1=1;
- ET0=1; //啟動計數器T0,用以計時
- TR0=1;
- EA=1;
- j=150; //延時
- while(j--)
- {
- }
- csbint1=1;
- j=0;
- while(csbint1) //判斷接收回路是否收到超聲波的回波
- {
- j++;
- if(j>=2500) //如果達到一定時間沒有收到回波,則將csbint置零,退出接收回波處理程序
- csbint1=0;
- }
- TR0=0;
- s2=TH0*256+TL0; //讀取時間數據
- TH0=0;
- TL0=0;
- csbc=0.034;
- csbc=csbc/2;
- s2=s2*csbc-8;
- ///////////////////////////////////////////
- // 第三路 測距模塊 //
- ///////////////////////////////////////////
- csb2=0; //啟動一次模塊
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- csb2=1;
- ET0=1; //啟動計數器T0,用以計時
- TR0=1;
- EA=1;
- j=150; //延時
- while(j--)
- {
- }
- csbint2=1;
- j=0;
- while(csbint2) //判斷接收回路是否收到超聲波的回波
- {
- j++;
- if(j>=2500) //如果達到一定時間沒有收到回波,則將csbint置零,退出接收回波處理程序
- csbint2=0;
- }
- TR0=0;
- s3=TH0*256+TL0; //讀取時間數據
- TH0=0;
- TL0=0;
- csbc=0.034;
- csbc=csbc/2;
- s3=s3*csbc-8;
- ///////////////////////////////////////////
- // 第四路 測距模塊 //
- ///////////////////////////////////////////
- csb3=0; //啟動一次模塊
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- csb3=1;
- ET0=1; //啟動計數器T0,用以計時
- TR0=1;
- EA=1;
- j=150; //延時
- while(j--)
- {
- }
- csbint3=1;
- j=0;
- while(csbint3) //判斷接收回路是否收到超聲波的回波
- {
- j++;
- if(j>=2500) //如果達到一定時間沒有收到回波,則將csbint置零,退出接收回波處理程序
- csbint2=0;
- }
- TR0=0;
- s4=TH0*256+TL0; //讀取時間數據
- TH0=0;
- TL0=0;
- csbc=0.034;
- csbc=csbc/2;
- s4=s4*csbc-8;
- if(s1>100) //測量值小于下限
- {
- a1=0;
- }
- else
- {
- a1=1;
- }
- if(s2>100) //測量值小于下限
- {
- a2=0;
- }
- else
- {
- a2=1;
- }
- if(s3>100) //測量值小于下限
- {
- a3=0;
- }
- else
- {
- a3=1;
- }
- if(s4>100) //測量值小于下限
- {
- a4=0;
- }
- else
- {
- a4=1;
- }
- kw=a1+a2+a3+a4;
- dd[14]=kw+'0';
- dd[5]=4-kw+'0';
- LCD_Write_String(0,0,cc);
- LCD_Write_String(0,1,dd);
- }
- MasterUART_init();
- while(1)
- {
- Send(kw); //發送數據i
- DelayMs(2);
- }
- }
復制代碼 從機代碼
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
- void delay_ms(uint t)
- {
- uint m,n;
- for (m=0;m<t;m++)
- for (n=0;n<1000;n++);
- }
- void SlaveUART_init(void)
- {
- SCON = 0x50;
- TMOD = 0x20;
- TH1 = 0xFD;
- TL1 = 0xFD;
- TR1 = 1;
- }
- unsigned char Receive(void)
- {
- unsigned char dat;
- while(RI==0)
- ; //等待,直至接收完畢(RI=1)
- RI=0; //為了接收下一幀數據,需將RI清0
- dat=SBUF; //將接收緩沖器中的數據存于dat
- return dat;
- }
- main()
- {
- unsigned char tmp;
- SlaveUART_init();
- while(1);
- {
- tmp=Receive();
- P0=DSY_CODE[tmp];
- }
- }
復制代碼 電路圖
|
|