找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4496|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

基于51單片機的數(shù)字電壓表設(shè)計

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:612361 發(fā)表于 2019-10-8 17:12 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
軟件部分:
#include<reg51.h>
#include "intrins.h"
#define uchar unsigned char        
#define uint unsigned int        
sbit RS=P0^0;
sbit RW=P0^1;
sbit E=P0^2;                          
sbit cs=P0^7; //AD0804片選                              
sbit rd=P0^6;                              
sbit wr=P0^5;
sbit INTR=P3^2;//中斷請求信號                                
void delay_ms(uint z);
uchar Lcd1602_ReadBusy();
  void Lcd1602_WriteCom(uchar com);
void Lcd1602_WriteData(uchar dat);
void Lcd1602_init();
void display(uchar qian,uchar bai,uchar shi,uchar ge);
void AD_Init();
void AD_Start();
uchar AD_Read();
uchar outdata;
uint D1,D2,D3,D4;      
uint Data;

void main()
{                           
   Lcd1602_WriteCom(0x01);//清屏操作
   Lcd1602_init(); //LCD初始化   
   AD_Init();   //AD初始化
   while(1)
    { cs=0;
       AD_Start();
       while(INTR==1);//AD轉(zhuǎn)換是否結(jié)束
       //INTR=0; //結(jié)束后置為低電平
       Data=AD_Read(); //把AD0804讀取的數(shù)據(jù)賦值給Data

                         Data=Data*196;                //             
                         D1=Data/10000;//整數(shù)部分(電壓表的量程是0-5V,所以整數(shù)部分只有一位)

                         Data=Data%10000;                       
       D2=Data/1000;//十分位

                         Data=Data%1000;                       
       D3=Data/100;//百分位
                       
       Data=Data%100;                       
       D4=Data/10;//千分位
                       
       display(D1,D2,D3,D4);//顯示LCD1602
     }               
}

    void delay_ms(uint z)  
    {
       uint i,j;
       for(i=z;i>0;i--)
          for(j=110;j>0;j--);
    }


    uchar Lcd1602_ReadBusy()  
    {
       uchar temp;
       RS=0;
       RW=1;
       _nop_();
       P2=0xff;            
       _nop_();
       E=1;
       _nop_();
       temp=P2;   
       _nop_();
       E=0;
       return (temp&0x80);  


    }


    void Lcd1602_WriteCom(uchar com)  
    {
       while(Lcd1602_ReadBusy());  
       RS=0;   
       RW=0;  
       _nop_();
       P2=com;   
       _nop_();
       E=1;      
       _nop_();
       _nop_();
       E=0;      
       _nop_();
       _nop_();   
    }

    void Lcd1602_WriteData(uchar dat)
    {
       while(Lcd1602_ReadBusy());   
       RS=1;   
       RW=0;  
       _nop_();
       P2=dat;
       _nop_();
       E=1;
       _nop_();
       _nop_();
       E=0;
       _nop_();
       _nop_();   
    }

    void Lcd1602_init()   
    {
       delay_ms(15);
       Lcd1602_WriteCom(0x38);   
       delay_ms(5);
       Lcd1602_WriteCom(0x38);
       delay_ms(5);
       Lcd1602_WriteCom(0x38);
       Lcd1602_WriteCom(0x0c);
       Lcd1602_WriteCom(0x01);  
       Lcd1602_WriteCom(0x06);  
    }



void display(uchar qian,uchar bai,uchar shi,uchar ge) //顯示LCD1602
{   
      Lcd1602_WriteCom(0x80+0x02);
     Lcd1602_WriteData('V');       
       
     Lcd1602_WriteCom(0x80+0x04);
     Lcd1602_WriteData('O');
       
            Lcd1602_WriteCom(0x80+0x06);
     Lcd1602_WriteData('L');

      Lcd1602_WriteCom(0x80+0x08);
    Lcd1602_WriteData('T');
       
      Lcd1602_WriteCom(0x80+0x0a);
     Lcd1602_WriteData('A');
                                                         
      Lcd1602_WriteCom(0x80+0x0c);
     Lcd1602_WriteData('G');
                                                 
            Lcd1602_WriteCom(0x80+0x0e);
     Lcd1602_WriteData('E');

      Lcd1602_WriteCom(0x80+0x45);
     Lcd1602_WriteData(0x30+qian);//0x30代表數(shù)字0

      Lcd1602_WriteCom(0x80+0x46);
     Lcd1602_WriteData('.');

      Lcd1602_WriteCom(0x80+0x47);
     Lcd1602_WriteData(0x30+bai);

      Lcd1602_WriteCom(0x80+0x48);
     Lcd1602_WriteData(0x30+shi);

       Lcd1602_WriteCom(0x80+0x49);
     Lcd1602_WriteData(0x30+ge);

       Lcd1602_WriteCom(0x80+0x4b);
     Lcd1602_WriteData('V');
}                       


  void AD_Init()//AD初始化
{
    cs=1;//關(guān)閉ADC0804
    wr=1;//關(guān)閉寫
    rd=1;//關(guān)閉讀
}

  void AD_Start()//AD轉(zhuǎn)換開始
{   
          P1=0xff; //寫數(shù)據(jù)前關(guān)閉I/O口
    cs=0;//開啟ADC0804
    wr=0;//寫打開
          delay_ms(1);
    wr=1;//寫關(guān)閉

}

uchar AD_Read() //AD讀取數(shù)據(jù)
{
    cs=0;//開啟ADC0804
    rd=0;//讀打開
    delay_ms(1);
    outdata=P1;//讀取數(shù)據(jù)
    rd=1;//讀關(guān)閉
   // cs=1;//關(guān)閉ADC0804
    return(outdata);//送出數(shù)據(jù)
}

TIM圖片20191008171142.png (237.43 KB, 下載次數(shù): 55)

仿真部分

仿真部分

TIM圖片20191008171112.png (234.2 KB, 下載次數(shù): 39)

TIM圖片20191008171112.png
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:677084 發(fā)表于 2019-12-30 17:05 來自觸屏版 | 只看該作者
為什么要乘196呀?
回復(fù)

使用道具 舉報

板凳
ID:554654 發(fā)表于 2020-1-11 15:26 | 只看該作者
hjncbdhhh 發(fā)表于 2019-12-30 17:05
為什么要乘196呀?

(5/255)*10000
回復(fù)

使用道具 舉報

地板
ID:679533 發(fā)表于 2020-6-17 20:33 | 只看該作者
AD芯片是單獨產(chǎn)生的一個時鐘信號嗎/
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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