注册
登录
电子工程世界-论坛
返回首页
EEWORLD首页
频道
EE大学堂
下载中心
Datasheet
专题
单片机
物联网
汽车电子
嵌入式
手机/便携
模拟电子
家用电子
网络通信
电源管理
工业控制
测试测量
半导体设计/制造
安防电子
传感器
医疗电子
825cow的个人空间
https://home.eeworld.com.cn/space-uid-449920.html
[收藏]
[复制]
[分享]
[RSS]
空间首页
动态
记录
日志
相册
主题
分享
留言板
个人资料
借用开发板
论坛
淘帖
Collection
查看新帖
最新回复
社区活动
联系管理员
我的空间
帖子
日志
收藏
好友
勋章
积分
安全验证
请完成以下验证码
日志
PCF8591学习(二)-AD转换,算法,串口打印
已有 1266 次阅读
2015-12-29 22:31
|
个人分类:
51单片机
|
AD转换
,
算法
,
串口打印
利用A/D,加上简单的计算,加上串口打印,我们就可以简单的测量电压了。就可以做简单的电压或电流表了。调节电位器,电压会变化,led灯也会变化,电脑显示实验现象如图:
源代码:
项目名称:PCF8591AD和串口打印
项目内容:A/D转换,把转换的数字量
送给P0口控制LED的亮灭 ;
并把转换的数字逻辑
运算,送给串口,打印到电脑上。
这样就可以采样电压信号了,并处理。
可以扩展做出电压表,电流表等。
作者:YUAN
*/
#include <reg52.h>
#include <stdio.h> //printf输出头文件
#include <intrins.h> //_nop_()延时头文件
typedef
unsigned
char
uChar
8
;
typedef
unsigned
int
uInt
1
6
;
sbit SDA = P
1
^
0
;
sbit SCL = P
1
^
1
;
#define PCF8591Add 0x90 //PCF8591的器件地址和写操作
uChar
8
gTemp;
float
gfDataVal;
//用在转载计算的数值,并发送给计算机
//延时函数
void
DelayMS(uInt
1
6
lValMS);
void
Delay
5
us(
void
);
//IIC操作的几个函数
void
IICInit(
void
);
//IIC初始化
void
IICStart(
void
);
//起始信号
void
IICStop(
void
);
//停止信号
void
IICAck(
void
);
//应答信号
void
IICReadAck(
void
);
//读应答信号
void
IICWriteOneByte(uChar
8
lByteVal);
//写一个字节
uChar
8
IICReadOneByte(
void
);
//读一个字节
void
PCF
8
5
9
1
WriteRegulate(uChar
8
lREGVal);
//Regulate控制器,这里写控制函数
uChar
8
ReadDataPCF
8
5
9
1
(
void
);
//
//串口的几个程序
void
UartInit(
void
);
//串口初始化
void
UartPrint(
float
iVal);
//Printd打印,打印函数
void
main()
{
IICInit();
UartInit();
while
(
1
)
{
/*写入控制字00,即模拟量输出关闭,选择通道0,
不自动增加通道,模拟量输入围方式0*/
PCF
8
5
9
1
WriteRegulate(
0
x
0
0
);
P
0
= ReadDataPCF
8
5
9
1
();
gTemp = P
0
;
//用来中转的存储区
gfDataVal = (
float
)gTemp/
2
5
5
*
5
;
//强制转换
DelayMS(
1
0
0
0
);
UartPrint(gfDataVal);
}
}
void
DelayMS(uInt
1
6
lValMS)
//延时函数
{
uInt
1
6
luiVal,lujVal;
for
(luiVal =
0
; luiVal < lValMS; luiVal++)
for
(lujVal =
0
; lujVal <
1
1
3
; lujVal++);
}
void
Delay
5
us(
void
)
{
_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();
}
//IIC总线空闲时均为高电平
void
IICInit(
void
)
//IIC初始化
{
SCL =
0
;
SDA=
1
;
Delay
5
us();
SCL=
1
;
}
//SCL高电平期间SDA由高到低的变化为起始信号
void
IICStart(
void
)
//起始信号
{
SCL =
0
;
Delay
5
us();
SDA =
1
;
Delay
5
us();
SCL =
1
;
Delay
5
us();
SDA =
0
;
Delay
5
us();
//防止接下来SDA数据变化导致IIC总线误判
SCL =
0
;
}
//SCL高电平期间SDA由低到高的变化为终止信号
void
IICStop(
void
)
//停止信号
{
SCL =
0
;
Delay
5
us();
SDA =
0
;
Delay
5
us();
SCL =
1
;
Delay
5
us();
SDA =
1
;
Delay
5
us();
//防止接下来SDA数据变化导致IIC总线误判
SCL =
0
;
}
//一个脉冲期间,SDA为低电平为应答
void
IICAck(
void
)
//应答信号
{
SCL =
0
;
Delay
5
us();
SDA =
0
;
Delay
5
us();
SCL =
1
;
Delay
5
us();
SCL =
0
;
}
/*cpu读应答信号,如果应答了则
继续传输数据,否则在一定时间里,
默认已经应答,继续传数据
*/
void
IICReadAck(
void
)
//读应答信号
{
uChar
8
li =
0
;
SCL =
0
;
SDA =
1
;
//确保读出的值为0,因此先送1
Delay
5
us();
SCL =
1
;
Delay
5
us();
//如果没有应答或时间没有超过预定时间则停在此处
while
((
1
== SDA)&&(li<
2
5
5
))li++;
SCL =
0
;
Delay
5
us();
SDA =
1
;
}
/*
写1个字节,先写高位。
*/
void
IICWriteOneByte(uChar
8
lByteVal)
//写一个字节
{
uChar
8
li,liVal;
liVal = lByteVal;
for
(li=
0
;li<
8
;li++)
{
SCL =
0
;
Delay
5
us();
SDA = (bit)(liVal&
0
x
8
0
);
//把数据准备好等待传送
Delay
5
us();
SCL =
1
;
Delay
5
us();
liVal <<=
1
;
}
SCL =
0
;
Delay
5
us();
SDA =
1
;
}
/*
读取一个字节并把读到的值返回
*/
uChar
8
IICReadOneByte(
void
)
{
uChar
8
li,liVal;
SCL =
0
;
SDA =
1
;
for
(li=
0
;li<
8
;li++)
{
liVal <<=
1
;
SCL =
0
;
Delay
5
us();
SCL =
1
;
Delay
5
us();
liVal = (liVal|SDA);
}
SCL =
0
;
return
liVal;
}
//Regulate控制器,这里写控制函数
void
PCF
8
5
9
1
WriteRegulate(uChar
8
lREGVal)
{
IICStart();
IICWriteOneByte(PCF
8
5
9
1
Add);
//PCF8591的地址,写控制
IICReadAck();
IICWriteOneByte(lREGVal);
//写入控制字
IICReadAck();
IICStop();
}
uChar
8
ReadDataPCF
8
5
9
1
(
void
)
{
uChar
8
liVal;
IICStart();
IICWriteOneByte(PCF
8
5
9
1
Add|
0
x
0
1
);
//PCF8591的地址,读控制
liVal = IICReadOneByte();
IICAck();
IICStop();
return
liVal;
}
//串口的程序
void
UartInit(
void
)
{
TMOD &=
0
x
0
f;
//只改变要改变的
TMOD |=
0
x
2
0
;
//设置定时器0为工作方式2
TL
1
=
0
xfd;
TH
1
=
0
xfd;
//设置波特率为9600bps
TR
1
=
1
;
//允许T1开始计数
SCON &=
0
x
5
f;
SCON |=
0
x
5
0
;
//设置串口工作在方式1,允许接收数据
}
//把读出来的值打印到计算机上
void
UartPrint(
float
iVal)
{
TI=
1
;
printf(
"测得电压为:%f\n"
,iVal);
while
(!TI);
TI=
0
;
}
收藏
邀请
举报
全部
作者的其他最新日志
•
(转)原码, 反码, 补码 详解
•
如何高效的阅读别人的代码
•
Altium 快捷键集合
•
E2PROM芯片24C02的读写程序
•
桥堆的参数选择以及滤波电容的选择
评论 (
0
个评论)
涂鸦板
您需要登录后才可以评论
登录
|
注册
评论
825cow
加为好友
给我留言
打个招呼
发送消息
热门文章
头条资讯
谷歌宣布大幅削减服务费,应用商店抽成减半至15%,小企业还想钻空子
三星为汽车安全部署TestMAX XLBIST动态系统内测试解决方案
悬赏!征集原创技术干货,Digi-Key广撒英雄帖
对话紫鸟浏览器杨金河:行业腹地出来的草根创业者 | PLG十人谈
DIY智能战车制作教程,开启你的造车之旅
周立功头条|【电源专题】MPS的AC-DC电源方案大全
新增数据手册
445058-2
AC117A-09-61
DT2-PTB-25AS12F-B3-2
MHO14FBG-FREQ-OUT3
800141FA030S5OOZU
LRA22B2GWELS
热搜器件
TPA2001D2PWPR
ERJ-14BQFR82U
VI-JNM-EX
RCM06DCMI-S288
MAX7462USA T
PT01A18-30P
推荐下载
A 3mW 12b 10MS/s Sub-Range SAR ADC
基于μC/OS-II 的温湿度测控系统设计与实现
cortex-M0lcd12864源码
OZ165
传输基本知识
X62W铣床模拟电路PLC控制方法的研究
推荐关注
《Linux内核深度解析》-- 中断控制器注册逻辑
减速机速比对照表相关内容
ESP-NOW WIFI 收发不稳定问题
Ubuntu20.04取消root账号自动登录的方法,触觉智能RK3568开发板演示
瑞芯微开发板/主板Android配置APK默认开启性能模式方法
linux系统串口终端软件显示异常解决方法,触觉智能出品