久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2171|回復: 3
收起左側

有沒大神看看這個基于pcf8591控制程序有問題沒,小弟萬分感謝

[復制鏈接]
ID:337248 發表于 2018-6-1 01:31 | 顯示全部樓層 |閱讀模式
#include <reg51.h>         //輸入0-5V電壓,根據ad值大小決定三個數碼管顯示,p1.0是控制電動機的。
#define uchar unsigned char
#define uint unsigned int
#define  PCF8591 0x90    //PCF8591 地址


sbit SCL=P2^1;         //串行時鐘輸入端
sbit SDA=P2^0;   //串行數據輸入端
sbit LSA=P2^2;//138譯碼器的3位 控制動態數碼管的  
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};      //數顯管字模


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



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

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


void respons()//應答   相當于一個智能的延時函數
{
        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;//先左移一位,再在最低位接受當前位
             SCL=0;
            delay();
  }
return k;

}

void write_byte(uchar date)       //寫一字節數據
{
       uchar i,temp;
     temp=date;
        for(i=0;i<8;i++)
   {
         temp=temp<<1; //左移一位 移出的一位在CY中
          SCL=0;                      //只有在scl=0時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)         //位選,選擇點亮的數碼管,
                {
                        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];//發送數據
                delay(); //間隔一段時間掃描       
                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();
  }                 

}



回復

使用道具 舉報

ID:111634 發表于 2018-6-1 07:18 | 顯示全部樓層
冗長程序一般是沒人看的!你自己可用keil運行查錯。
回復

使用道具 舉報

ID:337248 發表于 2018-6-1 12:44 | 顯示全部樓層
zl2168 發表于 2018-6-1 07:18
冗長程序一般是沒人看的!你自己可用keil運行查錯。

老哥:可以看下主程序嗎
回復

使用道具 舉報

ID:111634 發表于 2018-6-1 22:37 | 顯示全部樓層
sbwz 發表于 2018-6-1 12:44
老哥:可以看下主程序嗎

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

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 婷婷久久综合 | 久久一区二区av | 真人毛片 | 亚洲成人免费观看 | 色婷婷综合久久久中文字幕 | 久久久久久久一区二区 | 午夜在线免费观看视频 | 亚洲精品自在在线观看 | 国产成人福利在线观看 | 亚洲欧美综合 | 国产精品美女久久久久aⅴ国产馆 | 日本成人片在线观看 | 国户精品久久久久久久久久久不卡 | 国产精品视频播放 | 久在草 | 羞羞视频一区二区 | 日韩免费视频 | 欧美一区二区三区 | 亚洲精品字幕 | 成人性生交大免费 | 欧美一级网站 | 99久久精品国产一区二区三区 | 国产日韩欧美中文字幕 | 亚洲精品久久久 | 午夜免费av | 午夜免费精品视频 | h视频在线观看免费 | 国产在线播 | 黄色片a级 | 91在线一区 | 中文字幕亚洲欧美 | 久久精品国产久精国产 | 91在线观看免费 | 中文在线播放 | 97超级碰碰| 亚洲国产精品一区二区三区 | 国产免费自拍 | 久久久国产精品 | 在线a视频| 日本在线观看视频 | 亚洲一区二区三区四区在线观看 |