基于51单片机的直流数字电压表(0-5V)_单片机怎么采集直流电压_sandform的博客-程序员宅基地

技术标签: 直流 电压表  51单片机  单片机  

基于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();
               
        }
        
}




版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sandform/article/details/51735823

智能推荐

【VUE】Vue+ElementUI 中表单按下enter自动提交_vue input输入后自动触发提交_树街猫的博客-程序员宅基地

问题: 我想要输入enter,自动提交解决方案: @keyup.enter.native="你的提交处理函数" <!-- 修改参数的对话框 --> <el-dialog :title="'修改' + titleText" :visible.sync="editDialogVisible" width="50%" @close="editDialogClosed"> <!-- 修改参数的对话框 --> <el-form :mo_vue input输入后自动触发提交

做一个360度看车的效果玩玩(web)-程序员宅基地

前几天在 Lexus 官网看到有这样的一个效果:http://www.lexus.com.cn/models/es/360于是顺手打开控制台看了下他们是怎么做的,发现使用的技术还是比较简单的,通过背景图的切换来完成全景的效果。心血来潮自己做了一个优化一点的版本,先上DEMO和 源码。(由于图片资源较大,加载时间较长,请耐心等待)接下来分享下我的制作流程。首先观察下他们的图片链...

GData解析XML_gdata xml解析-程序员宅基地

在IOS平台上进行XML文档的解析有很多种方法,在SDK里面有自带的解析方法,但是大多情况下都倾向于用第三方的库,原因是解析效率更高、使用上更方便,关于IOS平台各种解析XML库的优缺点分析,可以看下这篇文章:http://www.raywenderlich.com/553/how-to-chose-the-best-xml-parser-for-your-iphone-project这里_gdata xml解析

automake中的AC_ARG_WITH和AM_CONDITIONAL使用示例-程序员宅基地

automake中的AC_ARG_WITH和AM_CONDITIONAL使用示例AC_ARG_WITHAC_ARG_WITH(common,"--with-common prefix for installed COMMON-LIBRARY",COMMON_LIBRARY_HOME=$withval,COMMON_LIBRARY_HOME=)AC_SUBST

vue项目中vuter格式化和eslint冲突问题_volar与eslint冲突-程序员宅基地

一.在vue单文件中html格式化失败原因: 在vuter默认配置中: “vetur.format.defaultFormatter.html”: “none”,解决:在user setting中设置 “vetur.format.defaultFormatter.html”: “js-beautify-html”,二.在拉下代码或者修改""双引号->’'单引号 后格式化 “单引号-..._volar与eslint冲突

随便推点

如何使用前景和背景创建更清晰的照片-程序员宅基地

Photography can bevery technical, especially in the digital age. But photography is, at it’s core, art. You can take a technically perfect photo that’s utterly boring and a technically imperfect phot...

基本指令_列举5条基本指令-程序员宅基地

1.目录指令(1)ls:显示当前目录下的文件名选项-a显示隐藏文件(以.开头的文件),-d打印目录名,-l列出文件的详细信息(2)pwd:显示当前所在的绝对路径绝对路径:唯一路径(从根目录开始表达路径,/被称为根目录)相对路径:相对于一个指定位置,当前所在的路径(3)mkdir:创建目录 选项-p创建多层级目录(4)rmdir:删除空目录选项:-p 多层级空目录的递归删除(5)rm:可以同时删除文件或目录,它不带选项不能删目录,带选项可以删目录 选项:-f强制删除,忽略提示信息,直接删_列举5条基本指令

ftp中主动模式(port)与被动模式(PASV)-程序员宅基地

body{ font-family: 微软雅黑,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5;}html, body{ }h1 { font-size:1.5em; font-wei..._porttmp

编程题欧拉_欧拉少儿编程_不会codingの程序猿的博客-程序员宅基地

Project Euler Program 13或5的倍数在小于10的自然数中,3或5的倍数有3、5、6和9,这些数之和是23。求小于1000的自然数中所有3或5的倍数之和。//解法一:暴力解法#include <iostream>using namespace std;int main() { int ans = 0; for (int i = 3; i < 1000; i++) { if (i % 3 == 0 || i % 5 == 0)_欧拉少儿编程

linux分区如何4k对齐,Linux如何进行无损修复4K对齐?_那阿阿阿的博客-程序员宅基地

Linux系统如何进行无损的4k对齐?Linux系统已经安装好了,折腾很久了,不想重装。Windows里知道有ParagonAlignmentTool对齐,Linux上找不到。下面我磁盘的一些信息:$sudo fdisk -lDisk /dev/sda:223.6 GiB,240057409536 字节,468862128 个扇区单元:扇区 / 1 * 512 = 512 字节扇区大小(逻辑/物理..._分区1未起始于物理扇区边界

用bulidroot制作交叉工具链-程序员宅基地

1、到网站http://buildroot.uclibc,org/downloa里载较新的buildroot版本buildroot-2009.02.tar..gz。并将该包解压并更名为buildroot。 2、 由于我们平台所采用的内核版本是linux2。4.所以我们在配置buildroot编译选项时,应选上linux2.4的内核。但现在buildroot默认选项中没有linux2.4内核

推荐文章

热门文章

相关标签