单片机学习小组
直播中

吴湛

9年用户 899经验值
擅长:可编程逻辑
私信 关注

基于单片机CT107D的模数转换器PCF8591有哪些基本应用呢

基于单片机CT107D的模数转换器PCF8591有哪些基本应用呢?

回帖(1)

陈思伊

2022-2-25 09:57:22
#include
#include"IIC.h"

***it S4 = P3^3;               //定义独立按键
unsigned char dat_Rd1 = 0;          //存放Rd1数据
unsigned char dat_Rb2 = 0;          //存放Rb2数据
unsigned char state = 0;          //标志位
unsigned char code SEG_code[18] =
        {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
         0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,
         0xbf,0x7f};                  //定义共阳数码管段码内容:0~F,—,.

void Select_HC138(unsigned char n)
{
        switch(n)
        {
                case 5:
                        P2 = (P2 & 0x1f) | 0xa0;
                        break;
                case 6:
                        P2 = (P2 & 0x1f) | 0xc0;
                        break;
                case 7:
                        P2 = (P2 & 0x1f) | 0xe0;
                        break;
        }
}

void Delay_tube(unsigned char t)   //数码管延时函数
{
        while(t--);
}

void Show_tube(unsigned char position,unsigned char value)
{
        Select_HC138(7);
        P0 = 0xff;
        Select_HC138(6);
        P0 = 0x01 << position;
        Select_HC138(7);
        P0 = value;
}

void Show_all()
{
        Select_HC138(7);
        P0 = 0xff;
        Select_HC138(6);
        P0 = 0xff;
}

void Display_tube(unsigned char channel,unsigned char dat)
{
        Show_tube(0,SEG_code[16]);
        Delay_tube(100);
        Show_tube(1,SEG_code[channel]);              //显示通道
        Delay_tube(100);
        Show_tube(2,SEG_code[16]);
        Delay_tube(100);

        Show_tube(5,SEG_code[dat/100]);       //显示电压的百位
        Delay_tube(100);
        Show_tube(6,SEG_code[(dat/10)%10]);          //显示电压的十位
        Delay_tube(100);
        Show_tube(7,SEG_code[dat%10]);        //显示电压的个位
        Delay_tube(100);

        Show_all();
}

void Delay_keys()          //按键延时函数
{
        unsigned char i,j;
        i = 108;
        j = 145;
      
        do
        {
                while(--j);
        }while(--i);
}

void Press_keys()
{
        if(S4 == 0)
        {
                Delay_keys();
                if(S4 == 0)
                {
                        if(state == 0)
                        {
                                state = 1;        //显示Rb2
                        }
                       
                        else if(state == 1)
                        {
                                state = 0;                  //显示Rd1
                        }
                }
                while(S4 == 0);
        }
}

void Read_Rd1()         //采样光敏电阻Rd1的电压
{
        IIC_Start();              //IIC总线起始信号
        IIC_SendByte(0x90);       //写设备地址
        IIC_WaitAck();            //等待从机应答
        IIC_SendByte(0x01);       //写控制字
        IIC_WaitAck();            //等待从机应答
        IIC_Stop();               //IIC总线停止信号

        IIC_Start();              //IIC总线起始信号
        IIC_SendByte(0x91);       //读设备地址
        IIC_WaitAck();            //等待从机应答
        dat_Rd1 = IIC_RecByte();  //读取PCF8591通道1的数据
        IIC_Ack(0);               //产生非应答信号
        IIC_Stop();               //IIC总线停止信号
}

void Read_Rb2()                        //采样电位器Rb2的电压
{
        IIC_Start();
        IIC_SendByte(0x90);
        IIC_WaitAck();
        IIC_SendByte(0x03);
        IIC_WaitAck();
        IIC_Stop();

        IIC_Start();
        IIC_SendByte(0x91);
        IIC_WaitAck();
        dat_Rb2 = IIC_RecByte();
        IIC_Ack(0);
        IIC_Stop();
}

void main()
{
        Select_HC138(5);
        P0 = 0x00;       //关闭蜂鸣器和继电器
        while(1)
        {
                Press_keys();
                switch(state)
                {
                        case 0:
                                Read_Rd1();
                                Display_tube(1,dat_Rd1);
                                break;
                        case 1:
                                Read_Rb2();
                                Display_tube(3,dat_Rb2);
                                break;
                }
        }
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分