蓝桥杯模块学习16——PCF8591(深夜学习——单片机)

news2024/11/24 0:08:38

一、硬件电路:

1、蓝桥杯板子上的电路:

(1)AIN0-3:四种模拟量的输入口,AIN1为光敏电阻控制电压输入,AIN3为电位器控制电压输入

(2)A0-2:决定设备的地址码

(3)SCL、SDA:分别为IIC通信的时钟线和数据线

二、通讯方式(IIC协议)

1、通讯协议

发送数据:起始信号——》发送地址(末位为0)——》等待应答——》发送控制字节——》等待应答——》发送数据字节(如果我们只需要读取数据字节而不用发送数据字节,我们可以在发送完控制字节的应答后就发送终止信号)——》等待应答——》终止信号(或者起始信号开始下一个地址的读写)

读取数据::起始信号——》发送地址(末位为1)——》等待应答——》接收数据字节——》产生应答(产生“1”非应答信号表示设备停止发送数据字节,反之继续发送)——》终止信号

2、地址码:

3、控制字节:

(1)第七位:固定为0

(2)第六位:模拟输出使能标志位,为“1”时,模拟输出使能,即为D/A功能;为“0”时,数字输出,即为A/D功能

(3)第五、四位:模拟输入模式选择位

(4)第三位:固定为零

(5)第二位:自动增加标志位

(6)第一、零位:模拟输入口选择位

4、数据字节:

由电路可知,VAGND = 0 ,VREF = VCC = 5V,输出电压 = 接收到的数据 * 5 /256

三、PCF8591实验:

1、代码思路:

定时器1,数码管显示——》独立按键——》PCF8591

2、官方参考代码+自己写的读取与写入代码

#ifndef _IIC_H
#define _IIC_H

#include <STC15F2K60S2.H>
#include "intrins.h"
#define u8 unsigned char
#define u16 unsigned int
sbit SDA = P2^1;
sbit SCL = P2^0;

void IIC_Start(void); 
void IIC_Stop(void);  
bit IIC_WaitAck(void);  
void IIC_SendAck(bit ackbit); 
void IIC_SendByte(unsigned char byt); 
unsigned char IIC_RecByte(void); 
void DAC_Write(u8 c_data);
u8 DAC_Read();
#endif
#include "iic.h"

#define DELAY_TIME 5

//
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 DAC_Write(u8 c_data)
{
    IIC_Start();
    IIC_SendByte(0x90);
    IIC_WaitAck();
    IIC_SendByte(c_data);
    IIC_WaitAck();
    IIC_Stop();
}
/*
  读取数据字节
*/
u8 DAC_Read()
{
    u8 dac_temp;
    IIC_Start();
    IIC_SendByte(0x91);
    IIC_WaitAck();
    dac_temp = IIC_RecByte();
    IIC_SendAck(1);
    IIC_Stop();
    return dac_temp;
}

3、主函数:

#include <STC15F2K60S2.H>
#include <stdio.H>
#include "iic.h"
#define u8 unsigned char
#define u16 unsigned int    
code unsigned char Seg_Table[] = 
{
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90, //9
0x88, //A
0x83, //b
0xc6, //C
0xa1, //d
0x86, //E
0x8e //F
};

//数码管
u16 seg_dealy;
u8 COD[8],COT[9],PSI;
//PCF8591
u8 AIN=1,PCF8591_dat=0;
//独立按键
u8 key_dealy;
u8 mode;
void Clsoe_All();
void SEG_Proc();
void Timer1_Init(void);
void Key_Proc();
void main()
{
    Clsoe_All();
    Timer1_Init();
    while(1)
    {
        SEG_Proc();
        Key_Proc();
    }
}

/****************定时器*************************/
void SEG_Show(u8 COD,u8 PSI);
void Timer1_Isr(void) interrupt 3
{
    if(seg_dealy++ == 397)seg_dealy = 0;
    if(key_dealy++ == 19) key_dealy = 0;
    
    SEG_Show(COD[PSI],PSI);
    if(PSI++ == 7)PSI = 0;
}

void Timer1_Init(void)        //1毫秒@12.000MHz
{
    AUXR &= 0xBF;            //定时器时钟12T模式
    TMOD &= 0x0F;            //设置定时器模式
    TL1 = 0x18;                //设置定时初始值
    TH1 = 0xFC;                //设置定时初始值
    TF1 = 0;                //清除TF1标志
    TR1 = 1;                //定时器1开始计时
    ET1 = 1;                //使能定时器1中断
    EA = 1;
}

/****************数码管*************************/
void SEG_TSL(u8* input,u8* output)
{
    u8 i=0;
    for(i=0;i<8;i++)
    {
        switch(input[i])
        {
            case '0':output[i] = Seg_Table[0];break;
            case '1':output[i] = Seg_Table[1];break;
            case '2':output[i] = Seg_Table[2];break;
            case '3':output[i] = Seg_Table[3];break;
            case '4':output[i] = Seg_Table[4];break;
            case '5':output[i] = Seg_Table[5];break;
            case '6':output[i] = Seg_Table[6];break;
            case '7':output[i] = Seg_Table[7];break;
            case '8':output[i] = Seg_Table[8];break;
            case '9':output[i] = Seg_Table[9];break;
            case '-':output[i] = ~0x40;break;
            default:output[i] = 0xff;
        }
    }
}

void SEG_Show(u8 COD,u8 PSI)
{
    //消隐
    P0 = 0xff;
    P2 = P2 & 0x1f | (0x70<<1);
    P2 &= 0x1f;
    //位选
    P0 = 0x01<<PSI;
    P2 = P2 & 0x1f | (0x60<<1);
    P2 &= 0x1f;    
    //段选
    P0 = COD;
    P2 = P2 & 0x1f | (0x70<<1);
    P2 &= 0x1f;
}

/**************按键**************************/
/*
    独立按键按键检测
*/
u8 D_key()
{
    u8 i=0;
    for(i=0;i<4;i++)
    {
        if((P3 & (0x08>>i)) == 0)
            return i+4;
    }
    return 0;
}
/***********************************************/
/*
    关闭无关设备
*/
void Clsoe_All()
{
    //关闭蜂鸣器和继电器
    P0 = 0x00;
    P2 = P2 & 0x1f | (0x50<<1);
    P2 &= 0x1f;
    //关闭LED
    P0 = 0xff;
    P2 = P2 & 0x1f | (0x40<<1);
    P2 &= 0x1f;
}

void SEG_Proc()
{
    if(seg_dealy)return;
    seg_dealy = 1;
    
    sprintf(COT,"-%1u-%5u",(u16)AIN,(u16)PCF8591_dat);
    SEG_TSL(COT,COD);
}

void Key_Proc()
{
    u8 key_now,key_up;
    static u8 key_old;
    if(key_dealy)return;
    key_dealy = 1;
    
    key_now = D_key();
    key_up = ~key_now & (key_now ^ key_old);
    key_old = key_now;
    
    if(key_up == 4)
    {
        mode++;
        if(mode == 2) 
            mode = 0;
    }
    if(mode == 0)
    {
        AIN = 1;
        DAC_Write(AIN);
        PCF8591_dat = DAC_Read();
    }
    else if(mode == 1) 
    {
        AIN = 3;
        DAC_Write(AIN);
        PCF8591_dat = DAC_Read();
    }
        
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/344198.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SSTI漏洞原理及渗透测试

模板引擎&#xff08;Web开发中&#xff09; 是为了使 用户界面 和 业务数据&#xff08;内容&#xff09;分离而产生的&#xff0c;它可以生成特定格式的文档&#xff0c; 利用模板引擎来生成前端的HTML代码&#xff0c;模板引擎会提供一套生成HTML代码的程序&#xff0c;之后…

TensorRT的Python接口解析

TensorRT的Python接口解析 文章目录TensorRT的Python接口解析4.1. The Build Phase4.1.1. Creating a Network Definition in Python4.1.2. Importing a Model using the ONNX Parser4.1.3. Building an Engine4.2. Deserializing a Plan4.3. Performing Inference点此链接加入…

科技巨头争相入局,卫星通信领域将迎来怎样的发展?

近年来&#xff0c;全球卫星通信产业进入了一个高速发展的阶段。与卫星通信相关的新技术和新应用不断出现&#xff0c;成为了媒体报道的热点&#xff0c;也引起了公众的广泛关注。尤其是刚刚过去的2022年&#xff0c;华为和苹果公司分别发布了搭载卫星通信技术的手机&#xff0…

万丈高楼平地起:Linux常用命令

目录 系统管理命令 man命令 ls命令 cd命令 useradd命令 passwd命令 free命令 whoami命令 ps命令 date命令 pwd命令 shutdown命令 文件目录管理命令 touch命令 cat命令 mkdir命令 rm命令 cp命令 mv命令 find命令 more指令 less指令 head指令 tail指令 …

基于HTML实现浪漫情人节表白代码(附源代码)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

【spark】第三章——SparkSQL

文章目录1. SparkSQL 概述1.1 SparkSQL 是什么1.2 Hive and SparkSQL1.3 SparkSQL 特点1.3.1 易整合1.3.2 统一的数据访问1.3.3 兼容 Hive1.3.4 标准数据连接1.4 DataFrame 是什么1.5 DataSet 是什么2. SparkSQL 核心编程2.1 新的起点2.2 DataFrame2.2.1 创建 DataFrame2.2.2 S…

MVC架构 —— 理解 Dao 层和 Service 层

MVC 框架念叨了千百遍&#xff0c;但是对于它的理解还是停留在概念上。 作为一种经典架构设计典范&#xff0c;MVC 在日新月异的软件行业却能常青数十年&#xff0c;一定有其独特的魅力。 一、Dao 层和 Service 层的概念 Dao 是 Data Access Object &#xff08;数据访问对象&…

FPGA纯verilog实现任意分辨率视频输出显示,高度贴近真实项目,提供工程源码和技术支持

目录1、前言2、视频显示的VESA协议3、VESA协议的bug4、FPGA实现任意分辨率视频输出显示5、FDMA实现数据缓存6、vivado工程详解7、上板调试验证并演示8、福利&#xff1a;工程代码的获取1、前言 本设计使用纯Verilog代码实现&#xff0c;重点在于基于AXI协议的DDR控制器的运用&…

SpringBoot 整合EasyExcel详解

一、概述 Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存&#xff0c;poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题&#xff0c;但POI还是有一些缺陷&#xff0c;比如07版Excel解压缩以及解压后存储都是在内…

内网渗透-src挖掘-互联网打点到内网渗透-2023年2月

1、通过信息搜集&#xff0c;发现目标有一个互联网访问的骑士cms 2、发现该系统骑士cms版本为6.0.20&#xff0c;通过搜索&#xff0c;发现骑士cms < 6.0.48存在任意文件包含漏洞 /Application/Common/Controller/BaseController.class.php 该文件的assign_resume_tpl函数…

字节面试惨败,闭关修炼再战美团(Android 面经~)

作者&#xff1a;王旭 前言 本人从事Android 开发已经有5年了&#xff0c;受末日寒气影响&#xff0c;被迫在家休整&#xff0c;事后第一家选择字节跳动面试&#xff0c;无奈的被面试官虐得“体无完肤”&#xff0c;好在自己并未气馁&#xff0c;于是回家开始回家进行闭关修炼…

使用红黑树模拟实现map和set

在STL的源代码中&#xff0c;map和set的底层原理都是红黑树。但这颗红黑树跟我们单独写的红黑树不一样&#xff0c;它需要改造一下&#xff1a; 改造红黑树 节点的定义 因为map和set的底层都是红黑树。而且map是拥有键值对pair<K,V>的&#xff0c;而set是没有键值对&a…

教育行业需要什么样的数字产品?

数字化转型的浪潮已经席卷了各行各业&#xff0c;不仅出现在互联网、电商、建筑等行业&#xff0c;还应用在了教育行业。数字化的教育ERP软件能够在满足学校需求的基础上&#xff0c;帮助学校完善各类工作流程&#xff0c;提高工作效率。 对于一个拥有多个校区&#xff0c;上万…

ChatGPT 也太火了吧 ...

最近 ChatGPT 太火了&#xff0c;微信指数 ChatGPT 关键词飙升。GitHub 上也不例外&#xff0c;最近热门项目都是 ChatGPT 项目。后续会陆续更新 ChatGPT 好玩的开源项目&#xff0c;本期是本周登上热榜的 Repo&#xff0c;请查收。本期推荐开源项目目录&#xff1a;1. 对 Chat…

ms17-010(永恒之蓝漏洞复现)

✅作者简介&#xff1a;CSDN内容合伙人、信息安全专业在校大学生&#x1f3c6; &#x1f525;系列专栏 &#xff1a;HW-2023-漏洞复现 &#x1f4c3;新人博主 &#xff1a;欢迎点赞收藏关注&#xff0c;会回访&#xff01; &#x1f4ac;舞台再大&#xff0c;你不上台&#xff…

Inception-Resnet-v1、Inception-Resnet-v2学习笔记

Inception-Resnet-v1、Inception-Resnet-v2来自2016年谷歌发表的这篇论文&#xff1a;Inception-v4 Inception-ResNet and the Impact of Residual Connections on Learning&#xff0c;附论文链接&#xff1a; [1602.07261] Inception-v4, Inception-ResNet and the Impact o…

【思维模型】概率思维的价值:找到你的人生算法!打开你的人生格局!实现认知跃迁!

把同样公平的机会放在放在很多人面前,不同的人生算法,会得到迥然不同的结果。 概率思维是什么? 【ChatGPT】概率思维是一种通过使用数学模型来思考和评估不确定性事件的方法。它通过计算不同可能性的概率来预测事件的结果,并评估风险和机会。 概率思维的价值在于它可以帮…

CSS样式表继承和优先级

CSS样式表继承 要想了解css样式表的继承&#xff0c;我们先从文档树&#xff08;HTML DOM&#xff09;开始。文档树由HTML元素组成。 文档树和家族树类似&#xff0c;也有祖先、后代、父亲、孩子和兄弟_。 那么CSS样式表继承指的是&#xff0c;特定的CSS属性向下传递到子孙元…

智能三子棋(人机大战)—— 你会是最终赢家吗?万字讲解让你实现与自己对弈

魔王的介绍&#xff1a;&#x1f636;‍&#x1f32b;️一名双非本科大一小白。魔王的目标&#xff1a;&#x1f92f;努力赶上周围卷王的脚步。魔王的主页&#xff1a;&#x1f525;&#x1f525;&#x1f525;大魔王.&#x1f525;&#x1f525;&#x1f525; ❤️‍&#x1…

2023年湖北建设厅七大员八大员报名怎么收费呢?

建设厅七大员八大员全国统一报名网站&#xff0c;证书全国通用&#xff0c;无需调转&#xff0c;这点还是很方便的&#xff0c;所有在湖北考的证书全国都能用呢。 八大员报考机构很多&#xff0c;收费也是层次不齐&#xff0c;这里需要提醒大家注意的是&#xff0c;咨询八大员的…