找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2200|回复: 4
打印 上一主题 下一主题
收起左侧

pcf8591电压表,帮忙改一下,谢谢

[复制链接]
跳转到指定楼层
楼主
本帖最后由 123gkhkhkhkhgg 于 2017-12-29 15:08 编辑

#include<reg52.h>
#include<intrins.h>
#define AddWr 0x90
#define AddRd 0x91
#define uchar unsigned char
#define uint unsigned int

sbit Scl=P1^1;
sbit Sda=P1^2;

bit ADFlag;
uchar code Datatab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  //0 1 2 3 4 5 6 7 8 9
data uchar Display[8];
uchar code wei[]={0xf8,0xf9,0xfa,0xfb,0xfc,0xfd};

void mDelay(uint j)
{
        unsigned int x,i;
        for(x=j;x>0;x--)
        {
                for(i=0;i<125;i++)
                {;}
         }
}

void Init_Timer1(void)
{
        TMOD|=0x10;
         TH1=0Xff;
         TH0=0x00;
         EA=1;
         ET1=1;
         TR1=1;
}

void Start(void)
{
         Sda=1;
         _nop_();
         Scl=1;
         _nop_();
         Sda=0;
          _nop_();
          Scl=0;
}

void Stop(void)
{
         Sda=0;
         _nop_();
         Scl=1;
         _nop_();
         Sda=1;
         _nop_();
         Scl=0;
}

void Ack(void)
{
         Sda=0;
         _nop_();
         Scl=1;
         _nop_();
         Scl=0;
         _nop_();
}

void NoAck(void)
{
         Sda=1;
         _nop_();
         Scl=1;
         _nop_();
         Scl=0;
         _nop_();
}

void Send(unsigned char Data)
{
         unsigned char BitCounter=8;
         unsigned char temp;
         do
         {
                  temp=Data;
                  Scl=0;
            _nop_();
                if((temp&0x80)==0x80)
                Sda=1;
                else
                Sda=0;
                Scl=1;
                temp=Data<<1;
                Data=temp;
                BitCounter--;
         }
         while(BitCounter);
                 Scl=0;
}

unsigned char Read(void)
{
         unsigned char temp=0;
         unsigned char temp1=0;
         unsigned char BitCounter=8;
         Sda=1;
         do
         {
                  Scl=0;
                   _nop_();
                   Scl=1;
            _nop_();
                if(Sda)
                         temp=temp|0x01;
                 else
                         temp=temp&0xfe;
                 if(BitCounter-1)
                 {
                          temp1=temp1<<1;
                          temp=temp1;
                 }
                BitCounter--;
         }
         while(BitCounter);
         return(temp);
}

void DAC(unsigned char Data)
{
         Start();
         Send(AddWr);
         Ack();
         Send(0x40);
         Ack();
         Send(Data);
         Ack();
         Stop();
}

unsigned char ReadADC()
{
          unsigned char Data;
          Start();
          Send(AddWr);
          Ack();
          Send(0x40);                   //选择通道
          Ack();
          Start();
          Send(AddRd);
          Ack();
          Data=Read();
          Scl=0;
          NoAck();
          Stop();
          return Data;
}

void main()
{
         unsigned char num;
         uint ADtemp;
        int count;
         Init_Timer1();
         while(1)
         {
                  DAC(num);
                  num++;
                  mDelay(20);
                  if(ADFlag)
                  {
                           ADFlag=0;
                           ADtemp=ReadADC()*2;                                           //0-512对应0-5v

                    Display[0]=Datatab[ADtemp/100]|0x80;           //整数部分和小数点(0x80)
                           Display[1]=Datatab[(ADtemp/10)%10];                   //小数点后第一位
                        Display[2]=Datatab[ADtemp%10];                       //小数点后第二位
                        Display[3]=0x3e;                                                       //v

                        for(count=0;count<4;count++)
                        {
                                P0=Display[count];                                 //数码管显示程序
                                 P2=wei[count];
                         }
                  }
         }
}

void Time1_isr(void) interrupt 3 using 1
{
         static unsigned int j=0;
         TH1=0xfb;
         TL1=0x00;
         j++;
         if(j==300)
         {
                  j=0;
                  ADFlag=1;        //采样
         }         
}

捕获.PNG (98.97 KB, 下载次数: 54)

捕获.PNG

程序.zip

32.86 KB, 下载次数: 31

仿真.zip

45.76 KB, 下载次数: 22

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:205697 发表于 2017-12-29 15:07 | 只看该作者
运行不出来谁可以帮忙改一下
回复

使用道具 举报

板凳
ID:258566 发表于 2017-12-29 19:23 | 只看该作者
参考程序, 109-PCF8591 4路AD数码管显示.zip (34.22 KB, 下载次数: 70)



obj.zip (21.19 KB, 下载次数: 41) for proteus8

回复

使用道具 举报

地板
ID:205697 发表于 2018-1-5 11:00 | 只看该作者

谢谢啦
回复

使用道具 举报

5#
ID:859799 发表于 2020-12-16 20:24 | 只看该作者
你好,我已经仿真成功了,也在开发板上实验成功了,但是我仔细看了一下,没明白代码到底是哪个文件里的哪一个
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表