adc0808好像不工作了

2019-07-18 11:11发布

仿真的时候用的dht11和adc0808,在做实物的时候用的dht11,修改程序后发现adc工作不正常,求大神指点,附程序
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
helloY
1楼-- · 2019-07-18 13:49
#include<reg51.h>
#include <intrins.h>
#include <stdio.h>
#include <string.h>
#include <absacc.h>
#include <math.h>
#define uint unsigned int
#define uchar unsigned char
uchar DHT11[5],RTflag=0;
uchar  FLAG;   //超时标志位
uchar a;

static uchar DateString1[12]={"A12B34C56D89"}; //串口发送数据存储数组

unsigned char getdata;
long int  i,T=50,H=150;
float num=0;
void LcdDisplay(int temp);          //lcd显示
bit    flg=1;

#define uchar unsigned char
#define uint unsigned int
uchar str[7];

#define noACK 0             //用于判断是否结束通讯
#define ACK   1             //结束数据传输
                            //adr  command  r/w
#define STATUS_REG_W 0x06   //000   0011    0
#define STATUS_REG_R 0x07   //000   0011    1
#define MEASURE_TEMP 0x03   //000   0001    1
#define MEASURE_HUMI 0x05   //000   0010    1
#define RESET        0x1e   //000   1111    0

sbit dat=P2^1;
sbit RS=P2^5;
sbit RW=P2^0;
sbit EN=P2^7;
uchar table[5];
uint wd,sd;

sbit EOC=P3^2;
sbit CLK=P3^3;

sbit ST=P3^4;
sbit OE=P3^5;
sbit S= P2^6;


sbit K1= P2^2;
sbit K2= P2^3;
sbit K3= P2^4;
sbit K4= P3^7;

sbit P12=P3^6;
void KEY(void);
void usart_init(void)
{

        TL1=0xfd;TH1=0xfd;
        SCON=0x50;
        PCON &= 0xef;
        TR1=1;
//        IE=0x00;
}



void zhuanhuan(float a)//浮点数转换成字符串函数
{          
        memset(str,0,sizeof(str));
        sprintf (str,"%f", a);
}

void Delay_t(uint j)
{      uchar i;
            for(;j>0;j--)
          {        
                for(i=0;i<27;i++);       
          }
}
void  Delay_10us(void) //10us延时函数
{
        uchar i;
         i--;
         i--;
         i--;
         i--;
         i--;
         i--;
}

void delay(uint z)//1毫秒延时函数
{
   uint x,y;
   for(x=z;x>0;x--)
    for(y=110;y>0;y--);
}

void lcd_write_com(uchar com) //1602写指令
{
   RS=0;
   RW=0;
   EN=1;
   P0=com;
   delay(1);
   EN=0;

}
void lcd_init()        //1602初始化
{

  lcd_write_com(0x38);
  delay(1);
  lcd_write_com(0x08);
  delay(1);
  lcd_write_com(0x01);//1602清屏指令
  delay(1);
  lcd_write_com(0x06);
  delay(1);
  lcd_write_com(0x0C);
  delay(1);

}
void lcd_write_data(uchar date)//1602写数据
{
   RS=1;
   RW=0;
   EN=1;
   P0=date;
   delay(1);
   EN=0;
}
void write_str(uchar x,uchar y,uchar *s)//在任意地址写符号字母或数字
{
          if(y==0)                                                                                  
          lcd_write_com(0x80+x);
          else
          lcd_write_com(0xc0+x);
        while(*s)
        {
           lcd_write_data(*s);
           s++;
        }



}
void write_shu(uchar x,uchar y,uchar num)//数据显示函数
{
          
          uchar s,g;
          if(y==0)
          lcd_write_com(0x80+x);
          else
          lcd_write_com(0xc0+x);
          s=num/10;// 数据分离显示
          lcd_write_data(0x30+s);
          g=num%10;//数据分离显示
          lcd_write_data(0x30+g);





}

uchar  write_byte1() //读一个字节
{
           uchar i,comdata,temp1;
       for(i=0;i<8;i++)          
            {
                       FLAG=2;       
                   while((!dat)&&FLAG++);//判断数据位是0还是1
                        Delay_10us();
                    Delay_10us();
                        Delay_10us();
                          temp1=0;
             if(dat)temp1=1;        // 如果高电平高过预定0高电平值则数据位为 1
                    FLAG=2;
                 while((dat)&&FLAG++);//flag先与后加1 如果dat一直为1   uchar型变量 flag  溢出变为0  再自加1  
                     
                    if(FLAG==1)break;                //超时则跳出for循环       
                            
                     
       
                   comdata<<=1;//左移一位   高位在前  低位在后
                      comdata|=temp1;
             }
                 return (comdata);  
}
void DHT11_5() //读5个字节数据  两个字节为温度数据  两个字节为湿度数据 最后一个字节为校验
{
          uchar i,temp;
          //主机拉低18ms
       dat=0;
           Delay_t(180);
           dat=1;
         //总线由上拉电阻拉高 主机延时20us
           Delay_10us();
           Delay_10us();
           Delay_10us();
           Delay_10us();
         //主机设为输入 判断从机响应信号
           dat=1;
         //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行          
           if(!dat)                 //T !          
           {
                FLAG=2;           //超时标志位
                                 
                while((!dat)&&FLAG++);//判断从机是否发出 80us 的低电平响应信号是否结束
                        FLAG=2;
                       
                while((dat)&&FLAG++); //判断从机拉高80us是否结束
                        for(i=0;i<5;i++)//数据接收状态
                        {
                                DHT11[i]=write_byte1();       
                        }                 
                        dat=1;        //释放数据总线  为下一次读取做好准备
                 
                        temp=(DHT11[0]+DHT11[1]+DHT11[2]+DHT11[3]);
                        if(temp==DHT11[4])        //数据校验        
                        {                       
                                RTflag=1;                  
                        }
                        if(RTflag==1) //如果RTflag=1 说明读取到得数据正确
                   {                         
                                RTflag=0;
                        //        tm[0]=DATARHT[0]/10;
                        //        tm[1]=DATARHT[0]%10;
                        //        tm[2]=DATARHT[1]/10; //湿度
                          
                        //        tm[3]=DATARHT[2]/10;
                        //        tm[4]=DATARHT[2]%10;
                        //        tm[5]=DATARHT[3]/10; //温度       
                          
                                write_str(0,0,"H: ");//第一行显示湿度
                                write_shu(3,0,DHT11[0]);
                                write_str(5,0,"RH");
                                write_str(8,0,"T: ");//第二行为显示温度       
                            write_shu(11,0,DHT11[2]);
                            write_str(13,0,"^C");                               
                   }

                }

}



void main()
{  

//        value humi_val,temp_val;
//        unsigned char error,checksum;
          char L=0;
//        s_connectionreset();
  ST=0;
  OE=0;                                                  //定时器初始化
  ET0=1;
  EA=1;
  TMOD=0x22;
  TH0=216;
  TL0=216;
  TR0=1;
  K1=1;
  K2=1;
// K3=1;
// K4=1;       
  usart_init();



  P12=1;
  lcd_init();  //1602初始化
  delay(1000); //等待DHT11温湿度传感器数据稳定  开始激活DHT11

  while(1)//循环读取  并更新数据显示
  {
                        i=0;
                    while(DateString1[i]!='')
                        {
                                SBUF=DateString1[i];
                                while(!TI);
                                TI=0;
                                i++;
                        }
                        i=0;

                   delay(1000);//等待DHT11温湿度传感器数据稳定  开始激活DHT11
                   write_byte1();//读一个字节
                   DHT11_5(); //读数据
                  delay(1000); //延时等待

                        if(EOC==1)
                          {
                          L++;
                          if(L%2==0)
                           S=0;
                           else
                           S=1;
                           OE=1;
                           getdata=P1;
                           OE=0;
                          
                           i=getdata*196;
                       
                           i=i/5;
                       
                           ST=1;
                           ST=0;
                          }  
                          
                         if(S==1)
                        {         
                //        LcdWriteCom(0x80);                                                                    //数据写到LCD1602显示
                //        LcdWriteData('L');
                //        LcdWriteData('I');
                //        LcdWriteData('G');
                //        LcdWriteData('H');
                //        LcdWriteData(':');
                //        LcdWriteData(i/10000+0x30);
                        i=i%10000;
                //        LcdWriteData(i/1000+0x30);
                        DateString1[7]=i/1000+0x30;       
                        i=i%1000;
                //        LcdWriteData(i/100+0x30);
                        DateString1[8]=i/1000+0x30;
                                write_str(0,1,"L: ");//第一行显示湿度
                                write_shu(3,1,DateString1[7]);
                //                write_str(5,1,"RH");
                //                write_str(8,1,"T: ");//第二行为显示温度       
                            write_shu(4,1,DateString1[7]);
                            write_str(5,1,"Lx");                       

                        }
                        else if(S==0)
                        {                
                //        LcdWriteCom(0x80+0X0D-5);                                                                    //数据写到LCD1602显示
                //        LcdWriteData('C');
                //        LcdWriteData('O');
                //        LcdWriteData('2');
                //        LcdWriteData(' ');
                //        LcdWriteData(':');
                //        LcdWriteData(i/10000+0x30);       
                        i=i%10000;
                //        LcdWriteData(i/1000+0x30);
                        DateString1[10]=i/1000+0x30;
                        i=i%1000;
                //        LcdWriteData(i/100+0x30);
                        DateString1[11]=i/1000+0x30;
                        write_str(8,1,"CO2: ");//第一行显示湿度
                        write_shu(12,1,DateString1[10]);
        //                write_str(5,1,"RH");
        //                write_str(8,1,"T: ");//第二行为显示温度       
                    write_shu(13,1,DateString1[11]);
                    write_str(14,1,"%");               
                        }
}
}
wangjun19820
2楼-- · 2019-07-18 18:26
 精彩回答 2  元偷偷看……
wangjun19820
3楼-- · 2019-07-18 23:58
在PROTUES里使用ADC0809替代ADC0808,两者使用上没有多大区别。
武力戡乱
4楼-- · 2019-07-19 02:12
问题解决了吗?
wfudyz
5楼-- · 2019-07-19 02:51
0808不能工作。好好看看CLK信号,是1MHZ吗?!
wfudyz
6楼-- · 2019-07-19 08:40
哥们,你这程序里面,好像也没有0808的函数啊?!它怎么工作?!

一周热门 更多>