PCF8591芯片以及AD学习(一)
<span style="font-size:18px;">/*
项目名称:PCF8591实现AD转换
项目内容:A/D转换,并把转换的数字信号送给P0口控制LED灯
,调节电位器时观察LED的变化
作者:YUAN
*/#include <reg52.h>
#include <intrins.h> //_nop_()延时头文件
typedef unsigned char uChar8;
typedef unsigned int uInt16;
sbit SDA = P1^0;
sbit SCL = P1^1;
#define PCF8591Add 0x90 //PCF8591的器件地址和写操作//延时函数
void DelayMS(uInt16 lValMS);
void Delay5us(void);
//IIC操作的几个函数
void IICInit(void); //IIC初始化
void IICStart(void); //起始信号
void IICStop(void); //停止信号
void IICAck(void); //应答信号
void IICReadAck(void); //读应答信号
void IICWriteOneByte(uChar8 lByteVal); //写一个字节
uChar8 IICReadOneByte(void); //读一个字节
void PCF8591WriteRegulate(uChar8 lREGVal); //Regulate控制器,这里写控制函数
uChar8 ReadDataPCF8591(void); void main()
{IICInit();while(1){ /*写入控制字00,即模拟量输出关闭,选择通道0,不自动增加通道,模拟量输入围方式0*/PCF8591WriteRegulate(0x00);P0 = ReadDataPCF8591(); DelayMS(10);}
}void DelayMS(uInt16 lValMS) //延时函数
{uInt16 luiVal,lujVal;for(luiVal = 0; luiVal < lValMS; luiVal++)for(lujVal = 0; lujVal < 113; lujVal++);
}
void Delay5us(void)
{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
//IIC总线空闲时均为高电平
void IICInit(void) //IIC初始化
{SCL = 0;SDA=1;Delay5us();SCL=1;
}
//SCL高电平期间SDA由高到低的变化为起始信号
void IICStart(void) //起始信号
{SCL = 0;Delay5us();SDA = 1;Delay5us();SCL = 1;Delay5us();SDA = 0;Delay5us();//防止接下来SDA数据变化导致IIC总线误判 SCL = 0;
}
//SCL高电平期间SDA由低到高的变化为终止信号
void IICStop(void) //停止信号
{SCL = 0;Delay5us();SDA = 0;Delay5us();SCL = 1;Delay5us();SDA = 1;Delay5us();//防止接下来SDA数据变化导致IIC总线误判 SCL = 0;
}
//一个脉冲期间,SDA为低电平为应答
void IICAck(void) //应答信号
{SCL = 0;Delay5us();SDA = 0;Delay5us();SCL = 1;Delay5us();SCL = 0;
}
/*cpu读应答信号,如果应答了则
继续传输数据,否则在一定时间里,
默认已经应答,继续传数据
*/
void IICReadAck(void) //读应答信号
{uChar8 li = 0;SCL = 0;SDA = 1; //确保读出的值为0,因此先送1Delay5us();SCL = 1;Delay5us();//如果没有应答或时间没有超过预定时间则停在此处while((1 == SDA)&&(li<255))li++;SCL = 0;Delay5us(); SDA = 1;
}
/*写1个字节,先写高位。
*/
void IICWriteOneByte(uChar8 lByteVal) //写一个字节
{uChar8 li,liVal;liVal = lByteVal;for(li=0;li<8;li++) {SCL = 0; Delay5us(); SDA = (bit)(liVal&0x80); //把数据准备好等待传送Delay5us(); SCL = 1;Delay5us();liVal <<= 1;} SCL = 0; Delay5us(); SDA = 1;
}
/*
读取一个字节并把读到的值返回
*/
uChar8 IICReadOneByte(void)
{uChar8 li,liVal;SCL = 0;SDA = 1;for(li=0;li<8;li++){liVal <<= 1;SCL = 0;Delay5us();SCL = 1;Delay5us();liVal = (liVal|SDA);}SCL = 0; return liVal;
}
//Regulate控制器,这里写控制函数
void PCF8591WriteRegulate(uChar8 lREGVal)
{IICStart();IICWriteOneByte(PCF8591Add); //PCF8591的地址,写控制IICReadAck();IICWriteOneByte(lREGVal); //写入控制字IICReadAck();IICStop();
}
uChar8 ReadDataPCF8591(void)
{uChar8 liVal;IICStart();IICWriteOneByte(PCF8591Add|0x01); //PCF8591的地址,读控制 liVal = IICReadOneByte();IICAck();IICStop();return liVal;
}
</span>
PCF8591芯片以及AD学习(一)相关推荐
- PCF8591芯片的AD/DA转换(适用于蓝桥杯单片机)
目录 1.PCF8591的引脚介绍 2.用IIC发送或接收字节 发送的第一个字节 发送的第二个字节 发送第三个字节 3.发送和接收的字节转换 4.全部代码 IIC部分 接收电压数据 发送电压数据 1. ...
- AD学习之旅(4)— 新建芯片类原理图库器件
AD学习之旅(4)- 新建芯片类原理图库器件 一.前言 本文参考: [Altium500问]第006问 IC类器件的元件模型如何创建? [Altium500问]第007问 原理图库中如何使用封装向导快 ...
- 基于51单片机及PCF8591芯片的ADC电压检测
前述: QQ:961209458 V X:F9986858 这个是一个简易课设作品. 单片机介绍: 8位CPU·4kbytes程序存储器(ROM) (52为8K) 128bytes的数据存储器(RAM ...
- RaspberryPi 4B 使用 PCF8591 8位AD和DA转换器
模数/数模转换在实际应用中非常有用.如何使用树莓派操作挂载到 PCF8591 I²C 线路上的设备?实际上和其他 I²C 设备操作并无差异.首先来学习 PCF8591 的使用方法,然后通过树莓派控制 ...
- AD学习笔记(一)基础认识
文章目录 AD学习笔记 第一讲 AD基础认识 一.两库两图(分别对应下图) 1.PCB图(pcbdoc) 2.原理图(schdoc) 3.原理图库(schlib) 4.PCB库(pcblib) 二.封 ...
- 蓝桥杯单片机-DAC-用板载板载PCF8591芯片在D/A引脚上输出指定的电压
文章目录 题目 main.c iic.c iic.h 题目 1.控制板载PCF8591芯片在D/A引脚上输出指定的电压 2.数码管前三位显示输入数据0-255,后两位显示输出的电压值 3.按下按键S4 ...
- AD学习笔记(四)PCB布局分析
文章目录 AD学习笔记 第四讲 PCB布局分析 一.PCB导入以及常见报错解决方法 二.常见绿色报错的消除 三.PCB板框的评估及叠层设计 四.快捷键设置及推荐 五.PCB布局注意事项 AD学习笔记 ...
- AD学习之旅(1)— Altium Designer 20 软件下载与安装
AD学习之旅(1)- Altium Designer 20 软件下载与安装 一.前言 本次软件安装参考自:Altium Designer 20 AD20软件安装详解教程 凡亿 Altium公司推荐的系 ...
- AD学习笔记——B站学习记录
AD学习笔记--B站学习记录 B站视频路径 一.菜单栏操作 二.(SCHLIB)原理图库 三.(Pcblib)封装库 四.原理图 五.PCB(大部分操作和Pcblib相同,反之亦然) 六.其它 B站视 ...
最新文章
- 【FFmpeg】函数详解(三)
- 二叉树结点地址小错误
- hanlp java_HanLP-实词分词器详解
- git分支合并(包含学习git命令的方法)
- 国庆七天乐 Day5
- tp5备份mysql_tp5备份数据库
- 命令行修改weblogic用户名和密码
- redismanager 获取不到yml中的密码_SpringBoot敏感信息加密,springboot配置文件密码加密jasypt...
- 选择结构_扩展if-else语句
- 在Java中处理异常
- python 面向对象 新式类和经典类
- odoo基础数据加载
- java 同域名下怎么访问同事的项目_喜大普奔,两个开源的前后端分离项目可以在线体验了...
- weblogic-wslt初探
- 32位jdk最大内存_Java安装之JDK下载篇
- Docker以及Registry介绍
- js判断文件后缀名方法
- BZOJ4316 小C的独立集 【仙人掌】
- 达摩院视觉AI课-身份证识别
- 璐璐版本下强度的考虑