首页 > 其他分享 >蓝桥杯单片机PCF8951数模转换测光敏电阻和滑动变阻器

蓝桥杯单片机PCF8951数模转换测光敏电阻和滑动变阻器

时间:2024-03-17 17:32:29浏览次数:27  
标签:Seg char 光敏电阻 IIC void unsigned 蓝桥 Key 数模转换

无论怎么调试,数码管只显示000,让人非常苦恼。下面是代码,请各位大佬指点

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>这是main函数

/* 头文件声明区 */
#include <STC15F2K60S2.H>//单片机寄存器专用头文件
#include "Init.h"//初始化底层驱动专用头文件
#include "Key.h"//按键底层驱动专用头文件
#include "Seg.h"//数码管底层驱动专用头文件
#include "Led.h"//Led底层驱动专用头文件
#include "iic.h"//数模转换底层驱动专用头文件
#include "iic.h"

/* 变量声明区 */
unsigned char Key_Val,Key_Down,Key_Up,Key_Old;//按键专用变量
unsigned char Key_Slow_Down;//按键减速专用变量
unsigned char Seg_Buf[8]={10,10,10,10,10,10,10,10};//数码管显示数据存放数据
unsigned char Seg_Point[8]={0,0,0,0,0,0,0,0};//数码管小数点存放数据
unsigned char Seg_Pos;//数码管扫描专用专用变量
unsigned char Seg_Slow_Down;//数码管减速专用变量
unsigned char ucLed[8]={0,0,0,0,0,0,0,0};//Led显示数据存放数据
unsigned dat,dat2;
bit Seg_Disp_Mode;//数码管显示模式变量 0-电压显示界面 1-电压输出界面
float Voltage;//实时电压变量

/* 键盘处理函数 */
void Key_Proc()
{
    if(Key_Slow_Down)return;
    Key_Slow_Down=1;//键盘减速程序
    
    Key_Val=Key_Read();//实时读取键码值
    Key_Down=Key_Val&(Key_Old^Key_Val);//捕捉按键下降沿
    Key_Up=~Key_Val&(Key_Old^Key_Val);//捕捉按键上升沿
    Key_Old=Key_Val;//辅助扫描变量
}

/* 信息处理函数 */
void Seg_Proc()
{
    if(Seg_Slow_Down)return;
    Seg_Slow_Down=1;//数码管减速程序
    
    
    dat=AD_Read(0x43);
    
    Seg_Buf[0]=dat/100%10;
    Seg_Buf[1]=dat/10%10;
    Seg_Buf[2]=dat%10;
}

/* 其他显示函数 */
void Led_Proc()
{

}

/* 定时器0中断初始化函数 */
void Timer0Init(void)        //1微秒@12.000MHz
{
    AUXR &= 0x7F;        //定时器时钟12T模式
    TMOD &= 0xF0;        //设置定时器模式
    TL0 = 0xFF;        //设置定时初值
    TH0 = 0xFF;        //设置定时初值
    TF0 = 0;        //清除TF0标志
    TR0 = 1;        //定时器0开始计时
    ET0=1;          //定时器0中断打开
    EA=1;           //总中断打开
}

/* 定时器0中断函数 */
void Timer0Server()  interrupt 1
{
    if(++Key_Slow_Down==10){Key_Slow_Down=0;}//键盘减速专用
    if(++Seg_Slow_Down==500){Seg_Slow_Down=0;}//数码管减速专用
    if(++Seg_Pos==8){Seg_Pos=0;}//数码管显示专用
    Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos],Seg_Point[Seg_Pos]);
    Led_Disp(Seg_Pos,ucLed[Seg_Pos]);
}

/* Main */
void main()
{
    System_Init();
    Timer0Init();
    while(1)
    {
        Key_Proc();
        Seg_Proc();
        Led_Proc();
    }
}

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>这是IIC底层驱动

#include "iic.h"

#define DELAY_TIME 5

#include "reg52.h"
#include "intrins.h"

sbit SDA = P2^1;
sbit SCL = P2^0;

//I2C总线内部延时函数
void IIC_Delay(unsigned char i)
{
    do{_nop_();}
    while(i--);        
}

//I2C总线启动信号
void IIC_Start(void)
{
    SDA = 1;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 0;
    IIC_Delay(DELAY_TIME);
    SCL = 0;    
}

//I2C总线停止信号
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;
}

//I2C总线发送一个字节数据
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;  
}

//I2C总线接收一个字节数据
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;    
}

//函数名:ADC转换函数
//入口参数:要进行转换的通道控制位
//返回值:ADC转换的数值
//函数功能:对指定的通道进行ADC转换,函数返回转换的数值
unsigned char AD_Read(unsigned char addr)
{
    unsigned char temp;
    
    IIC_Start();
    IIC_SendByte(0x90);
    IIC_WaitAck();
    
    IIC_SendByte(addr);
    IIC_WaitAck();
    
    IIC_Start();
    IIC_SendByte(0x91);
    IIC_WaitAck();
    temp=IIC_RecByte();
    IIC_SendAck(1);
    IIC_Stop();
    return temp;
}

void DA_Write(unsigned char dat)
{
    IIC_Start();
    IIC_SendByte(0x90);
    IIC_WaitAck();
    IIC_SendByte(0x41);
    IIC_WaitAck();
    IIC_SendByte(dat);
    IIC_WaitAck();
    IIC_Stop();
}
 

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

已经确认除此之外没有错误了,跪谢各位大佬

标签:Seg,char,光敏电阻,IIC,void,unsigned,蓝桥,Key,数模转换
From: https://blog.csdn.net/2301_79948340/article/details/136785705

相关文章

  • 【洛谷 P8661】[蓝桥杯 2018 省 B] 日志统计 题解(滑动窗口+优先队列+双端队列+集合)
    [蓝桥杯2018省B]日志统计题目描述小明维护着一个程序员论坛。现在他收集了一份“点赞”日志,日志共有NNN行。其中每一行的格式是tsid,表示在......
  • 【洛谷 P8602】[蓝桥杯 2013 省 A] 大臣的旅费 题解(图论+深度优先搜索+树的直径+链式
    [蓝桥杯2013省A]大臣的旅费题目描述很久以前,T王国空前繁荣。为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市。为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首都直接或者通过其他大城市间接到达。同......
  • 蓝桥杯单片机STC15F2K60S2第十三届省赛代码详细讲解(附完整代码)
     一、前言            在蓝桥杯单片机的比赛当中,很多传感器都是会经常使用到的,比如说DS18B20和DS1302等,都是会经常用到的,所以我们要把这些传感器都学会一下。在省十三的蓝桥杯单片机题目中,我自己也写了一下这个代码,可能有些地方会有点问题,但是大致的功能还是能......
  • 蓝桥杯算法集训 - Week 2:双指针、归并排序、多路归并
    蓝桥杯算法集训-Week2本系列随笔用于整理AcWing题单——《蓝桥杯集训·每日一题2024》的系列题型及其对应的算法模板。一、双指针Ⅰ、代码模板常见问题分类:(1)对于一个序列,用两个指针维护一段区间(2)对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作f......
  • 会议室预约系统优化(蓝桥杯)
    文章目录会议室预约系统优化问题描述差分会议室预约系统优化问题描述假设你是一家大型企业的IT工程师,企业内有n个会议室,每天都有多个部门预约会议室进行会议。你的任务是优化现有的会议室预约系统。你需要设计一个程序来支持以下两种操作:预约会议室:给定一......
  • 蓝桥杯 递增三元组
    Problem:蓝桥杯递增三元组文章目录思路解题方法复杂度前缀和Code二分Code双指针Code思路这是一个关于数组的问题,我们需要找到一个递增的三元组。这个三元组由三个数组中的元素组成,每个数组提供一个元素,并且这三个元素满足递增的关系。解题方法我们可以使用......
  • [蓝桥杯 2017 国 C] 合根植物(P8654)
    #include<bits/stdc++.h>#defineendl'\n'usingll=longlong;typedefunsignedlonglongull;usingnamespacestd;voidGordenGhost();intn,m;map<int,int>fa;intfindB(intx){if(fa[x]==x)returnx;returnfa[x]=findB(......
  • 贪心算法(算法竞赛、蓝桥杯)--均分纸牌
    1、B站视频链接:A30贪心算法P1031[NOIP2002提高组]均分纸牌_哔哩哔哩_bilibili题目链接:[NOIP2002提高组]均分纸牌-洛谷#include<bits/stdc++.h>usingnamespacestd;intn,a[101],av,cnt;intmain(){ scanf("%d",&n); for(inti=1;i<=n;i++){ scanf("%d&quo......
  • 贪心算法(算法竞赛、蓝桥杯)--奶牛晒衣服
    1、B站视频链接:A28贪心算法P1843奶牛晒衣服_哔哩哔哩_bilibili题目链接:奶牛晒衣服-洛谷#include<bits/stdc++.h>usingnamespacestd;priority_queue<int>q;//用大根堆维护湿度的最大值intn,a,b;inttim,maxn;intmain(){ scanf("%d%d%d",&n,&a,&b); for......
  • 蓝桥杯刷题(七)
    [蓝桥杯2023省A]平方差题目描述输入格式输出格式样例#1样例输入#1样例输出#1提示【样例说明】【评测用例规模与约定】代码题目描述输入格式输出格式样例#1样例输入#1样例输出#1样例#2样例输入#2样例输出#2提示代码题目描述输入格式输出格式样例#1样......