单片机学习小组
直播中

北上北京

9年用户 939经验值
擅长:嵌入式技术
私信 关注

如何实现ADC0808/ADC0809的多通道电压采集程序设计?

如何实现ADC0808/ADC0809的多通道电压采集程序设计?

回帖(1)

安喆

2022-1-24 11:28:35
一、Proteus仿真电路图如下



二、程序见附件也可加群免费获取
#include
#include
#define uint  unsigned int
#define uchar unsigned char
#define ulong unsigned long
/*74HC595所用引脚宏定义*/
***it HC595_DAT  = P2^0;
***it HC595_CLK  = P2^1;
***it HC595_STC  = P2^2;
/*ADC0832所用引脚宏定义*/
***it OE  = P1^0;
***it EOC = P1^1;
***it ST  = P1^2;
***it CLK = P1^3;
***it CC  = P1^6;
***it BB  = P1^5;
***it AA  = P1^4;
/*数码管段选码数组定义(不带小数点)*/
uchar LEDData[10]=
{
  0x03,        /*0*/
  0x9F, /*1*/
  0x25, /*2*/
  0x0D, /*3*/
  0x99, /*4*/
  0x49,        /*5*/
  0x41,        /*6*/
  0x1F,        /*7*/
  0x01,        /*8*/
  0x09        /*9*/
};
/*数码管段选码数组定义(带小数点)*/
uchar LEDData1[10]=
{
  0x02,        /*0*/
  0x9E, /*1*/
  0x24, /*2*/
  0x0C, /*3*/
  0x98, /*4*/
  0x48,        /*5*/
  0x40,        /*6*/
  0x1E,        /*7*/
  0x00,        /*8*/
  0x08        /*9*/
};
/*毫秒延时函数ms*/
//void DelayMS(uint ms)
//{
//         uchar i;
//        while(ms--)
//        {
//                 for(i=0;i<120;i++);
//        }
//}
/*74HC595显示函数1->显示ADC电压值*/
uchar v1[3] = {0x03,0x03,0x03};
uchar v2[3] = {0x03,0x03,0x03};
uchar v3[3] = {0x03,0x03,0x03};
void Send_HC595_Byte(uchar temp8)
{
   uchar i;
   for(i = 0; i < 8; i++)
   {
       HC595_DAT = temp8&0x01;//从高位开始传输
       HC595_CLK = 0;
       _nop_();
       _nop_();
       HC595_CLK = 1;
       temp8=temp8>>1;
   }
}
void Display(uchar v1[3],uchar v2[3],uchar v3[3])
{
   HC595_STC = 0;
   Send_HC595_Byte(v1[0]);
   Send_HC595_Byte(v1[1]);
   Send_HC595_Byte(v1[2]);


   Send_HC595_Byte(v2[0]);
   Send_HC595_Byte(v2[1]);
   Send_HC595_Byte(v2[2]);


   Send_HC595_Byte(v3[0]);
   Send_HC595_Byte(v3[1]);
   Send_HC595_Byte(v3[2]);
   HC595_STC = 1;
}
void main()
{
        TMOD = 0x02;
        TH0  = 0xFB;
        TL0  = 0xFB; //500KHZ
        TR0  = 1;
        ET0  = 1;
        EA   = 1;
        while(1)
        {  
                /*通道0转换*/       
                CC = 0;BB = 0;AA = 0;
                ST = 0;
                ST = 1;
                ST = 0;
                _nop_();_nop_();_nop_();
                while(EOC == 0);
                OE = 1;
                v3[2] = LEDData1[P3/100];
                v3[1] = LEDData[P3%100/10];
                v3[0] = LEDData[P3%10];
                OE = 0;
                /*通道1转换*/
                CC = 0;BB = 0;AA = 1;
                ST = 0;
                ST = 1;
                ST = 0;
                _nop_();_nop_();_nop_();
                while(EOC == 0);
                OE = 1;
                v2[2] = LEDData[P3/100];
                v2[1] = LEDData[P3%100/10];
                v2[0] = LEDData[P3%10];
                OE = 0;
                /*通道2转换*/
                CC = 0;BB = 1;AA = 0;
                ST = 0;
                ST = 1;
                ST = 0;
                _nop_();_nop_();_nop_();
                while(EOC == 0);
                OE = 1;
                v1[2] = LEDData[P3/100];
                v1[1] = LEDData[P3%100/10];
                v1[0] = LEDData[P3%10];
                OE = 0;
                /*595数码管显示三通道采集到的ADC数值*/
                Display(v1,v2,v3);
        }
}
void Timer0_INT() interrupt 1
{
        TH0  = 0xFB;
        TL0  = 0xFB;
        CLK = !CLK;
}
举报

更多回帖

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