“蓝桥杯”全国软件和信息技术专业人才大赛指导合集【2.2】

4.6.1 系统设计

多功能测量仪表详细框图如图 4.43 所示。电压信号通过 ADC 转换,单片机采集该模拟输入信号的 ADC 数值, 555 方波输出至单片机 P34 引脚, 作为计数器 0 输入端计数便于方波频率计算, DS18B20 为温度传感器,单片机从 DS18B20 采集温度信息、从键盘采集功能要求,并将电压、频率和温度等数据按要求显示到数码管,控制 LED 灯点亮与熄灭, 24C02 作为 EEPROM 存储记录数据。

系统主程序流程图如图 4.44 所示。主程序首先关闭外设,对定时器 1 和定时器 0 进行初始化并读取存储数据,然后进行按键处理和数码管处理,其中按键处理中包含存储数据,数码管处理中包含电压和温度测量,频率测量在定时器 1 中断服务程序中实现。

多功能测量仪表“ main.c”内容如下:
#include "tim.h"
#include "key.h"
#include "seg.h"
#include "stdio.h"
#include "onewire.h"
#include "iic.h"
unsigned int uiFre_Val, uiTem_Val, uiSeg_Dly;
unsigned int uiFre_Echo, uiTem_Echo;
unsigned char ucVol_Val, ucVol_Echo, ucVol_Thr, ucVol_Flag;
unsigned char ucState, ucLed=1;
unsigned char pucSeg_Buf[10], pucSeg_Code[8], ucSeg_Pos;
unsigned char ucKey_Dly, ucKey_Old;
unsigned long ulms, ulKey_Time;
void Timer0Init(void) // 16 位计数器模式
{
AUXR &= 0x7F; // 定时器时钟 12T 模式
TMOD |= 5; // 设置 16 位计数器模式
TL0 = 0; // 设置计数初值
TH0 = 0; // 设置计数初值
TF0 = 0; // 清除 TF0 标志
TR0 = 1; // 开始计数
}
void Key_Proc(void);
void Seg_Proc(void);
void main(void)
{
Cls_Peripheral();
Timer1Init();
Timer0Init();
EEPROM_Read(pucSeg_Buf, 0, 6);
ucVol_Val = pucSeg_Buf[0];
uiFre_Val = (pucSeg_Buf[2]<<8)+pucSeg_Buf[1];
uiTem_Val = (pucSeg_Buf[4]<<8)+pucSeg_Buf[3];
ucVol_Thr = pucSeg_Buf[5];
if(ucVol_Thr > 50) ucVol_Thr = 20;
while(1)
{
Key_Proc();
Seg_Proc();
}
}
void Time_1(void) interrupt 3
{
ulms++;
if(++ucKey_Dly == 10)
ucKey_Dly = 0;
if(++uiSeg_Dly == 500)
uiSeg_Dly = 0;
if(ucVol_Flag)
if(!(ulms % 200))
ucLed ^= 0x80;
if(!(ulms % 1000))
{
uiFre_Val = (TH0<<8)+TL0;
TH0 = 0;
TL0 = 0;
}
Led_Disp(ucLed);
Seg_Disp(pucSeg_Code, ucSeg_Pos);
if(++ucSeg_Pos == 8) ucSeg_Pos = 0;
}
void Key_Proc(void)
{
unsigned char ucKey_Val, ucKey_Down;
if(ucKey_Dly) return;
ucKey_Dly = 1;
ucKey_Val = Key_Read();
ucKey_Down = ucKey_Val & (ucKey_Old ^ ucKey_Val);
ucKey_Old = ucKey_Val;
if(ucKey_Down) ulKey_Time = ulms;
switch(ucKey_Down)
{
case 4: // S4
if(ucState < 3)
{
if(++ucState == 3) ucState = 0;
if(!ucState) ucLed = 1;
if(ucState == 1) ucLed = 2;
if(ucState == 2) ucLed = 4;
}
else if(ucState < 0x13)
if(++ucState == 0x13) ucState = 0x10;
break;
case 5: // S5
pucSeg_Buf[0] = ucVol_Val;
pucSeg_Buf[1] = uiFre_Val & 0xff;
pucSeg_Buf[2] = uiFre_Val >> 8;
pucSeg_Buf[3] = uiTem_Val & 0xff;
pucSeg_Buf[4] = uiTem_Val >> 8;
EEPROM_Write(pucSeg_Buf, 0, 5);
break;
case 8: // S8
if(ucState < 0x10)
{
ucState = 0x10;
ucLed = 0;
EEPROM_Read(pucSeg_Buf, 0, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BinaryStarXin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值