目录

前言:

ADC0832时序图:

ADC0832模数转换

数码管显示函数代码

LCD1602显示函数

主函数

proteus仿真图


前言:

模数A/D转换理论知识持续学习:2022--7--24

ADC0832时序图:

ADC0832模数转换

ADC0832模数转换模拟时序代码如下:

//函数名:ADC0832_ReadAD
//形参变量:无
//返回值return:AD_value:转化之后的数字量

#include"reg52.h"
#include"Delay.h"

sbit ADC0832_CS=P2^4;//片选信号段
sbit ADC0832_CLK=P2^5;//时钟信号端
sbit ADC0832_DIN=P2^6;//串行数据输入端
sbit ADC0832_DOUT=P2^7;//串行数据输出端

void ADC0832_init(void)
{
    ADC0832_CS=1;//芯片不工作
    ADC0832_CLK=0;
    ADC0832_DIN=0;
}

unsigned char ADC0832_ReadAD(void)
{
    unsigned char i,AD_value1=0x00,AD_value2=0x00;
    ADC0832_CS=0;//芯片工作(初始cs信号为高电平)
    
    ADC0832_DIN=1;//起始信号S
    ADC0832_CLK=1;//上升沿将起始信号Start写入
    ADC0832_CLK=0;
    
//----------------通道地址设置----0通道(单端模式)---------------//    
    
    ADC0832_DIN=1;//mode状态位置1
    ADC0832_CLK=1;//将mode状态位写入
    ADC0832_CLK=0;
    
    ADC0832_DIN=0;//通道选择0通道
    ADC0832_CLK=1;//将通道选择位写入
    ADC0832_CLK=0;//第4个脉冲下降沿后,ADC0832_DIN端口失效,无作用
    
    ADC0832_DIN=1;//ADC0832_DIN转为改高阻状态(数据线拉高,等待下次接收数据)
    
//---------------------读取相对应的通道0的AD数据--------------------------//
    ADC0832_DOUT=1;//数据线拉高,等待接收数据
    
    for(i=0;i<8;i++)//MSB
    {
        ADC0832_CLK=1;
        ADC0832_CLK=0;
        if(ADC0832_DOUT){AD_value1=AD_value1 |(0x80>>i);}//优先读取最高位        MSB
    }
    
    for(i=0;i<8;i++)//LSB
    {
        if(ADC0832_DOUT){AD_value2=AD_value2 |(0x01<<i);}//优先读取最低位        LSB
        ADC0832_CLK=1;
        ADC0832_CLK=0;
    }

ADC0832_DOUT=1;//数据线拉高,等待接收数据
    ADC0832_CS=1;//芯片停止工作
    return (AD_value1==AD_value2)? AD_value1:0;//判断前后两次读取数据是否相同(前后两个字节数据校验)
}

数码管显示函数代码

数码管显示函数代码如下:(8段4位共阴数码管)

//函数名:7段4位数码管显示函数
//形参变量:wei:位数        num:对应位显示的数值
//返回值return:无

#include"reg52.h"
#include"Delay.h"

#define SMG_DUAN_PORT        P3//段选
#define SMG_WEI_POER        P1//位选

unsigned char code smg_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//无小数点-----0-9字形码
unsigned char code smgd_code[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//有小数点-----0-9字形码

void smg_display(unsigned char wei,num)//共阴极数码管
{
    unsigned char i;
    for(i=0;i<4;i++)
    {
        switch(wei)//位选
        {
            case 1:SMG_WEI_POER=0xfe;break;
            case 2:SMG_WEI_POER=0xfd;break;
            case 3:SMG_WEI_POER=0xfb;break;
            case 4:SMG_WEI_POER=0xf7;break;
        }
        if(wei==2)
            SMG_DUAN_PORT=smgd_code[num];
        else
            SMG_DUAN_PORT=smg_code[num];
        
        delay_ms(1);//延时,增加其亮度
        SMG_DUAN_PORT=0x00;//消隐
    }
}

LCD1602显示函数

LCD1602显示函数代码如下:

#include "reg52.h"
#include "Delay.h"

#define u8 unsigned char
#define u16 unsigned int
    
#define LCD_DATA_PORT        P0

sbit LCD_WR=P2^1;//读写控制端
sbit LCD_RS=P2^0;//数据指令端
sbit LCD_EN=P2^2;//有效使能端

void lcd_write_cmd(u8 cmd)//写指令函数
{
    LCD_RS=0;
    LCD_WR=0;
    LCD_DATA_PORT=cmd;
    LCD_EN=0;
    delay_ms(1);
    LCD_EN=1;
    delay_ms(1);
    LCD_EN=0;
}

void lcd_write_data(u8 Data)//写数据函数,将数据写入DDRAM中
{
    LCD_RS=1;
    LCD_WR=0;
    LCD_DATA_PORT=Data;
    LCD_EN=0;
    delay_ms(1);
    LCD_EN=1;
    delay_ms(1);
    LCD_EN=0;
}

void lcd_init(void)//初始化函数
{
    lcd_write_cmd(0x38);//功能设定指令
    lcd_write_cmd(0x0c);//显示开关控制指令
    lcd_write_cmd(0x06);//模式设定指令
    lcd_write_cmd(0x01);//清屏指令
}

void lcd_clear(void)//清屏函数
{
    lcd_write_cmd(0x01);//清屏指令    
}

void setcursor(u8 line,u8 column)//光标定位函数,确定DDRAM中的坐标
{
    if(line==1)
        lcd_write_cmd(0x80+column-1);
    else
        lcd_write_cmd(0x80+0x40+column-1);
}

//函数名:单个字符显示函数
//形参变量:line:行  column:列
//返回值return:无
void lcd_showchar(u8 line,u8 column,u8 Char)
{
    setcursor(line,column);
    lcd_write_data(Char);
}
//函数名:字符串显示函数
//形参变量:line:行(1-2)  column:列(1-40        *string:字符串
//返回值return:无
void lcd_showstring(u8 line,u8 column,u8 *string)
{
    setcursor(line,column);//光标定位
    while(*string!='\0')
    {
        lcd_write_data(*string);
        string++;
    }
}
//函数名:单个无符号数字显示函数
//形参变量:line:行(1-2)  column:列(1-40)  num:0-9(取值范围)
//返回值return:无
void lcd_show_onenum(u8 line,u8 column,u8 num)
{
    setcursor(line,column);//光标定位
        lcd_write_data(num+0x30);
}
//函数名:多个无符号数字显示函数
//形参变量:line:行  column:列        nums:数值        length:数值长度
//返回值return:无
u16 num_pow(u8 x,u8 y)//次方函数:x:底数        y:幂(次数)
{
    u16 result=1;
    while(y--)
    {
        result*=x;
    }
    return result;
}
void lcd_shownums(u8 line,u8 column,u16 nums,u8 length)
{
    u8 i;
    setcursor(line,column);//光标定位
    for(i=length;i>0;i--)
    {
        lcd_write_data(nums/num_pow(10,i-1)%10+0x30);
    }
}

//函数名:多个有符号数字显示函数
//形参变量:line:行  column:列        nums:数值取值范围:-32768-32767     length:数值长度 
//返回值return:无

void lcd_showsignednums(u8 line,u8 column,int nums,u8 length)
{
    u8 i;
    u16 number1;
    setcursor(line,column);//光标定位
    if(nums<=0)
    {
        lcd_write_data('-');
        number1=-nums;
    }
    else
    {
        lcd_write_data('+');
        number1=nums;
    }
    for(i=length;i>0;i--)
    {
        lcd_write_data(number1/num_pow(10,i-1)%10+0x30);
    }
}

//函数名:十六进制数字显示函数
//形参变量:line:行  column:列      nums:数值        length:数值长度
//返回值return:无

void lcd_showhexnums(u8 line,u8 column,u16 nums,u8 length)
{
    u8 i,number;
    setcursor(line,column);//光标定位
    for(i=length;i>0;i--)
    {
        number=nums/num_pow(16,i-1)%16;
        if(number<10)//转化为十进制数判断
            lcd_write_data(number+'0');
        else
            lcd_write_data(number+'A'-10);//'A':0x40H
    }    
}

//函数名:二进制数字显示函数
//形参变量:line:行  column:列      nums:数值        length:二进制数值长度,例如,0xfe:1111 1110(8位)
//返回值return:无

void lcd_showbinnums(u8 line,u8 column,u16 nums,u8 length)
{
    u8 i,number;
    setcursor(line,column);//光标定位
    for(i=length;i>0;i--)
    {
        number=nums/num_pow(2,i-1)%2;
        if(number<10)//转化为十进制数判断
            lcd_write_data(number+'0');
        else
            lcd_write_data(number+'A'-10);//'A':0x40H
    }    
}

主函数

主函数代码如下:

/*********************************************
功能说明:利用模数AD转化,将电位器的阻值和电位显示在LCD1602和数码管上
*********************************************/
#include"reg52.h"
#include"LCD1602_display.h"
#include"ADC0832.h"
#include"Delay.h"
#include"7SEG_MPX4.h"#define u8 unsigned char
#define u16 unsigned intfloat Resister;//电阻
float Voltage;//电阻分压
u16 Voltage_show;void main()
{lcd_init();//LCD1602初始化ADC0832_init();//ADC0832初始化lcd_showstring(1,1,"Voltage:");lcd_showstring(2,1,"Resister:");while(1){Resister=ADC0832_ReadAD()*1000.0/255;//传递A/D转换后的数字量Voltage=(Resister*5/1000);Voltage_show=Voltage*100;lcd_shownums(1,10,Voltage_show,3);lcd_shownums(2,10,Resister,4);    smg_display(2,Voltage_show/100%10);smg_display(3,Voltage_show/10%10);smg_display(4,Voltage_show/1%10);}
}

proteus仿真图

proteus仿真图如下:

基于ADC0832模数转换+数码管/LCD显示+proteus仿真相关推荐

  1. 51单片机定时器累加计数(000-999)+4位数码管(循环显示)+Proteus仿真

    51单片机定时器累加计数(000-999)+4位数码管(循环显示)+Proteus仿真 说明:为什么采用4位的数码管,因为Proteus里面没有3位的数码管器件可选,也可以采用2+1,或者1+1+1, ...

  2. 基于stm32的DHT11温湿度采集LCD显示Proteus仿真

    *本设计:* 基于stm32温湿度采集Proteus仿真(仿真+程序) 仿真图protues 8.9 程序编译器:keil 5 编程语言:C语言 *设计编号:C0041* *功能描述:* 通过STM3 ...

  3. 51单片机ADC0832模数转换+ LCD1602显示+Proteus仿真

    51单片机ADC0832模数转换+ LCD1602显示+Proteus仿真 Proteus仿真 在Proteus SP2仿真过程中发现无法读取ADC0832的数据.解决办法:在proteus安装目录下 ...

  4. 基于icl7107的温度计显示proteus仿真

    基于icl7107的温度计显示proteus仿真 话不多说先上作品图 由于使用的仿真软件中没有icl7107,所以用的是tc7107,两者除了芯片引脚不同,其他没有什么区别. 实现原理 首先得弄清楚整 ...

  5. Arduino 74HC595驱动数码管0-9循环显示+Proteus仿真

    Arduino 74HC595驱动数码管0-9循环显示+Proteus仿真 Proteus仿真 实例代码(do{}while();实现方法) /*74HC595控制1位共阳数码管* * * * * * ...

  6. Arduino UNO + 74HC595联级+数码管实现000-999循环计数显示+ Proteus仿真

    Arduino UNO + 74HC595联级+数码管实现000-999循环计数显示+ Proteus仿真 3个74HC595联级显示000-999计数 Proteus仿真 实例代码 int latc ...

  7. 51单片机AD转换pcf8591+数码管显示+Proteus仿真二

    51单片机AD转换pcf8591+数码管显示+Proteus仿真二

  8. 8086+ADC0808+8255A电压测量数码管显示Proteus仿真

    8086+ADC0808+8255A电压测量数码管显示Proteus仿真 Proteus仿真截图 代码 CODE SEGMENT DATA SEGMENT PORT_ADC EQU 80H PORT_ ...

  9. 51单片机 ADC0809模数转换与显示+Proteus仿真

    51单片机 ADC0809模数转换与显示+Proteus仿真 Proteus仿真 实例代码 /*********************************/ #include <reg52 ...

最新文章

  1. Dynamics CRM中的操作(action)是否是一个事务(transaction)?
  2. NSString字符串常用知识点
  3. 脚本示例 (Reporting Services)Microsoft Visual Basic .NET
  4. 网页 JavaScript的DOM操作
  5. 【BZOJ1043】下落的圆盘 [计算几何]
  6. mysql 查询倒数第二条记录_MySQL查询倒数第二条记录实现方法
  7. 2018年第九届蓝桥杯—C/C++程序设计省赛解题
  8. IntelliJ Idea 常用12款插件(提高开发效率),附优秀主题插件
  9. 猜你喜欢代码替换_如何在 GitHub 上找到你要的代码?
  10. MATLAB高斯平顶化,一种高斯光束变换为平顶光束整形透镜的粒子群设计方法与流程...
  11. iOS远程真机之ios-minicap安装使用完全指南
  12. java 纯真ip数据库_Java 快速把2016最新版纯真ip数据库导入mysql的方法
  13. pip指定网址下载安装(清华源)
  14. 台式计算机usb口不识别鼠标,如何解决插入鼠标提示无法识别USB设备的问题
  15. 写作小技能:知识工作者的全套手艺
  16. maya python 的简单使用
  17. I2C driver编写指导二:编写i2c client driver指南
  18. Linux管道初步了解
  19. 在 ionic 项目中使用(迁移) capacitor
  20. 如何将图片验证码转换为文字,图片识别。

热门文章

  1. css hover:效果
  2. 如何在word文档里面的小方框内打钩
  3. Matlab混响器——无限个回声混响器
  4. 简明x86汇编语言教程_转载
  5. Java程序员校招蚂蚁金服,java线程池实际项目案例
  6. CSS中的flax布局
  7. fvm的管理多版本Flutter sdk
  8. 小程序源码:装B神器P图修改微信流量主-多玩法安装简单
  9. iapp裕v3登录界面教程
  10. antd table动态表头_ant-design动态表头