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;
- }
复制代码
|