接上一篇
蓝桥杯单片机(十一)PCF8591(A/D转换)
首先看蓝桥杯单片机开发板的原理图

AOUT是模拟输出端,AGND为模拟信号地。
模拟参考电压为Vref两端的电压。
由于Vref接到了VCC(5V),所以模拟输出就是以5V为参考电压。
由于PCF8591是8位数模转换,所以

模拟量=数字量×5/255

比如0000 00001就是5/255伏。

由于进行模拟输出,所以地址只需要将第二位置1,其余置零。写程序如下

void IIC_write(uchar hw_address,uchar reg_address,uchar data)
{//hw_address为硬件地址,最低为表示读或者写 读1,写0
//reg_address为寄存器地址
//num为写入的数据IIC_Start();IIC_SendByte(hw_address&0xfe);IIC_WaitAck();IIC_SendByte(reg_address);IIC_WaitAck();IIC_SendByte(data);IIC_WaitAck();    IIC_Stop();
}   //IIC_write(硬件地址,输出地址,数字量);

最后设计一个滑动变阻器控制PCF8591输出的实验,并用数码管显示输出电压。
代码如下

#include <STC15F2K60S2.H>
#include "intrins.h"sbit SDA = P2^1;  /* 数据线 */
sbit SCL = P2^0;  /* 时钟线 */
#define uchar unsigned char
#define uint unsigned int
#define DELAY_TIME 40
#define PCF8591_address 0x90
#define Light_address 0x01
#define Move_address 0x03
#define Output_address 0x40bit IIC_WaitAck(void);
void IIC_SendAck(bit ackbit);
void IIC_Stop(void);
void IIC_Start(void);
void IIC_Delay(unsigned char i);
unsigned char IIC_RecByte(void);
void IIC_SendByte(unsigned char byt);
uchar IIC_read(uchar hw_address,uchar reg_address);
void IIC_write(uchar hw_address,uchar reg_address,uchar num);void init(void);
void SMG_output(void);
void Delay1ms(void);uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,\
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xff,0xbf};
uchar SMG[8]={20,20,20,20,20,20,20,20};
uint move=0;
void main(void)
{init();while(1){move=IIC_read(PCF8591_address,Move_address);//读取滑动变阻器IIC_write(PCF8591_address,Output_address,move);//输出move=1.9607*move;//move *(5 /255 *100) 将0-255转换到0-500,便于显示//显示电压SMG[0]=move/100+10;SMG[1]=move%100/10;SMG[2]=move%10;SMG_output();}
}void IIC_write(uchar hw_address,uchar reg_address,uchar num)
{IIC_Start();IIC_SendByte(hw_address&0xfe);IIC_WaitAck();IIC_SendByte(reg_address);IIC_WaitAck();IIC_SendByte(num);IIC_WaitAck();   IIC_Stop();
}   uchar IIC_read(uchar hw_address,uchar reg_address)
{uchar num;IIC_Start();IIC_SendByte(hw_address&0xfe);IIC_WaitAck();IIC_SendByte(reg_address);   IIC_WaitAck();IIC_Stop();IIC_Start();IIC_SendByte(hw_address|0x01);IIC_WaitAck();num=IIC_RecByte();IIC_WaitAck();IIC_Stop();   return num;
}//
void IIC_Delay(unsigned char i)
{do{_nop_();}while(i--);
}//
void IIC_Start(void)
{SDA = 1;SCL = 1;IIC_Delay(DELAY_TIME);SDA = 0;IIC_Delay(DELAY_TIME);SCL = 0;
}//
void IIC_Stop(void)
{SDA = 0;SCL = 1;IIC_Delay(DELAY_TIME);SDA = 1;IIC_Delay(DELAY_TIME);
}//
void IIC_SendAck(bit ackbit)
{SCL = 0;SDA = ackbit;                    IIC_Delay(DELAY_TIME);SCL = 1;IIC_Delay(DELAY_TIME);SCL = 0; SDA = 1;IIC_Delay(DELAY_TIME);
}//
bit IIC_WaitAck(void)
{bit ackbit;SCL  = 1;IIC_Delay(DELAY_TIME);ackbit = SDA;SCL = 0;IIC_Delay(DELAY_TIME);return ackbit;
}//
void IIC_SendByte(unsigned char byt)
{unsigned char i;for(i=0; i<8; i++){SCL  = 0;IIC_Delay(DELAY_TIME);if(byt & 0x80) SDA  = 1;else SDA  = 0;IIC_Delay(DELAY_TIME);SCL = 1;byt <<= 1;IIC_Delay(DELAY_TIME);}SCL  = 0;
}//
unsigned char IIC_RecByte(void)
{unsigned char i, da;for(i=0; i<8; i++){   SCL = 1;IIC_Delay(DELAY_TIME);da <<= 1;if(SDA) da |= 1;SCL = 0;IIC_Delay(DELAY_TIME);}return da;
}void init(void)
{P2=(P2&0X1F)|0XA0;P0=0X00;P2=(P2&0X1F)|0X80;P0=0XFF;P2=(P2&0X1F)|0XC0;P0=0XFF;P2=(P2&0X1F)|0XE0;P0=0XFF;
}void SMG_output(void)
{uchar i;for(i=0;i<8;i++){P2=(P2&0X1F)|0XC0;P0=(1 << i);P2=(P2&0X1F)|0XE0;P0=tab[SMG[i]];           Delay1ms();}P2=(P2&0X1F)|0XC0;P0=0XFF;P2=(P2&0X1F)|0XE0;P0=0XFF;
}void Delay1ms(void)        //@11.0592MHz
{unsigned char i, j;_nop_();_nop_();_nop_();i = 11;j = 190;do{while (--j);} while (--i);
}

效果如下
与实际还是有些差距,可能是VCC电压的问题。


有不懂可以评论和私信。

蓝桥杯单片机(十二)PCF8591(D/A转换)相关推荐

  1. 蓝桥杯单片机国二经验分享

    文章目录 前言 一.比赛经历 二.学习方法 1.程序题 2.客观题 总结 前言 这次在第十三届蓝桥杯中获得了国二,差一点国一还是很可惜的,PWM太久没有写忘记了很可惜,下面给大家分享一些自己的经验和方 ...

  2. 蓝桥杯第十二讲--图论【习题】

    文章目录 前言 地牢大师 题目要求 思路分析 代码 全球变暖 题目要求 思路分析 代码 单链表 题目要求 思路分析 代码 大臣的旅费 题目要求 思路分析 代码 (vectorvectorvector ...

  3. 蓝桥杯单片机——PCF8591 ADC/DAC模块

    本篇讲的单片机是第十一届蓝桥杯单片机实训的硬件设备. 蓝桥杯单片机硬件基础 PCF8591电路图: PCF8591是具有IIC总线接口的8位A/D及D/A转换器,有4路A/D转换输入,1路D/A模拟输 ...

  4. 蓝桥杯单片机学习过程记录(二十九)第八届国赛超声波测距机

    蓝桥杯单片机学习过程记录(二十九)第八届国赛超声波测距机 题目如下: 已完成 应用的内容: EEPROM. 定时器.数码管 led灯,独立按键 DA电压输出 超声波测距 /* ------------ ...

  5. 蓝桥杯单片机——第十二届蓝桥杯单片机第一场省赛

    蓝桥杯单片机--第十二届蓝桥杯单片机第一场省赛 目录 蓝桥杯单片机--第十二届蓝桥杯单片机第一场省赛 一.赛题分析 二.问题总结 三.代码 一.赛题分析 前两天实验室的学妹把开发板还给我了,刚好今天没 ...

  6. 蓝桥杯单片机之PCF8591模块的使用

    蓝桥杯单片机之PCF8591模块的使用 简述 原理图: 引脚定义: 相关地址 IIC寻址设备地址 控制地址 IIC时序分析 数模转换D/A 模数转换 代码: 一:光敏电阻和可变电阻的AD转换,S4控制 ...

  7. 蓝桥杯单片机 赛后资料整理——NE555芯片模块与第十届省赛的总结

    蓝桥杯单片机 赛后资料整理--NE555芯片模块 电路原理 模块特性 驱动方法 代码模板 个人总结 本文适用于 CT107D竞赛板+ IAP15转接板 电路原理 模块特性 NE555是一种时钟芯片,输 ...

  8. 蓝桥杯单片机省赛第十一届赛题二

    文章目录 前言 一.题目​​ 二.代码部分 1.IIC.C 2.IIC.H 3.onewire.h 4.onewire.h 5. main.c 总结 前言 蓝桥杯单片机--第十一届省赛赛题二解析 今年 ...

  9. 【第十四届蓝桥杯单片机组客观题1】

    第十四届蓝桥杯单片机组客观题1 以下客观题来自4T测评的模拟题,希望可以帮助到大家,加油丫 1.C 若希望将IAP15F2K61S2单片机的IO口输出电流能力较强,应将IO配置为( )模式. A : ...

  10. 【蓝桥杯单片机第十二届国赛真题】

    [蓝桥杯单片机第十二届国赛真题] 文章目录 [蓝桥杯单片机第十二届国赛真题] 前言 一.真题 二.源码 前言 有幸进入国赛,为自己大学最后一个比赛画上完满的句号^@^ 下面为蓝桥杯单片机第十二届国赛程 ...

最新文章

  1. 如何编辑Subversion中已提交的日志消息?
  2. Scala 学习笔记(1)
  3. 用python画烟花-用python做一个烟花show
  4. Golang 优化之路-空结构[转]
  5. Powershell记录2
  6. mysql 导入错误_mysql导入sql文件报错 ERROR 2013 2006 2002
  7. 第三课 泛型+反射封装数据库访问层 2019-04-02
  8. 运算符——Python
  9. 教你高效管理CrossOver容器
  10. 注册测绘师20180301-测绘基准
  11. android 锁屏界面来电话,android锁屏界面短信解锁指向怎么修改?
  12. Linux 最全的添加开机启动方法
  13. java简繁体互转(附源码和字典)
  14. 什么是云?什么是云服务?什么是云计算?
  15. android双卡切换流量代码,双卡双待手机流量怎么切换 方法有哪些【图文】
  16. 大数据来临,商业银行面对合规挑战!
  17. 《深入理解java虚拟机》学习笔记之虚拟机即时编译详解
  18. 观呼吸缓解夏日烦躁情绪
  19. vuex两个问题:vuex__WEBPACK_IMPORTED_MODULE_1__.default.store is not a constructor,“$store“ is not defin
  20. 安卓手机 忘记 锁屏密码

热门文章

  1. 清除90天苹果充值记录_王者荣耀开启安卓、苹果系统数据互转
  2. GoLand:Cannot resolve symbol
  3. The client-side rendered virtual DOM tree is not matching server-rendered content.
  4. 记录Win10因为管理员权限而出现的访问COM口被占用的问题
  5. 迅捷路由器造成计算机无法上网,迅捷无线路由器设置好却不能上网
  6. php 处理eml,PHP 解析Maildir 邮件格式(eml文件)
  7. linux服务器如何查看mac地址,linux如何查看mac地址_查看mac地址 linux_linux查看mac地址...
  8. Window 时间同步 地址
  9. 亚马逊云科技——户外广告传媒行业数字化转型的摆渡者
  10. www.jb51.com脚本之家漂亮菜单