第十二届蓝桥杯
Posted 一心向月
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十二届蓝桥杯相关的知识,希望对你有一定的参考价值。
通过学习与借鉴写的第十二届蓝桥杯单片机 简单易懂
全部程序请点击这里
提取码:azxy
主程序
#include"main.h"
extern bit timer_flag; //使运行中断时与主函数不冲突
extern u8 key_flag; //判断按键是否按下
//0:按下
//1:没按下
extern u8 key_num; //按键反馈值
extern u8 smg_change[8]; //8个数码管显示
extern u8 code duan[15]; //0~9和要显示的数值
u8 mod_led=0xff; //定义LED灯开关状态
u16 temp; //温度值
u16 wdcs=25; //在参数温度时,温度参数变量
u16 wdcs_now=25; //在程序运行时,生效温度参数
u16 dac=0; //待输出的ADC电压值
u16 stan=0; //界面切换
//0:为温度界面
//1:为参数设置界面
//2:DAC输出界面
u16 f_mod=0; //模式切换
//0:模式1
//1:模式2
/*==========================普通延迟函数============================*/
void delay(u16 i)
{
while(i--);
}
/*==========================锁存器选择函数 =========================*/
void init_74hc573(num)
{
switch(num)
{
case 4: P2=(P2&0x1f)|0x80; break; //选择LED控制
case 5: P2=(P2&0x1f)|0xa0; break; //选择蜂鸣器和继电器控制
case 6: P2=(P2&0x1f)|0xc0; break; //选择数码管位选
case 7: P2=(P2&0x1f)|0xe0; break; //选择数码管段选
case 0: P2=(P2&0x1f)|0x00; break; //所有不选择
}
}
/*==========================系统初始化============================*/
void init_system()
{
init_74hc573(4); //关闭LED灯
P0=0xff;
init_74hc573(5); //关闭蜂鸣器
P0=0x00;
}
/*========================LED输出控制函数==========================*/
void set_led(u8 aa)
{
init_74hc573(4);
P0=aa;
init_74hc573(0);
}
/*=======================数码管输出控制函数=========================*/
void set_smg(u8 bb)
{
init_74hc573(7);
P0=bb;
init_74hc573(6);
P0=0x00;
}
/*=======================温度显示界面函数==========================*/
void smg_wd()
{
temp=read_18b20float();
set_led(0xff);
mod_led=(mod_led|0xfe)&0xfd;
set_led(mod_led);
set_smg(0xff);
smg_change[0]=duan[12];
smg_change[1]=duan[10];
smg_change[2]=duan[10];
smg_change[3]=duan[10];
smg_change[4]=duan[temp / 1000];
smg_change[5]=duan[temp % 1000 / 100]+0x80;
smg_change[6]=duan[temp % 100 / 10];
smg_change[7]=duan[temp % 10];
set_smg(0xff);
}
/*=======================参数设置界面函数==========================*/
void smg_cs()
{
set_led(0xff);
mod_led=(mod_led|0xfe)&0xfb;
set_led(mod_led);
set_smg(0xff);
smg_change[0]=duan[13];
smg_change[1]=duan[10];
smg_change[2]=duan[10];
smg_change[3]=duan[10];
smg_change[4]=duan[10];
smg_change[5]=duan[10];
smg_change[6]=duan[wdcs/ 10];
smg_change[7]=duan[wdcs% 10];
set_smg(0xff);
}
/*=======================DAC输出界面函数==========================*/
void smg_dac()
{
set_led(0xff);
mod_led=(mod_led|0xfe)&0xf7;
set_led(mod_led);
set_smg(0xff);
smg_change[0]=duan[14];
smg_change[1]=duan[10];
smg_change[2]=duan[10];
smg_change[3]=duan[10];
smg_change[4]=duan[10];
smg_change[5]=duan[dac/100]+0x80;
smg_change[6]=duan[(dac/10)%10];
smg_change[7]=duan[dac% 10];
set_smg(0xff);
}
/*=======================运行界面函数==========================*/
void running()
{
u8 dat_dac;
u16 tmp=0;
temp=read_18b20float();
switch(f_mod)
{
case 0:
if(temp<(wdcs_now*100))
{
dac=0;
}
else
{
dac=500;
}
break;
case 1:
if(temp<2000)
{
dac=100;
}
else if(temp<4000)
{
tmp=(temp-2000)*15;
dac=(tmp/100)+100;
}
else
{
dac=400;
}
break;
}
dat_dac=dac*0.51;
pcf8591(dat_dac);
}
/*=======================显示界面函数==========================*/
void displaysmg()
{
switch(f_mod)
{
case 0:
mod_led=0xfe;
break;
case 1:
mod_led=0xff;
break;
}
switch(stan)
{
case 0:
running();
smg_wd();
break;
case 1:
running();
smg_cs();
break;
case 2:
running();
smg_dac();
break;
}
}
/*=======================矩阵按键函数==========================*/
void key_cin()
{
if(key_num==8) //如果S5按下
{
f_mod++;
if(f_mod==1) stan=0;
if(f_mod==2)
{
f_mod=0;
stan=0;
}
while(key_flag==0) //按键释放
{
displaysmg();
delay(1000);
}
}
if(key_num==12) //如果S4按下
{
stan++;
if(stan==1)
{
wdcs=wdcs_now;
}
else if(stan==2)
{
wdcs_now=wdcs;
}
else if(stan==3) stan=0;
while(key_flag==0) //按键释放
{
displaysmg();
delay(1000);
}
}
if(key_num==9) //如果S9按下
{
if(stan==1)
{
wdcs++;
}
while(key_flag==0) //按键释放
{
displaysmg();
delay(1000);
}
}
if(key_num==13) //如果S8按下
{
if(stan==1)
{
wdcs--;
}
while(key_flag==0) //按键释放
{
displaysmg();
delay(1000);
}
}
}
/*=======================主函数==========================*/
void main()
{
init_system(); //系统初始化
Timer0Init(); //中断
while(1)
{
if(key_flag==1) //按键消抖
{
key_sd();
key_flag=0;
}
running();
displaysmg();
key_cin();
displaysmg();
}
}
以上是关于第十二届蓝桥杯的主要内容,如果未能解决你的问题,请参考以下文章