如图,仿真的时候是这样的,但是实物用开发板拼好之后是这样的大佬们知道怎么改吗
单片机源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- typedef unsigned int u16; //对系统默认数据类型进行重定义
- typedef unsigned char u8;
- sbit RS=P2^0;
- sbit RW=P2^1;
- sbit EN=P2^2;
- sbit DATO=P1^3;
- sbit DATI=P1^2;
- sbit CS=P1^0;
- sbit Clk=P1^1;
- sbit DHT11_DQ=P2^3;
- sbit IN1_A=P3^0;
- sbit IN2_B=P3^1;
- sbit IN3_C=P3^2;
- sbit IN4_D=P3^3;
- sbit motor=P3^7;
- uchar code table[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};
- unsigned char datas0[]={0,0,0,0}; //缓冲数据
- unsigned char datas1[]={0,0,0,0}; //缓冲数据
- uint ch0=0,ch1=0;
- int vcc;
- uchar dat=0;
- void send_pulse_z(u8 step)
- {
- u8 temp=step;
- switch(temp)//8个节拍控制:A->AB->B->BC->C->CD->D->DA
- {
- case 0: IN1_A=1;IN2_B=0;IN3_C=0;IN4_D=0;break;
- case 1: IN1_A=1;IN2_B=1;IN3_C=0;IN4_D=0;break;
- case 2: IN1_A=0;IN2_B=1;IN3_C=0;IN4_D=0;break;
- case 3: IN1_A=0;IN2_B=1;IN3_C=1;IN4_D=0;break;
- case 4: IN1_A=0;IN2_B=0;IN3_C=1;IN4_D=0;break;
- case 5: IN1_A=0;IN2_B=0;IN3_C=1;IN4_D=1;break;
- case 6: IN1_A=0;IN2_B=0;IN3_C=0;IN4_D=1;break;
- case 7: IN1_A=1;IN2_B=0;IN3_C=0;IN4_D=1;break;
- default: IN1_A=0;IN2_B=0;IN3_C=0;IN4_D=0;break;//停止相序
- }
- }
- void send_pulse_f(u8 step)
- {
- u8 temp=step;
- switch(temp)//8个节拍控制:A->AB->B->BC->C->CD->D->DA
- {
- case 7: IN1_A=1;IN2_B=0;IN3_C=0;IN4_D=0;break;
- case 6: IN1_A=1;IN2_B=1;IN3_C=0;IN4_D=0;break;
- case 5: IN1_A=0;IN2_B=1;IN3_C=0;IN4_D=0;break;
- case 4: IN1_A=0;IN2_B=1;IN3_C=1;IN4_D=0;break;
- case 3: IN1_A=0;IN2_B=0;IN3_C=1;IN4_D=0;break;
- case 2: IN1_A=0;IN2_B=0;IN3_C=1;IN4_D=1;break;
- case 1: IN1_A=0;IN2_B=0;IN3_C=0;IN4_D=1;break;
- case 0: IN1_A=1;IN2_B=0;IN3_C=0;IN4_D=1;break;
- default: IN1_A=0;IN2_B=0;IN3_C=0;IN4_D=0;break;//停止相序
- }
- }
- void delay_10us(u16 ten_us)
- {
- while(ten_us--);
- }
- void delay_ms(u16 ms)
- {
- u16 i,j;
- for(i=ms;i>0;i--)
- for(j=110;j>0;j--);
- }
- //复位DHT11
- void DHT11_Rst(void)
- {
- DHT11_DQ=1;
- delay_10us(1);
- DHT11_DQ=0;
- delay_ms(25);
- DHT11_DQ=1;
- delay_10us(3);
- }
- u8 DHT11_Check(void)
- {
- u8 retry=0;
-
- while (!DHT11_DQ&&retry<100)//判断从机发出 80us 的低电平响应信号是否结束
- {
- retry++;
- _nop_();
- };
- if(retry>=100)return 1;
- else retry=0;
- while (DHT11_DQ&&retry<100)//判断从机发出 80us 的高电平是否结束如结束则主机进入数据接收状态
- {
- retry++;
- _nop_();
- };
- if(retry>=100)return 1;
- return 0;
- }
- //从DHT11读取一个字节
- //返回值:读到的数据
- u8 DHT11_Read_Byte(void)
- {
- u8 i,temp;
- u8 data_byte=0;
- u8 retry=0;
- for(i=0;i<8;i++)//接收8bit的数据
- {
- // while(!DHT11_DQ);//等待50us的低电平开始信号结束
- while (!DHT11_DQ&&retry<50)//等待50us的低电平开始信号结束
- {
- retry++;
- _nop_();
- };
- retry=0;
- delay_10us(3);//等待40us
- temp=0;//时间为26us-28us表示接收的为数据'0'
- if(DHT11_DQ==1)
- temp=1; //如果26us-28us之后还为高电平则表示接收的数据为'1'
- // while(DHT11_DQ);//等待数据信号高电平'0'为26us-28us'1'为70us
- while (DHT11_DQ&&retry<100)//等待数据信号高电平'0'为26us-28us'1'为70us
- {
- retry++;
- _nop_();
- };
- data_byte<<=1;//接收的数据为高位在前右移
- data_byte|=temp;
- }
- return data_byte;
- }
- //从DHT11读取一次数据
- //temp:温度值(范围:0~50°)
- //humi:湿度值(范围:20%~90%)
- //返回值:0,正常;1,读取失败
- u8 DHT11_Read_Data(u8 *temp,u8 *humi)
- {
- u8 buf[5];
- u8 i;
- DHT11_Rst();
- if(DHT11_Check()==0)
- {
- for(i=0;i<5;i++)//读取40位数据
- {
- buf[i]=DHT11_Read_Byte();
- }
- if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
- {
- *humi=buf[0];
- *temp=buf[2];
- }
-
- }else return 1;
- return 0;
- }
- u8 DHT11_Init(void)
- {
- DHT11_DQ=1;
- DHT11_Rst();
- return DHT11_Check();
- }
- void delay1ms(uint ms)
- {
- uint i,j;
- for(i=0;i<ms;i++)
- for(j=0;j<100;j++);
- }
- void wr_com(uchar com)
- {
- delay1ms(1);
- RS=0;
- RW=0;
- EN=0;
- P0=com;
- delay1ms(1);
- EN=1;
- delay1ms(1);
- EN=0;
- }
- void wr_dat(uchar dat)
- {
- delay1ms(1);;
- RS=1;
- RW=0;
- EN=0;
- P0=dat;
- delay1ms(1);
- EN=1;
- delay1ms(1);
- EN=0;
- }
- void wr_new()
- {
- uchar i;
- wr_com(0x40);
- for(i=0;i<8;i++)
- {
- wr_dat(table[ i]);
- }
- }
- void lcd_init()
- {
- delay1ms(15);
- wr_com(0x38);delay1ms(5);
- wr_com(0x08);delay1ms(5);
- wr_com(0x01);delay1ms(5);
- wr_com(0x06);delay1ms(5);
- wr_com(0x0c);delay1ms(5);
- wr_new();
- wr_com(0x80);
- wr_dat('A');
- wr_com(0x89);
- wr_dat('B');
- wr_com(0xc0);
- wr_dat('C');
- wr_com(0xcd);
- wr_dat('%');
- }
- unsigned char adc0832(unsigned char CH)
- {
- unsigned char i,test,adval;
- adval = 0x00;
- test = 0x00;
- Clk = 0; //初始化
- DATI = 1;
- _nop_();
- CS = 0;
- _nop_();
- Clk = 1;
- _nop_();
-
-
- if ( CH == 0x00 ) //通道选择
- {
- Clk = 0;
- DATI = 1; //通道0的第一位
- _nop_();
- Clk = 1;
- _nop_();
- Clk = 0;
- DATI = 0; //通道0的第二位
- _nop_();
- Clk = 1;
- _nop_();
- }
- else
- {
- Clk = 0;
- DATI = 1; //通道1的第一位
- _nop_();
- Clk = 1;
- _nop_();
- Clk = 0;
- DATI = 1; //通道1的第二位
- _nop_();
- Clk = 1;
- _nop_();
- }
-
- Clk = 0;
- DATI = 1;
- for( i = 0;i < 8;i++ ) //读取前8位的值
- {
- _nop_();
- adval <<= 1;
- Clk = 1;
- _nop_();
- Clk = 0;
- if (DATO)
- adval |= 0x01;
- else
- adval |= 0x00;
- }
- for (i = 0; i < 8; i++) //读取后8位的值
- {
- test >>= 1;
- if (DATO)
- test |= 0x80;
- else
- test |= 0x00;
- _nop_();
- Clk = 1;
- _nop_();
- Clk = 0;
- }
- if (adval == test) //比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉
- dat = test;
- nop_();
- CS = 1; //释放ADC0832
- DATO = 1;
- Clk = 1;
- return dat;
- }
- u8 smog=0;
- u8 steps;
- void main(void)
- {
- u8 temp=0,humi=0;
- lcd_init();
- wr_com(0x01);
- while(DHT11_Init());
- motor=1;
- while(1)
- {
- DHT11_Read_Data(&temp,&humi);
- ch0=adc0832(0)*1.97;
- smog=ch0/5;
- //数据处理
- datas0[2]=smog/100;
- datas0[1]=smog/10%10; //小数点后两位
- datas0[0]=smog%10; //小数点后两位
-
- ch1=adc0832(1)*1.97;
-
- //数据处理
- datas1[3]=ch1/1000; //个位
- datas1[2]=ch1%1000/100; //小数点后一位
- datas1[1]=ch1%100/10; //小数点后两位
- datas1[0]=ch1%10; //小数点后两位
- vcc=datas1[3]*1000+datas1[2]*100+datas1[1]*10+datas1[0];
-
- wr_com(0x80);
- wr_dat('s');
- wr_dat('m');
- wr_dat('o');
- wr_dat('g');
- wr_dat(':');
- wr_dat(datas0[2]+0x30);
- wr_dat(datas0[1]+0x30);
- wr_dat(datas0[0]+0x30);
- wr_dat('%');
- wr_com(0x8b);
- wr_dat(datas1[2]+0x30);
- wr_dat('.');
- wr_dat(datas1[1]+0x30);
- wr_dat(datas1[0]+0x30);
- wr_dat('V');
- wr_com(0x80+0x40);
- wr_dat('t');
- wr_dat(':');
- wr_dat(temp/10+0x30);
- wr_dat(temp%10+0x30);
- wr_dat('^');
- wr_dat('C');
- wr_com(0x88+0x40);
- wr_dat('h');
- wr_dat(':');
- wr_dat(humi/10+0x30);
- wr_dat(humi%10+0x30);
- wr_dat('%');
- if(vcc>177){//大于1.77V
- send_pulse_f(steps);
- steps++;
- if(steps>=8){
- steps=0;
- }
- }
- if(vcc<120){
- send_pulse_z(steps);
- steps++;
- if(steps>=8){
- steps=0;
- }
- }
- if(temp>40 || humi>80){
- motor=0;
- }
- else motor=1;
- delay_ms(30);
- }
- }
复制代码
|