前述:
QQ:961209458
V X:F9986858
这个是一个简易课设作品。

单片机介绍:

8位CPU·4kbytes程序存储器(ROM) (52为8K)
128bytes的数据存储器(RAM) (52有256bytes的RAM)
32条I/O口线,111条指令,大部分为单字节指令
21个专用寄存器
2个可编程定时/计数器·5个中断源,2个优先级(52有6个)
一个全双工串行通信口
I/O口:四个8位,并行I/O口,既可用作输入,也可用作输出
两个定时器,两个外部中断,一个全双工串口。
5V供电

其余资料参考芯片手册
芯片手册:百度网盘链接  (点击蓝色字体即可跳转)
提取码:u0po

PCF8591芯片:

注意

如果采用其中一个通道的话是直接读取该通道的数据,如果是采用两个通道的话需要交换读取数据通道口,比如用通道一和二,那么读取实际电路通道一的数据需要在程序中写Dat1=Read(2);Dat2=Read(1); 这是因为在读取PCF8591的通道口数据的时候是上一次通道口转换的的数据。
       PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。PCF8591具有4个模拟输入、1个模拟输出和1个串行I²C总线接口。PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I2C总线以串行的方式进行传输。

【1】单独供电

【2】PCF8591的操作电压范围2.5V-6V

【3】低待机电流

【4】通过I2C总线串行输入/输出

【5】PCF8591通过3个硬件地址引脚寻址

【6】PCF8591的采样率由I2C总线速率决定

【7】4个模拟输入可编程为单端型或差分输入

【8】自动增量频道选择

【9】PCF8591的模拟电压范围从VSS到VDD

【10】PCF8591内置跟踪保持电路

【11】8-bit逐次逼近A/D转换器

【12】通过1路模拟输出实现DAC增益

实验电路图:


PCF8591的ADC电路:

PCB图:
2维

3维

部分代码:
main.c

#include<reg52.h>    //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include <intrins.h> //包含NOP空指令函数_nop_();
#include<LCD1602.h>#define AddWr 0x90   //写数据地址
#define AddRd 0x91   //读数据地址sbit Sda=P2^0;       //定义总线连接端口
sbit Scl=P2^1;bit ADFlag;          //定义AD采样标志位void mDelay(unsigned char j);      //延时程序
void Init_Timer1(void);            //初始化定时器1
void Start(void);                  //启动IIC总线   通信方式
void Stop(void);                   //停止IIC总线
void Ack(void);                    //应答IIC总线
void NoAck(void);                  //非应答IIC总线
void Send(unsigned char Data);     //发送一个字节
unsigned char Read(void);          //读入一个字节并返回
unsigned char ReadADC(unsigned char Chl); //读取AD模数转换的值,有返回值
void DAC(unsigned char Data); //DAC输出void main()
{unsigned int ADtemp,ADtemp1;//定义中间变量InitLcd();mDelay(20);Init_Timer1();while(1){ DAC(255);  //DA输出0,灯灭mDelay(20);     //延时用于清晰看出变化if(ADFlag)      //定时采集输入模拟量{DAC(0);     //输出高,灯亮ADFlag=0;   //标志位置0ADtemp1=ReadADC(0); //读取通道1TempData[0]=(2*ADtemp1)/50;   //处理0通道电压显示TempData[1]=(2*ADtemp1)%50/10;ADtemp=ReadADC(1); //读取通道2TempData[2]=(ReadADC(1)*2)/50;//处理1通道电压显示TempData[3]=((ReadADC(1)*2)%50)/10;ADtemp=ReadADC(2); //读取通道3TempData[4]=(ReadADC(2))/50;//处理1通道电压显示TempData[5]=((ReadADC(2))%50)/10;ADtemp=ReadADC(3); //读取通道4TempData[6]=(ReadADC(3))/50;//处理1通道电压显示TempData[7]=((ReadADC(4))%50)/10;disp();  //显示}}
}//初始化定时器1
void Init_Timer1(void)
{TMOD |= 0x10;              TH1=0xff;  //TL1=0x00;EA=1;                 ET1=1;                  TR1=1;
}//定时器中断程序
void Timer1_isr(void) interrupt 3
{static unsigned int j;  //静态变量,只初始化一次TH1=0xfb;     //重新赋值TL1=0x00;j++;if(j==200){j=0;ADFlag=1;  //定时置位AD采样标志位}
}//读取AD模数转换的值,有返回值
unsigned char ReadADC(unsigned char Chl)
{unsigned char Data;Start();        //写入芯片地址Send(AddWr);Ack();Send(0x40|Chl);//写入选择的通道,Chl的值分别为0、1、2、3,分别代表1-4通道Ack();Start();Send(AddRd);    //读入地址Ack();Data=Read();    //读数据Scl=0;NoAck();Stop();return Data;   //返回值
}

1602.h

#include<reg52.h>
#include<stdio.h>
#include<intrins.h>//1602引脚
sbit RS = P1^0; //Pin4
sbit RW = P1^1; //Pin5
sbit E  = P2^5; //Pin6#define Data  P0    //数据1602数据传送端口unsigned char TempData[8];unsigned char  SecondLine[]="                ";//初始化位空的字符串,在读取回来AD值以后填充
unsigned char  FirstLine[] ="                ";//初始化位空的字符串,在读取回来AD值以后填充/******************************************************************/
void DelayMs(unsigned char ms)//delay Ms
{while(--ms){DelayUs(250);DelayUs(250);DelayUs(250);DelayUs(250);}
}
void WriteCommand(unsigned char c)
{DelayMs(5);//short delay before operationE=0;RS=0;RW=0;_nop_();E=1;Data=c;E=0;
}
void WriteData(unsigned char c)
{DelayMs(5);   //short delay before operationE=0;RS=1;RW=0;_nop_();E=1;Data=c;E=0;RS=0;
}//显示变量
void ShowString (unsigned char line,char *ptr)//显示变量
{unsigned char l,i;l=line<<4;for (i=0;i<16;i++)ShowChar (l++,*(ptr+i));//循环显示16个字符
}//LCD初始化
void InitLcd()
{DelayMs(15);WriteCommand(0x38); //display modeWriteCommand(0x38); //display modeWriteCommand(0x38); //display modeWriteCommand(0x06); //显示光标移动位置WriteCommand(0x0c); //显示开及光标设置WriteCommand(0x01); //显示清屏
}//1602显示
void disp(void)
{//第一行FirstLine[2]='0'+TempData[0]; //把通道1电压的整数部分存入FirstLine[]数组FirstLine[3]='.';             //存入 .FirstLine[4]='0'+TempData[1]; //把通道1电压的小数部分存入FirstLine[]数组FirstLine[6]='V';             //存入 V 符号FirstLine[9] ='0'+TempData[2];FirstLine[10]='.';FirstLine[11]='0'+TempData[3];FirstLine[13]='V';//第二行SecondLine[2]='0'+TempData[4];SecondLine[4]='0'+TempData[5];SecondLine[3]='.';SecondLine[6]='V';SecondLine[9]='0'+TempData[6];SecondLine[11]='0'+TempData[7];SecondLine[10]='.';SecondLine[13]='V';//显示字符串ShowString(0,FirstLine);  //第一行显示FirstLine[]字符串ShowString(1,SecondLine); //第二行显示SecondLine[]字符串
}

基于51单片机及PCF8591芯片的ADC电压检测相关推荐

  1. 基于51单片机+SHT30设计的环境温度与湿度检测设备(IIC模拟时序)

    一.项目介绍 当前文章介绍基于51单片机和SHT30传感器设计的环境温度与湿度检测设备.设备采用IIC模拟时序通信协议,能够实时监测环境的温度和湿度,并将数据通过LCD显示屏显示出来:可以广泛应用于室 ...

  2. 17、基于51单片机智能饮水机带温度水位检测APP控制系统设计

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

  3. 基于51单片机的太阳能锂电池充电器系统电压电流检测方案原理图设计

    系统功能分析 本系统具体框图如下图所示 本设计由STC89C52单片机+LCD1602液晶显示电路+A/D转换芯片PCF8591电路+电压检测电路+电流检测电路ACS712-5A+继电器控制电路+电源 ...

  4. 基于51单片机的老人防跌倒报警器体温检测GSM短信上报原理图方案设计

    硬件电路的设计 (下方附文件) 系统的功能分析及体系结构设计 3.1.1系统功能分析 本设计由STC89C52单片机电路+ADXL345加速度传感器电路+按键电路+蜂鸣器报警电路+DS18B20温度传 ...

  5. 基于51单片机的汽车自动照明灯超声波光敏检测远近光灯方案原理图设计

    系统的功能分析及体系结构设计 (附文件) 系统功能分析 本设计由STC89C52单片机+光照检测电路(光敏电阻)+超声波HC-SR04模块电路+4位高亮白色LED灯+黄绿LED指示灯电路+拨动开关电路 ...

  6. 基于51单片机的智能窗户烟雾浓度雨滴检测无线wifi控制系统proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.LCD1602实时显示当前环境温湿度,烟雾浓度,室外是否下雨 2.按键可设定烟雾浓度,环境温湿度阈值,雨滴检测阈值 3.当环境适宜时,打开窗户 ...

  7. 基于51单片机及NB-IoT的消防管道压力检测原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.系统采用LCD1602实时显示管道压力等信息 2.通过四个功能按键可设置压力等阈值 3.压力传感器采用的型号是松下的D3B 4.采用DC002 ...

  8. 基于51单片机MAX6675的热电偶智能体温度检测proteus仿真程序设计

    硬件设计 (末尾附文件) 本系统采用的是K型热电偶采集温度,因此本设计有温度采集部分,数据处理部分,温度显示部分,故障显示并显示部分组成.AT89S52单片机以及单片机的外围电路由晶振电路,复位电路, ...

  9. 基于51单片机的智能停车场管理车位引导检测系统Proteus仿真设计DIY开发板套件

    单片机毕业设计/电子设计大赛/大学生创新项目 本系统由STC89C52单片机.红外对管传感器.LCD1602液晶显示.LED指示灯及电源组成 1.红外对管模块实时检测车位是否占用,车位分为1车位,2车 ...

最新文章

  1. vs转eclipse之工具快速上手篇
  2. sessionId与cookie 的关系(百度文库)
  3. 在线建立或重做mysql主从复制架构方法(传统模式和GTID模式)【转】
  4. 基于GitBook框架搭建技术文档平台
  5. jsp内置对象--session
  6. 戴尔 Wyse Thin 客户端设备受两个 CVSS 10分严重漏洞影响
  7. Python存储和读取数据
  8. 是德科技N9020A 频谱分析仪技术资料说明
  9. 基于深度学习的手写汉字识别
  10. AES对称加密原理及服务
  11. java 用户登录_java编写用户登录
  12. 银行钱数(带小数位)转大写
  13. 精心为学弟学妹整理的 C语言/C++ 项目合集
  14. H5性能测试以及H5性能测试工具
  15. 第一模块 jdk与jre、==与equals、Math.round(-1.5)、 String、操作字符串的类、字符串反转、抽象类必须要有抽象方法吗、普通类和抽象类、BIO NIO AIO
  16. Python爬取手机APP
  17. python常用的案例
  18. Java中文乱码破碎重组_Java 关于中文乱码问题的解决方案与经验
  19. 反种族主义算法的偏见与警务简介
  20. 数据库sql优化总结之5--数据库SQL优化大总结

热门文章

  1. Can‘t resolve symbol ‘Depart‘解决方法
  2. 接口自动化(二)从excel文件获取测试数据
  3. 可搜索加密研究进展综述与改进方案(读论文,学习笔记)
  4. 使用卷积神经网络(CupCnn)训练人脸检测模型
  5. matlab bvp4c猜测解,bvp4c解边界值微分方程
  6. java获取上传视频的时长
  7. springboot+mybatis-plus+vue完成微信支付(前后端分离)
  8. SQL Server进制转换函数的创建
  9. Processing编程学习指南3.4 鼠标点击和键盘操作
  10. (Google)谷歌笔试算法题:要求相邻的两个数都不小于或者不大于其本身的排序