找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3818|回复: 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, 下载次数: 37)

仿真部分

仿真部分

TIM图片20191008171112.png (234.2 KB, 下载次数: 25)

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 单片机教程网

快速回复 返回顶部 返回列表