文章目录

  • 前言
  • 实例程序:
    • 题目
    • main.c
    • iic.c
    • iic.h

前言

蓝桥杯单片机开发板CT107D中的板载A/D转换芯片PCF8591可进行ADC和DAC的转换,该芯片有4个输入通道;

在该开发板中,PCF8591芯片的AIN3引脚接滑动变阻器Rb2,通过旋转滑动变阻器Rb2,则可改变AIN3引脚的输入电压。
PCF8591芯片的AIN1引脚接光敏电阻RD1,通过改变光敏电阻RD1的进光量,则可改变AIN1引脚的输入电压。

PCF8591芯片通过IIC通信协议与单片机进行数据传输
该芯片的地址为 1001000,若单片机进行写操作,则发送的地址为0x90;若单片机进行读操作,则发送的地址为0x91。

滑动变阻器和光敏电阻两部分的代码基本一样,
唯一的不同就是单片机在给芯片发送指令时,滑动变阻器为0x43,光敏电阻为0x41。

实例程序:

题目

1.改变光敏电阻RD1的进光量,读出PCF8591上AIN1引脚所输入的电压值
2.其中数码管前两位显示电压值,后三位显示从PCF8591上读到的数据
3.改变光敏电阻RD1的进光量,数码管显示数字也会发生变化

main.c

//@mzw
//改变光敏电阻RD1的进光量,读出PCF8591上AIN1引脚所输入的电压值
//其中数码管前两位显示电压值,后三位显示从PCF8591上读到的数据
//改变光敏电阻RD1的进光量,数码管显示数字也会发生变化
#include<reg52.h>
#include<iic.h>
#include<intrins.h>
#include<absacc.h>sbit hc138_A=P2^5;
sbit hc138_B=P2^6;
sbit hc138_C=P2^7;unsigned char shuzi[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0-9
unsigned char shuzi1[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//0-9//含小数点unsigned char RD1 = 0;    //从8591芯片中读出的数据,范围0-256
int V = 0;         //由RD1转换后的电压值*10 范围:0-50v
/*****配置138译码器*****/
void HC138(unsigned int n)
{switch(n){case 4:hc138_A=0 ; hc138_B=0 ; hc138_C=1; break;case 5:hc138_A=1 ; hc138_B=0 ; hc138_C=1; break;case 6:hc138_A=0 ; hc138_B=1 ; hc138_C=1; break;case 7:hc138_A=1 ; hc138_B=1 ; hc138_C=1; break;}
}
/*****延时函数*****/
void delay(unsigned int k)
{while(k--);
}/*****数码管显示函数*****/
void Display()
{char x = 0x01;int i = 0;for(i = 1;i<=8 ;i++){HC138(6);P0 = x;x = _crol_(x,1);HC138(7);P0 = 0xff;delay(20); //数码管消隐放到这个地方好一点switch (i){case 1 :P0 = shuzi1[V/10]; break;case 2 :P0 = shuzi[V%10]; break;case 3 :P0 = 0xff; break;case 4 :P0 = 0xff; break;case 5 :P0 = 0xff; break;case 6 :P0 = shuzi[RD1/100]; break;case 7 :P0 = shuzi[RD1/10%10]; break;case 8 :P0 = shuzi[RD1%10]; break;}delay(500);P0 = 0xff;}
}/***** ADC相关   *****/
//向PCF8591发送信号,准备读取0x41的数据
void init_pcf8591(void)
{IIC_Start();IIC_SendByte(0x90);IIC_WaitAck();IIC_SendByte(0x41);  //PCF8591的通道1,接光敏电阻RD1,若是滑动变阻器则为0x43IIC_WaitAck();IIC_Stop();
}
//读取数据
unsigned char adc_pcf8591(void)
{unsigned char temp;IIC_Start();IIC_SendByte(0x91);IIC_WaitAck();temp = IIC_RecByte();IIC_Ack(0);IIC_Stop();return temp;
}void main()
{while(1){init_pcf8591();           //向PCF8591发送信号,准备读取0x03的数据RD1 = adc_pcf8591();      //读取数据V = RD1 * 5 * 10 / 255 ; //电压转换Display();//显示函数}
}

iic.c

/*程序说明: IIC总线驱动程序软件环境: Keil uVision 4.10 硬件环境: CT107单片机综合实训平台 8051,12MHz日    期: 2011-8-9该程序为蓝桥杯单片机比赛官方所提供的参考代码
*/#include "reg52.h"
#include "intrins.h"#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();}    #define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1//总线引脚定义
sbit SDA = P2^1;  /* 数据线 */
sbit SCL = P2^0;  /* 时钟线 *///总线启动条件
void IIC_Start(void)
{SDA = 1;SCL = 1;somenop;SDA = 0;somenop;SCL = 0;
}//总线停止条件
void IIC_Stop(void)
{SDA = 0;SCL = 1;somenop;SDA = 1;
}//应答位控制
void IIC_Ack(bit ackbit)
{if(ackbit) {   SDA = 0;}else {SDA = 1;}somenop;SCL = 1;somenop;SCL = 0;SDA = 1; somenop;
}//等待应答
bit IIC_WaitAck(void)
{SDA = 1;somenop;SCL = 1;somenop;if(SDA)    {   SCL = 0;IIC_Stop();return 0;}else  { SCL = 0;return 1;}
}//通过I2C总线发送数据
void IIC_SendByte(unsigned char byt)
{unsigned char i;for(i=0;i<8;i++){   if(byt&0x80) {   SDA = 1;}else {SDA = 0;}somenop;SCL = 1;byt <<= 1;somenop;SCL = 0;}
}//从I2C总线上接收数据
unsigned char IIC_RecByte(void)
{unsigned char da;unsigned char i;for(i=0;i<8;i++){   SCL = 1;somenop;da <<= 1;if(SDA) da |= 0x01;SCL = 0;somenop;}return da;
}

iic.h

#ifndef _IIC_H
#define _IIC_H//函数声明
void IIC_Start(void);
void IIC_Stop(void);
void IIC_Ack(bit ackbit);
void IIC_SendByte(unsigned char byt);
bit IIC_WaitAck(void);
unsigned char IIC_RecByte(void); #endif
程序中iic.c 和 iic.h文件为蓝桥杯单片机比赛所提供的的参考程序

蓝桥杯单片机-ADC-A/D转换-测量PCF8591中AIN1通道(光敏电阻RD1)的电压相关推荐

  1. 蓝桥杯单片机-ADC-A/D转换-测量PCF8591中AIN3通道(滑动变阻器Rb2)的电压

    文章目录 前言 实例程序: 题目 main.c iic.c iic.h 前言 蓝桥杯单片机开发板CT107D中的板载A/D转换芯片PCF8591可进行ADC和DAC的转换,该芯片有4个输入通道; 在该 ...

  2. 蓝桥杯单片机比赛学习:9、PCF8591的基本原理和使用方法

    前面一节我们说了PWM呼吸灯的基本原理和使用方法,下面我们来看第二个模块,也是蓝桥杯单片机比赛中常考的一个模块--PCF8591.我主页有其他模块的使用方法和基本原理(2条消息) Do My Best ...

  3. 蓝桥杯单片机-DAC-用板载板载PCF8591芯片在D/A引脚上输出指定的电压

    文章目录 题目 main.c iic.c iic.h 题目 1.控制板载PCF8591芯片在D/A引脚上输出指定的电压 2.数码管前三位显示输入数据0-255,后两位显示输出的电压值 3.按下按键S4 ...

  4. 蓝桥杯单片机篇:NE555 频率测量

    主要是配置定时器0为外部脉冲计数模式 main.c #include "mycode.h" unsigned char key_value=0,len=0; unsigned sh ...

  5. 蓝桥杯单片机比赛学习:11、频率测量的基本原理

    在蓝桥杯单片机比赛中,频率测量一次都没考过,但是也不排除不考的可能.频率测量相对前面的几个模块来说相对简单,只需要两个定时器就可以实现. 频率测量的基本原理 产生脉冲的主要元件是555定时器.555定 ...

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

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

  7. 蓝桥杯单片机学习13——NE555方波发生器频率测量

    NE555 简介 引脚图 原理图 真值表 工作原理 频率测量原理 定时器测量频率方法 代码实现 总结(一堆废话) 简介 NE555是一种高度稳定的控制器,内部用三个阻值为5KΩ的电阻分压,因此叫做55 ...

  8. 蓝桥杯单片机----NE555频率测量

    NE555 (Timer IC)为8脚时基集成电路,NE555是属于555系列的计时IC的其中的一种型号,555系列IC的接脚功能及运用都是相容的,只是型号不同的因其价格不同其稳定度.省电.可产生的振 ...

  9. 蓝桥杯单片机第十三届第二场

    第十三届蓝桥杯单片机第二场 文章目录 第十三届蓝桥杯单片机第二场 前言 一.赛题分析 二.程序调试步骤 三.部分源程序 主函数部分 DAC处理函数 数码管处理函数 ADC处理函数 超声波处理函数 LE ...

  10. 蓝桥杯单片机 | 特训案例【进阶06】基于PCF8591的DAC模拟电压输出

    [1]题目要求 新建工程,以I/O模式编写代码,在CT107D单片机综合训练平台上,实现以下功能: 1.将IIC总线的底层驱动代码文件正确移植到工程中. 2.将J5配置BTN模式,把S4设置为独立按键 ...

最新文章

  1. 两道面试题,带你解析Java类加载机制
  2. 同时进科俩博士,一个被围着宠着、一个却被当成空气;凭什么?
  3. STM32下SysTick的一个容易发生的错误,时钟频率设置
  4. 结合 live-reload 实现自动刷新
  5. 特征工程系列之降维:用PCA压缩数据
  6. android 遮罩 进度条,bootstrap创建带遮罩层的进度条
  7. RS232和RS485
  8. 使用委托(事件)或中介设计模式实现多个Windows窗体文本框的同步
  9. 手游接入Facebook的那些坑
  10. 【Kafka】01 生产者
  11. (转)用Javascript获取页面元素的位置
  12. 安装Keil uVision5 破解失败
  13. 2017-10-02清北模拟赛
  14. JVM调优实践:记录初次JVM调优经历
  15. JAVA-MYSQL-SSH酒店民宿客房管理系统
  16. 【Endnote X9服务器运行失败】
  17. 信号完整性(SI)概述
  18. Heiro试用失败记
  19. 迷宫最短路径问题(数据结构4.4.3 拓展)
  20. 博士毕业答辩会上的感言——余子濠

热门文章

  1. 不需要K值实现打开链接、扫码即可在手机、电脑端弹出QQ添加好友框的方法
  2. 201771010112罗松《面向对象程序设计(java)》第十三周学习总结
  3. 如何用golang远程控制浏览器
  4. python毕业设计论文-基于Python的网络爬虫的设计与实现.doc
  5. 关于修复弹窗被360弹窗拦截器拦截的问题的解决案例的分享
  6. 15分钟用ppt制作桌面整理四格壁纸
  7. 运营简史:互联网运营的20年发展与演变
  8. 区块链知识转载博文1: 共识算法之争(PBFT,Raft,PoW,PoS,DPoS,Ripple)
  9. iOS开发 ----- 加载动画之牛顿摆的实现
  10. 潮流计算程序————支路功率计算与输出程序