標(biāo)題: 有沒大神看看這個(gè)基于pcf8591控制程序有問題沒,小弟萬分感謝 [打印本頁]

作者: sbwz    時(shí)間: 2018-6-1 01:31
標(biāo)題: 有沒大神看看這個(gè)基于pcf8591控制程序有問題沒,小弟萬分感謝
#include <reg51.h>         //輸入0-5V電壓,根據(jù)ad值大小決定三個(gè)數(shù)碼管顯示,p1.0是控制電動(dòng)機(jī)的。
#define uchar unsigned char
#define uint unsigned int
#define  PCF8591 0x90    //PCF8591 地址


sbit SCL=P2^1;         //串行時(shí)鐘輸入端
sbit SDA=P2^0;   //串行數(shù)據(jù)輸入端
sbit LSA=P2^2;//138譯碼器的3位 控制動(dòng)態(tài)數(shù)碼管的  
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit led=P1^0;

char disp[3];
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};      //數(shù)顯管字模


void delay()   //延時(shí)4-5個(gè)微秒
{;;}



void start()//開始信號
{
SDA=1;
    delay();
  SCL=1;
    delay();
  SDA=0;
    delay();
}

void stop()      //停止信號
{
SDA=0;
    delay();
  SCL=1;
    delay();
  SDA=1;
    delay();
}


void respons()//應(yīng)答   相當(dāng)于一個(gè)智能的延時(shí)函數(shù)
{
        uchar i;
  SCL=1;
    delay();
  while((SDA==1)&&(i<250))
           i++;
      SCL=0;
    delay();
}

void init()      //初始化
{
  SDA=1;
    delay();
  SCL=1;
    delay();   
}

uchar read_byte()
{
   uchar i,k;
        SCL=0;
    delay();
  SDA=1;
    delay();
  for(i=0;i<8;i++)
   {
         SCL=1;
            delay();
          k=(k<<1)|SDA;//先左移一位,再在最低位接受當(dāng)前位
             SCL=0;
            delay();
  }
return k;

}

void write_byte(uchar date)       //寫一字節(jié)數(shù)據(jù)
{
       uchar i,temp;
     temp=date;
        for(i=0;i<8;i++)
   {
         temp=temp<<1; //左移一位 移出的一位在CY中
          SCL=0;                      //只有在scl=0時(shí)sda能變化值
                delay();
          SDA=CY;
           delay();
          SCL=1;
            delay();            
  }   
  SCL=0;
    delay();
  SDA=1;
    delay();
}


uchar read_add(uchar control)
{
  uchar date;
       start();
  write_byte(PCF8591);
      respons();
        write_byte(control);
      respons();
        start();
  write_byte(PCF8591+1);       //把最后一位變成1,讀
     respons();
        date=read_byte();
stop();
   return date;

}


void DigDisplay()
{
        char i;
        for(i=0;i<3;i++)
        {
                switch(i)         //位選,選擇點(diǎn)亮的數(shù)碼管,
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0; break;//顯示第0位
                        case(1):
                                LSA=1;LSB=0;LSC=0; break;//顯示第1位
                        case(2):
                                LSA=0;LSB=1;LSC=0; break;//顯示第2位       
                }
                P1=disp[i];//發(fā)送數(shù)據(jù)
                delay(); //間隔一段時(shí)間掃描       
                P1=0x00;//消隱
        }               
}



void main()
{      
  uchar temp0,temp1,temp2,i;
     init();
   while(1)
  {            for(i=0;i<5;i++)
         {
                     temp0=read_add(0x00);           //通道0
                 }
                 delay();
                 for(i=0;i<5;i++)
                 {
                     temp1=read_add(0x01);           //通道1
                 }
                 delay();
                 for(i=0;i<5;i++)
                 {
                     temp2=read_add(0x10);           //通道2
                 }
                 if(temp0>=22)
                 {
                     led=1;
                         if(temp1>=100&&temp1<=150)
                         {
                             disp[0]=table[0];
                                 disp[1]=table[0];
                                 disp[2]=table[0];
                         }
                         else if(150<temp1&&temp1<160)
                              {
                                  disp[0]=table[temp1-150];
                                      disp[1]=table[0];
                                      disp[2]=table[1];
                              }
                              else if(temp1<100&&temp2>100)
                                   {
                                       disp[0]=table[9];
                                           disp[1]=table[1];
                                           disp[2]=table[0];
                                   }
                                   else         if(temp1>=160)
                                   {
                                       disp[0]=table[9];
                                           disp[1]=table[0];
                                           disp[2]=table[1];
                                   }
                                           else
                                           {
                                               disp[0]=table[2];
                                           disp[1]=table[2];
                                           disp[2]=table[2];
                                           }
                 }
                 else
                 {
                     led=0;
                         disp[0]=table[0];
                         disp[1]=table[0];
                     disp[2]=table[0];
                 }
                 DigDisplay();
  }                 

}




作者: zl2168    時(shí)間: 2018-6-1 07:18
冗長程序一般是沒人看的!你自己可用keil運(yùn)行查錯(cuò)。
作者: sbwz    時(shí)間: 2018-6-1 12:44
zl2168 發(fā)表于 2018-6-1 07:18
冗長程序一般是沒人看的!你自己可用keil運(yùn)行查錯(cuò)。

老哥:可以看下主程序嗎
作者: zl2168    時(shí)間: 2018-6-1 22:37
sbwz 發(fā)表于 2018-6-1 12:44
老哥:可以看下主程序嗎

可介紹你一個(gè)PCF8591AD案例,自己去理解體會(huì),對照查錯(cuò)吧!
實(shí)例85  PCF8591 I2C串行A-D(1602顯示)

Proteus仿真一下,確認(rèn)有效。
實(shí)例85 PCF8591 I2C串行A-D.rar (57.96 KB, 下載次數(shù): 5)
以上摘自張志良編著《80C51單片機(jī)仿真設(shè)計(jì)實(shí)例教程——基于Keil CProteus》清華大學(xué)出版社ISBN 978-7-302-41682-1書中電路和程序設(shè)計(jì)有詳細(xì)說明,程序語句條條有注解。





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1