找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2331|回復(fù): 0
收起左側(cè)

基于51單片機(jī)的ADC0809數(shù)字電壓表Proteus仿真程序

[復(fù)制鏈接]
ID:678203 發(fā)表于 2022-9-26 14:31 | 顯示全部樓層 |閱讀模式
說明 按鍵按下去 進(jìn)入單路電壓采集模式(及電壓表模式) 按鍵彈起來 就是8路電壓輪流采集模式
基于51單片機(jī)的ADC0809 4路數(shù)字電壓表下面是仿真圖

仿真圖

仿真圖

51hei.gif

以下代碼已經(jīng)測(cè)試過

單片機(jī)代碼:
#include <reg52.h>             //頭文件
#define uchar unsigned char           //宏定義無(wú)符號(hào)字符型
#define uint  unsigned  int           //宏定義無(wú)符號(hào)整型
code uchar seg7code[10]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //顯示段碼 數(shù)碼管字跟
sbit ST=P3^0;   //A/D啟動(dòng)轉(zhuǎn)換信號(hào)
sbit OE=P3^1;   //數(shù)據(jù)輸出允許信號(hào)
sbit EOC=P3^2;  //A/D轉(zhuǎn)換結(jié)束信號(hào)
sbit CLK=P3^3;  //時(shí)鐘脈沖  
sbit KEY=P2^7;
uint z,x,AD0809, date;        //定義數(shù)據(jù)類型
/******************************************************************
延時(shí)函數(shù)
******************************************************************/
void delay(uchar t)
{
  uchar i,j;
   for(i=0;i<t;i++)
   {
            for(j=13;j>0;j--);
         { ;
         }
   }
}
/**********************************************************************
                數(shù)碼管動(dòng)態(tài)掃描
*********************************************************************/
void xianshi() //顯示函數(shù)
{
    uint z,x;
    z=date%100/10;                         //求千位
    x=date%10;                 //求百位
    P3&=0x0f;
          P0=seg7code[z]&0x7f;
          P3|=0X10;
          delay(80);

          P3&=0X0f;  
    P0=seg7code[x];
          P3|=0X20;
          //delay(80);
  }
unsigned char  GetVoltage(unsigned char  ch)
{
  float temp;
  unsigned char value=0;
  P2=0xf0;
  P2|=ch;
  delay(1);
  ST=0;                                //使采集信號(hào)為低
  delay(1);
  ST=1;                                //開始數(shù)據(jù)轉(zhuǎn)換
  delay(1);
  ST=0;                                //停止數(shù)據(jù)轉(zhuǎn)換
  delay(1);
  while(!EOC);                //等待數(shù)據(jù)轉(zhuǎn)換完畢
  OE=1;                                //允許數(shù)據(jù)輸出信號(hào)
  delay(1);
  AD0809=P1;                    //讀取數(shù)據(jù)
  OE=0;                                //關(guān)閉數(shù)據(jù)輸出允許信號(hào)
  temp=AD0809;
  temp=temp*19.531f;  //計(jì)算出電壓值(19.531=5000mv除以AD的位數(shù)值256=5000/256)
  value=temp/100;//為了方便顯示 進(jìn)行縮小 轉(zhuǎn)換成整形 比如實(shí)際電壓1.5V 1500mv/100=15 15在的十位顯示的時(shí)候作為電壓的整數(shù)位 個(gè)位作為小數(shù)位
  return value;
}
void Timer0Init(void)                //20毫秒@12.000MHz
{
        TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
        TL0 = 0xE0;                //設(shè)置定時(shí)初值
        TH0 = 0xB1;                //設(shè)置定時(shí)初值
        TF0 = 0;                //清除TF0標(biāo)志
        TR0 = 1;                //定時(shí)器0開始計(jì)時(shí)
  ET0=1;
  EA=1;
}
/*************************************************************************
                                主函數(shù)        
**************************************************************************/
  unsigned char count=0;
void main()
{
  KEY=1;
  Timer0Init();
  while(1)                           //無(wú)限循環(huán)
  {
    if(KEY==0)
    {
      date=GetVoltage(0);                //數(shù)碼管顯示的數(shù)據(jù)值,其中20為采集數(shù)據(jù)的毫安值
    }
    else
    {
      date=GetVoltage(count);//采集第count路AD值

    }
    xianshi();                        //數(shù)碼管顯示函數(shù)
  }
}        
unsigned char delay1=0;
void timer0( ) interrupt 1 //定時(shí)器0 10ms定時(shí)
{

        TL0 = 0xE0;                //設(shè)置定時(shí)初值
        TH0 = 0xB1;                //設(shè)置定時(shí)初值
  delay1++;
  if(delay1>20)
  {//AD切換顯示的定時(shí)時(shí)間到
    delay1=0;//中斷計(jì)數(shù)清零
    count++;//路數(shù)變量自加
      if(count>7)//路數(shù)變量大于7
        count=0;//清零
  }
}

Keil代碼與Proteus仿真下載: 仿真代碼.7z (899.14 KB, 下載次數(shù): 72)

評(píng)分

參與人數(shù) 1黑幣 +40 收起 理由
admin + 40 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表