分析改次蓝桥杯的外设模块主要是,ad模块算出光伏和电位器,频率周期检测,周期采用频率的倒数计算即可。
对于周期和频率的计算这样来算
首先频率的检测是来检测Rb3上的频率,必须将NAL和P34短接,根据频率的定义一秒钟产生周期次数,采用操作为用定时器0作计数器进行周期检测,每产生一个方波就加一,定时器1计时一秒钟拿出次数显示即是斌率。
代码实列
这里的配置就是对于TMOD寄存器的配置看图,将定时器0的CT位,置1进行对P3.4的脉冲计数,以下是对定时器的初始化配置。
void Timer_Init()
{
//定时器0为计数模式
TL0 = 0xff;
TH0 = 0xff;
//定时器1为定时10毫秒
TL1 = 0x00;
TH1 = 0xDC;
TMOD = 0x8e;//配置
TR0=1;
TR1=1;
IT0=1;
ET0=1;
ET1=1;
EA=1;
}
定时器中断函数部分如下
void Timer0_intr() interrupt 1
{
count++;
/*t_h=TH1-0xDC;
t_l=TL1-0x00;
per=(t_h*256+t_l)*1;*/
}
void Timer1_intr() interrupt 3
{
t_count++;
if(t_count==100)
{
Fre=count;
t_count=0;
count=0;
}
}
关于ADC显示
首先ADC对应的芯片手册是PCF8591,通过看该芯片手册可以知道以下几点即可
该芯片支持的iic协议,将iic的文件加入即可。
1.每次开始iic后,需要将设备地址加入,0x91读地址,0x90写地址
2.关于地址间的设备,0x01光敏电阻,0x03电位器(这里代表的是数字量,若为0x41和0x43则代表的是模拟量需要进行转换)
常见错误:
1. 首先0x90表示写,就是没有才能写,每次当写完后转换成读是iic需要采用停止才能继续,否则不行。
2. float类型的变量进行赋值时必须保证等式右边含有小数点,否则不会保留小数,这也是上面为什么会有5.0/255这个说法。
3. 记得拿到adc数据后一定需要接受一个应答信号`IIC_SendAck(1);`不然也会产生错误
4. iic头文件出错再头文件上加上一个_即可
该公式为
其中ad_dis是从iic拿到的数据
ad_value=ad_dis*(5.0/255);
ad_dis=ad_value*100;
然后是adc的部分代码
void ADC_Trs_Lig()//光敏电阻
{
IIC_Start();
IIC_SendByte(0x90);//写数据0x90
IIC_WaitAck();
IIC_SendByte(0x01);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0x91);//读数据0x91
IIC_WaitAck();
ad_l=IIC_RecByte();
IIC_SendAck(1); //接受数据之后需要应答信号
IIC_Stop();
Adl_smg();
}
void ADC_R()//电位器
{
IIC_Start();
IIC_SendByte(0x90);//写数据0x90
IIC_WaitAck();
IIC_SendByte(0x03);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0x91);//读数据0x91
IIC_WaitAck();
ad_3=IIC_RecByte();
IIC_SendAck(1); //接受数据之后需要应答信号
IIC_Stop();
Ad3_smg();
}