基于51单片机的直流数字电压表(0-5V)

需要资料的请回原文下载
利用串行A/D转换器TLC549对输入信号电压源进行采集转换成数字信号给51单片机,经单片机进行数据处理后给1602液晶显示。
误差小于1%.
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar LCD[6];   //电压数据转换成LCD1602液晶字符显示
uint Volt;
sbit DO  = P1^0;        //时钟
sbit CS  = P1^1;        //片选
sbit CLK = P1^2;        //数据输出
sbit RS = P2^0;                        //1602液晶数据/命令选择端
sbit RW = P2^1;                        //1602液晶读写端
sbit E  = P2^2;                        //1602液晶使能端

// Function Prototypes
void check_busy(void);
void write_command(uchar com);
void write_date(uchar date);
void LCD_init(void);
void string(uchar ad ,uchar *s);
//void lcd_test(void);
void delay(uint);
void Volt_To_LCD1602(void);
void delay_ms(uint xms);
void Data_Conversion(void);
uchar TLC549_ADC(void);
/*******************************************
    LCD1602 Driver mapped as IO peripheral
*******************************************/  
// Delay
// Delay
void delay(uint j)
{
        uchar i = 60;
  for(; j>0; j--)
  {
                while(--i);
    i = 59;
    while(--i);
    i = 60;
  }
}

// Test the Busy bit
void check_busy(void)
{
        do
  {
                P0 = 0xff;
    E = 0;
    RS = 0;
    RW = 1;
    E = 1;
    _nop_();
  } while(P0 & 0x80);
  E = 0;
}

// Write a command
void write_command(uchar com)
{
        check_busy();
  E = 0;
  RS = 0;
  RW = 0;
  P0 = com;
  E = 1;
  _nop_();
  E = 0;
  delay(1);
}

// Write Data
void write_date(uchar date)
{
        check_busy();
  E = 0;
  RS = 1;
  RW = 0;
  P0 = date;
  E = 1;
  _nop_();
  E = 0;
  delay(1);   
}

// Initialize LCD controller
void LCD_init(void)
{
        write_command(0x38); // 8-bits, 2 lines, 7x5 dots
  write_command(0x0C); // no cursor, no blink, enable display
  write_command(0x06); // auto-increment on
  write_command(0x01); // clear screen
  delay(1);
}

// Display a string
void string(uchar ad, uchar *s)
{
        write_command(ad);
  while(*s>0)
  {
                 write_date(*s++);
     delay(100);
  }
}
//****************************************************//
//函数名:delay_ms(uint xms)
//函数功能:ms级延时函数
//***************************************************//

void delay_ms(uint xms)
{
        uint x,y;
        for(x=xms;x>0;x--)
                for(y=110;y>0;y--);
        
}

//***************************************************//
//函数名称:TLC549_ADC()
//函数功能:读取上一次A/D转换的数据,启动下一次A/D转换
//**************************************************//
uchar TLC549_ADC(void)
{
        uchar n, tmp;

CS  = 1;                     //CS置高,片选无效
        CLK = 0;

CS  = 0;                     //CS置低,片选有效,同时DO输出高位
        _nop_();
        _nop_();                     //适当延迟时间1.4us Setup Time

for(n = 0; n < 8; n++) //串行数据移位输入
        {
                tmp <<= 1;
                tmp |=  DO;

CLK = 1;        //0.4us
                _nop_();          //CLK transition time Max 0.1us
                CLK = 0;        //0.4us
        }
        CS = 1;            //CS置高,片选无效
        for(n = 17; n != 0; n--) _nop_();  //Next Coversion需要延迟17us
        return (tmp);
}
//****************************************//
//函数名称ata_Conversion()
//函数功能:电压换算
//*****************************************//
void Data_Conversion(void)
{
        uchar AD_Data;

AD_Data = TLC549_ADC();
        delay_ms(1000);
        Volt = 5.0 / 256 * AD_Data*1000;
}

void Volt_To_LCD1602(void)
{
        Data_Conversion();                     //电压换算并放大1000倍
        LCD[0] = Volt/1000;         //千位
        LCD[1] = '.';                                //小数点
        LCD[2] = Volt/100%10;  //百位
        LCD[3] = Volt/10%10;    //十位
        LCD[4] = Volt%10;           //个位
        LCD[5] = 'V';                              //字符V

write_command(0x80+8);
        write_date(0x30+LCD[0]);
        write_date(LCD[1]);
        write_date(0x30+LCD[2]);
        write_date(0x30+LCD[3]);
        write_date(0x30+LCD[4]);
        write_date(LCD[5]);

}
        
int main()
{
        //uint m;
        LCD_init();
        
  delay(100);
  write_command(0x01);
        write_command(0x80);
        string(0x80,"Voltage:");
        delay_ms(2000);

while(1)
        {
                Volt_To_LCD1602();
               
        }
        
}


基于51单片机的直流数字电压表(0-5V)相关推荐

  1. 基于51单片机的数字电压表c语言程序,基于AT89C51单片机的直流数字电压表设计毕业论文+任务书+Proteus代码+电路图+源码...

    摘 要 数字电压表是一种结构简单.应用广泛的测量仪表,近年来越来越多地应用在电压测量场合,因此对其测量精度.可靠性和可维护性的要求也越来越高.数字电压表是也诸多数字化仪表的核心与基础,其数字化是将连续 ...

  2. 基于51单片机的直流电机转速显示+加速减速启停

    文章目录 前言 一.前期准备 1.功能实现思路 2.软件实现思路 二.硬件电路 1.总电路 三.软件解读 1.代码解读 2.代码 总结 前言 做了一个实战项目,这个实战项目主要是实现对直流电机转速的控 ...

  3. 基于51单片机的简易数字电压表proteus仿真原理图程序设计

    硬件电路设计 原理图: 仿真图: 单片机的时钟电路与复位电路设计 本系统采用STC系统列单片机,相比其他系列单片机具有很多优点.一般STC单片机资源比其他单片机要多,而且执行速度快:STC系列单片机使 ...

  4. 2022-4-9 基于51单片机驱动直流电机(L293D)(公众号:风吹摇铃 奔赴星海)

    基于51单片机的直流电机驱动 仿真软件为Proteus8.10   编程软件为keil4 系统组成:单片机最小系统.四位共阳极数码管.三个独立按键.直流电机.L293D芯片. 系统功能:又三个按键控制 ...

  5. 基于51单片机数字电压表的设计 仿真、程序、原理图(转发)

    摘 要 数字电压表简称DVM,数字电压表基本原理是将输入的模拟电压信号转化为数字信号,再进行输出显示.而A/D转换器的作用是将连续变化的模拟信号量转化为离散的数字信号,器基本结构是由采样保持,量化,编 ...

  6. 基于51单片机自动数字电压表PCF8591 TLC2543 TL548 proteus仿真汇编程序设计

    硬件设计1 基于51单片机+PCF8591 ADC的仿真电路图: A. 基于51单片机和PCF8591的电压表,具有仿真图/源程序: B. 由数码管作为显示器: C.测试电压范围为0~5V,精度约为0 ...

  7. 基于51单片机的数字电压表(ADC0832)(Proteus仿真+程序)

    编号:29 基于51单片机的数字电压表(ADC0832) 功能描述: 本设计由51单片机最小系统+ADC0832模块+两路模拟量输入模块+液晶1602显示模块 1.主控制器是AT89C82单片机 2. ...

  8. 44、基于51单片机数字电压表设计电流电压功率表

    毕设帮助.开题指导.技术解答(有偿)见文末. 目录 摘要 一.硬件方案 二.设计功能 三.实物图 四.原理图 五.PCB图 六.Protues仿真 七.程序 部分代码 八.资料包括 摘要 本次设计要求 ...

  9. 基于51单片机的数字电压表(PCF8591)(Proteus仿真+程序)

    编号:32 基于51单片机的数字电压表(PCF8591) 功能描述: 本设计由51单片机最小系统+PCF8591模块+四路模拟量输入模块+一路DA输出+液晶1602显示模块 1.主控制器是89C82单 ...

最新文章

  1. ionic + cordova+angularJs 搭建的H5 App完整版总结
  2. 盘点工业界AI项目流程以及边缘设备现状
  3. 信息安全系统设计基础第十周学习总结
  4. 开课吧python视频百度云-廖雪峰老师官方人工智能教程,13个案例带你全面入门!...
  5. php扩展xdebug安装
  6. JAVA——Java操作MySQL数据库的简单工具类[CLASS:DatabaseUtil]
  7. 牛客挑战赛43C-最优公式【二分】
  8. 自考18年4月计算机应用基础,2019年自学考试计算机应用基础试题(18)
  9. 2接口详解_java集合【2】——— Collection接口详解
  10. HDLM for AIX安装
  11. javascript实现页面自动刷新和自动跳转代码
  12. [NIO]dawn之Task具体解释
  13. python数据分析课程网盘-数据分析技能 全套 百度网盘 下载
  14. [保姆级教程] 从原理到应用,超级详细的MPU6050传感器整理,看完这一篇就够了
  15. Markdown转Jupyter
  16. Pytorch iter问题
  17. 四、网络层(一)网络层的功能
  18. 扩展正则表达式之加号
  19. hadoop关于hdfs详细解答
  20. MySQL学习笔记一

热门文章

  1. 什么是Word通配符?Word通配符用法详解
  2. 多功能照片图片处理器小程序源码
  3. 一个自由泳爱好者从2017年到2019年的学习笔记
  4. 计算机应用基础的试卷分析,37班计算机应用基础试卷分析
  5. JavaWeb的学习 -- 第一阶段 html
  6. PC调用安卓手机发短信
  7. 人物传记DAMI MANDII:世界葡萄酒产区综述
  8. ecshop收货地址货到付款修改
  9. 【数据挖掘 机器学习 】总结2:听徐老师讲课第二集
  10. 潭州教育受邀参加“2019新工科建设与发展高峰论坛”