有关题目







实现代码
注意:
频率测量功能:单片机 P34 引脚需与J3 排针上的 SIGNAL 引脚短接
限制条件方面:①切换通道生效仅在电压界面。
②定时器T0作为计数器时,除了中断溢出标志TF0可以不用外,TR0也得正常开启
③长按键判断完之后,要清零。
④周期的单位us,不是秒!
数据准确度问题:在C语言中,1000 / 33 和 1000.0 / 33不是同样的结果!这点我们在处理电压值和频率值时会用到
处理数据:由于pcf8591读取电压读取的为上一次的值,读取光敏电阻和电位器两端电压时可能会读取不正确,为此解决方法有两个:①可以读两次,就如我们在下面main.c中所写rd_pcf8591
②可以将读取的光敏电阻和电位器两端电压值进行交换即可!
底层代码:rd_pcf8591()函数读取最后需调用iic.c中IIC_SendAck()发送非应答信号,即SDA发送一个高电平
main.c
#include "STC15F2K60S2.h"
#include "iic.h"
#define uchar unsigned char
#define uint unsigned int
sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;
sbit L1 = P0^0;
sbit L2 = P0^1;
sbit L3 = P0^2;
sbit L4 = P0^3;
sbit L5 = P0^4;
uchar jm = 0;//界面初始化频率界面
code uchar tab[] = {
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0x8e,0xc8,0xc1,0xbf};
//f、下U,U, - 11 12 13 14
uint cnt_freq;//计数1s多少个脉冲
uint curr_freq;//实时频率值
uint curr_light, curr_ain3;//分别对应通道1和3的值
uint vol, freq;//缓存电压和频率值
uchar cnt_press;//计算s7按压下去多少秒,超过20,则为长按键
bit flag_channel;//0为初始话进入通道1,1就进入通道3
bit press_s7_flag;//s7按下标志位, 1为s7按下
bit led_flag = 1;//0为熄灭,1为打开
void sys_init();
uchar rd_pcf8591(uchar addr);
void key_handle();
void dsp_smg_bit(uchar pos, val);
void display();//显示功能,分三个大块
void dsp_freq();
void dsp_period();
void dsp_vol();
void delay_k(uchar t);//延时t * 10us
void Delay1ms(); //1ms@12.000MHz,延时1ms用于给足数码管足够显示时间
void led();
void main()
{
sys_init();
while(1)
{
curr_light = (uint)(rd_pcf8591(0x01) * 100.0 / 51);
curr_ain3 = (uint)(rd_pcf8591(0x03) * 100.0 / 51);
key_handle();
display();
led();
}
}
void led()
{
if (led_flag)//led此时正常点亮
{
if (curr_ain3 > vol)
{
P2 = (P2 & 0x1f) | 0x80;
L1 = 0;
}
if (curr_freq > freq)
{
P2 = (P2

这篇博客主要介绍了2021年单片机省赛中涉及的程序设计,包括频率测量、通道切换、电压读取等功能。代码实现了通过P34引脚测量信号频率,并在数码管上显示。同时,利用PCA8591读取光敏电阻和电位器电压,处理数据时考虑了精度问题。此外,还涉及了按键处理和LED显示逻辑,以及定时器的使用。
最低0.47元/天 解锁文章
2880

被折叠的 条评论
为什么被折叠?



