前言:今天中午和高中老同学一起吃了个饭,同学计算机专业代码大佬,问起我有没有CSDN,我说有些时候会在上面看一些程序,他随即向我说起了他已经在CSDN上发表了很多文章目前排名一万多,因为我学集成电路专业,有时也会接触一些嵌入式开发的程序,他随即让我也发一些文章,自己以前也有这种想法,但是一直迟迟没动手,适逢同学鼓励,他说这也算是记录自己一个成长的过程,也可以当做自己的一个笔记,回到家后找出了自己写过的一段程序随即发表一下,希望可以帮到需要帮助的人,自己的专业是集成电路相关,以后应该大概率会发一些集成电路相关知识,希望自己可以坚持下去。

一:ADC0832原理介绍

首先介绍ADC0832这个芯片:ADC0832型号芯片,这款A/D转换芯片有8位分辨率,可以对两路模拟信号进行A/D转换,工作模式上可以选择单端输入或差分输入两种模式,管脚图如图所示:

引脚功能为:

引脚CLK:为芯片输入时钟信号。

引脚GND、VCC:分别接地GND、接5V电压源;

引脚CH0、引脚CHl:可以用作于输入模拟信号至ADC0832芯片;

引脚DI:用作于输入数据信号,另一个作用是选择通道控制;

引脚CS:片选使能端,当处于低电平时芯片使能;

引脚DO:一般作用是输出数据信号,还可以用作转换数据的输出;

ADC0832时序图:

由工作时序图可知:当芯片不进行模数转换时,片选端CS需要置1。在当芯片需要模数转换时,片选端CS需要置0,并且需要持续到模数转换完成。芯片使能选通后,在第1个CLK下降沿到来之前,DI需置1,这意味着开始转换。之后在下两个CLK下降沿到来之前,DI需输入两位选择A/D转换器4个工作通道模式的数据。到这一步,本次模数转换中DI端工作部分已完成,不再输入数据,而是由DO端进行工作。在随后的CLK下降沿到来之前开始输出转换后的数字信号,先输出8位数据的最高位,之后在每一个CLK下降沿到来之前依次输出数据的一位,直到输出8位数据的最低位,;随后的每一个CLK下降沿到来之前依次输出相反字节的数据次低位到最高位,这就完成了一次A/D转换。在编程时会比较两次输出的8位数据是否一致,若一致说明A/D转换数据没有错误,就会将其数据保存下来[11]。

ADC0832芯片一般是CS、CLK、DI和DO四个引脚与单片机对应引脚相连。但在本设计中在工作时DI和DO端在A/D转换时没有同时工作发挥作用,而是先由DI端口输入的两位数据来选择通道,再由DO端口输出数据,所以在本设计中将DI和DO接在51单片机同一个管脚上使用。

二:51单片机Proteus仿真图

三:51单片机1602显示代码

        主函数

#include<reg52.h>
#include<intrins.h>
#include "LCD1602.h"
#include "Delay.h"#define uint unsigned int
#define uchar unsigned charsbit CS=P3^0;        //51单片机引脚设置
sbit CLK=P3^1;
sbit DIO=P3^2;uchar get_AD_Res()          //ADC0832启动读取函数
{uchar i, data1=0, data2=0;CS=0;CLK=0;DIO=1;_nop_();CLK=1;_nop_();CLK=0;DIO=1;_nop_(); CLK=1;_nop_();CLK=0;DIO=0;_nop_();CLK=1;_nop_();CLK=0;DIO=1;_nop_(); for(i=0; i<8; i++){CLK=1;_nop_();CLK=0;_nop_();data1=(data1<<1)|(uchar)DIO; }for(i=0; i<8; i++){data2=data2|(uchar)DIO<<i;CLK=1;_nop_();CLK=0;_nop_();}CS=1;return(data1==data2)?data1:0;
}void main()
{uchar u,U1,U2,U3,U,R;LCD_Init();u=get_AD_Res();U=(250*u)/128;    //此处将数字信号转化为模拟信号,要根据上拉电阻阻值来确定U1=U/100;U2=U%100/10;U3=U%100%10;R=200*U/250;while(1){LCD_ShowString(1,1,"Voltage:"); LCD_ShowNum(1,10,U1,1); LCD_ShowChar(1,11,'.');LCD_ShowNum(1,12,U2,1);LCD_ShowNum(1,13,U3,1);LCD_ShowString(1,14,"V"); LCD_ShowString(2,1,"Resistance:");LCD_ShowNum(2,13,R,3);}
}

1602显示函数

#include <REGX52.H>//引脚定义
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_E=P2^7;
#define LCD_DataPort P0/*** @brief  LCD1602延时函数,12MHz调用可延时1ms* @param  无* @retval 无*/
void LCD_Delay()        //@12.000MHz 1ms
{unsigned char i, j;i = 2;j = 239;do{while (--j);} while (--i);
}/*** @brief  LCD1602写命令* @param  Command 要写入的命令* @retval 无*/
void LCD_WriteCommand(unsigned char Command)
{LCD_RS=0;LCD_RW=0;LCD_DataPort=Command;LCD_E=1;LCD_Delay();LCD_E=0;LCD_Delay();
}/*** @brief  LCD1602写数据* @param  Data 要写入的数据* @retval 无*/
void LCD_WriteData(unsigned char Data)
{LCD_RS=1;LCD_RW=0;LCD_DataPort=Data;LCD_E=1;LCD_Delay();LCD_E=0;LCD_Delay();
}/*** @brief  LCD1602初始化函数* @param  无* @retval 无*/
void LCD_Init(void)
{LCD_WriteCommand(0x38);LCD_WriteCommand(0x0C);LCD_WriteCommand(0x06);LCD_WriteCommand(0x01);
}/*** @brief  LCD1602设置光标位置* @param  Line 行位置,范围:1~2* @param  Column 列位置,范围:1~16* @retval 无*/
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{if(Line==1){LCD_WriteCommand(0x80|(Column-1));}else{LCD_WriteCommand(0x80|(Column-1)+0x40);}
}/*** @brief  在LCD1602指定位置上显示一个字符* @param  Line 行位置,范围:1~2* @param  Column 列位置,范围:1~16* @param  Char 要显示的字符* @retval 无*/
void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char)
{LCD_SetCursor(Line,Column);LCD_WriteData(Char);
}/*** @brief  在LCD1602指定位置开始显示所给字符串* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  String 要显示的字符串* @retval 无*/
void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned char *String)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=0;String[i]!='\0';i++){LCD_WriteData(String[i]);}
}/*** @brief  返回值=X的Y次方*/
int LCD_Pow(int X,int Y)
{unsigned char i;int Result=1;for(i=0;i<Y;i++){Result*=X;}return Result;
}/*** @brief  在LCD1602指定位置开始显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~65535* @param  Length 要显示数字的长度,范围:1~5* @retval 无*/
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){LCD_WriteData('0'+Number/LCD_Pow(10,i-1)%10);}
}/*** @brief  在LCD1602指定位置开始以有符号十进制显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:-32768~32767* @param  Length 要显示数字的长度,范围:1~5* @retval 无*/
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
{unsigned char i;unsigned int Number1;LCD_SetCursor(Line,Column);if(Number>=0){LCD_WriteData('+');Number1=Number;}else{LCD_WriteData('-');Number1=-Number;}for(i=Length;i>0;i--){LCD_WriteData('0'+Number1/LCD_Pow(10,i-1)%10);}
}/*** @brief  在LCD1602指定位置开始以十六进制显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~0xFFFF* @param  Length 要显示数字的长度,范围:1~4* @retval 无*/
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i;unsigned char SingleNumber;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){SingleNumber=Number/LCD_Pow(16,i-1)%16;if(SingleNumber<10){LCD_WriteData('0'+SingleNumber);}else{LCD_WriteData('A'+SingleNumber-10);}}
}/*** @brief  在LCD1602指定位置开始以二进制显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~1111 1111 1111 1111* @param  Length 要显示数字的长度,范围:1~16* @retval 无*/
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){LCD_WriteData('0'+Number/LCD_Pow(2,i-1)%2);}
}

Delay 延迟函数


void Delay(unsigned int xms)
{unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);}while (--i);}
}

.h函数

#ifndef __LCD1602_H__
#define __LCD1602_H__void LCD_Init(void);
void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char);
void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned char *String);
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length);
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);#endif
#ifndef __DELAY_H__
#define __DELAY_H__void Delay();#endif

ADC0832测电阻原理及51单片机1602显示相关推荐

  1. 60、基于51单片机1602显示智能台灯坐姿定时+光线+红外+人体感应系统设计

    毕设帮助.开题指导.技术解答(有偿)见文末. 目录 摘要 一.硬件方案 二.设计功能 三.实物图 四.原理图 五.PCB图 六.Protues仿真 七.程序 八.资料包括 摘要 社会在不断进步,人类在 ...

  2. 基于51单片机1602温度显示时钟

    基于51单片机LCD1602温度显示时钟 要在1602上显示时间和温度先要了解1602是如何显示的.详情可以参考我之前的文章基于51单片机1602显示 :时间显示可以用时钟芯片DS1302,但是此次我 ...

  3. 【嵌入式】51单片机+1602+dht11显示温湿度

    51单片机+1602+dht11显示温湿度例程代码如下: /*****************************************************************联系:请勿 ...

  4. 电子时钟万年历+51单片机+1602液晶屏+DS1302+DS18B20+按键

    电子时钟万年历+51单片机+1602液晶屏+DS1302+DS18B20+按键 这次课程设计要完成的是制作一个基于51单片机的电子时钟的万年历(protues仿真),需要用到1602液晶屏+DS130 ...

  5. 51lcd显示光传感器c语言程序,基于51单片机1602液晶显示GY-30数字光照传感器BH1750FVI程序实例...

    基于51单片机1602液晶显示GY-30数字光照传感器BH1750FVI程序实例,系统由GY-30数字光照传感器.51单片机最小系统.1602液晶显示屏组成,电路简单,附件中的程序是实物验证过了的.1 ...

  6. 微型计算机原理和单片机,8086微机原理与51单片机对比

    <8086微机原理与51单片机对比>由会员分享,可在线阅读,更多相关<8086微机原理与51单片机对比(2页珍藏版)>请在人人文库网上搜索. 1.医学信息2010年03月第23 ...

  7. 基于51单片机LCD1602显示

    基于51单片机LCD1602显示 要在1602上显示字符,要大概明白1602液晶显示屏工作原理. 一般的液晶显示器(Liquid Crystal Display, LCD) 的主要原理是以电流刺激液晶 ...

  8. STC12C5A60S2最小系统板/51单片机温度显示和温度控制风扇

    STC12C5A60S2最小系统板/51单片机温度显示和温度控制风扇,板载有DS18B20和TM1650+4位数码管. 项目简介 单片机课课程设计,要做一个智能温控风扇,达到设定的下限温度值就开启风扇 ...

  9. Proteus8仿真:51单片机LCD1602显示

    51单片机LCD1602显示 元器件 原理图部分 代码 main.c 工程文件 元器件 元器件 名称 排阻 RESPACK-8 51单片机 AT89C51 LCD1602 LM016L 按键 BUTT ...

最新文章

  1. Spring boot切换日志框架
  2. ccf-csp #201909-1 小明种苹果
  3. java多表查询返回数据_spring data jpa如何在多张数据库表中查询返回某些字段值?...
  4. 【HDOJ 2020.09.29】一些语法水题ByVJ
  5. 盘点OLCF的超级计算机
  6. 三维坐标绕轴坐标旋转公式
  7. 【Caffe安装】Ubuntu14.04上Caffe配置安装(Only CPU)
  8. python定义一个字符串数组_python 变量,数组,字符串
  9. 极域电子教室软件 v4.0 2015 豪华版忘记密码怎么办
  10. 计算机怎么调整桌面图标的大小,电脑显示器屏幕图标大小如何设置_电脑显示屏内图标大小怎么调...
  11. 【考研经验】2018普通人跨考浙江大学计科的教训和方法论
  12. 转:C# 中 MSCHART 饼状图显示百分比
  13. Behavior Designer 中文版教程
  14. 实战:Longhorn存储-2022.2.24
  15. 清橙OJ 1082 查找第K小元素 -- 快速排序
  16. Transformer拿下CV顶会大奖,微软亚研获ICCV 2021最佳论文
  17. 如何选择合适的统计学方法
  18. 如何让更多游客参与到景区夜游光影秀
  19. Severlet学习:Cookie 处理
  20. 安全狗导致网站程序池被禁用_如何在Microsoft Office程序中禁用安全警告消息栏...

热门文章

  1. 【IPv6+燎原系列—第1期】不要以为IPv6+与你无关,它已影响到你的收入
  2. vivo IQOO手机运行uniapp检测不到(uniapp搜不到vivo)
  3. vfp 字体设置问题
  4. 八字实例-仕禄与伏吟
  5. windows10系统超全面优化攻略,不浪费电脑性能。
  6. WebGL绘制立方体-每个面一种颜色
  7. 报告称四大国产厂商Android手机市场占有率接近40%
  8. Altium Designe 智能PDF无法导出高清PDF问题解决方法
  9. numpy库中三角函数与math库中三角函数的区别
  10. Postman 之 newman 导出测试报告