欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4672|回復: 3
打印 上一主題 下一主題
收起左側

基于51單片機的數字電壓表設計

[復制鏈接]
跳轉到指定樓層
樓主
軟件部分:
#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轉換是否結束
       //INTR=0; //結束后置為低電平
       Data=AD_Read(); //把AD0804讀取的數據賦值給Data

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

                         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代表數字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;//關閉ADC0804
    wr=1;//關閉寫
    rd=1;//關閉讀
}

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

}

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

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

仿真部分

仿真部分

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

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

使用道具 舉報

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

使用道具 舉報

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

(5/255)*10000
回復

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表