当前位置:网站首页>蓝桥杯单片机省赛第六届
蓝桥杯单片机省赛第六届
2022-07-02 03:29:00 【超561】



难点 如何通过按键设置温度上下限;定义一个数组用来显示温度,通过按键按下次数来判断显示温度上下限;定义一个数组用来存放温度的数值,用按键按下次数判断温度是十位还是个位
main.c
#include <STC15F2K60S2.H>
#include <ONEWIRE.H>
unsigned int wendu;
unsigned char qujian;
unsigned char keynumber;
unsigned char display_mode;
unsigned char Tmax=30;
unsigned char Tmin=20;
unsigned char key_press;
unsigned char led_flag=1;
#define NO_KEY 0xff
#define KEY_STATE0 0
#define KEY_STATE1 1
#define KEY_STATE2 2
unsigned char smgdisplay[8];
unsigned char wd[8];
unsigned char smg_du[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void Device_ctrl(unsigned char p2date,unsigned char p0date);
unsigned char key_scan()
{
static unsigned char key_state=KEY_STATE0;
unsigned char key_value=0,key_temp;
unsigned char key1,key2;
P30=0;P31=0;P32=0;P33=0;P34=1;P35=1;P42=1;P44=1;
if(P44==0){key1=0x70;}
if(P42==0){key1=0xb0;}
if(P35==0){key1=0xd0;}
if(P34==0){key1=0xe0;}
if((P44==1)&&(P42==1)&&(P35==1)&&(P34==1)){key1=0xf0;}
P30=1;P31=1;P32=1;P33=1;P34=0;P35=0;P42=0;P44=0;
if(P30==0){key2=0x0e;}
if(P31==0){key2=0x0d;}
if(P32==0){key2=0x0b;}
if(P33==0){key2=0x07;}
if((P30==1)&&(P31==1)&&(P32==1)&&(P33==1)){key2=0x0f;}
key_temp=key1|key2;
switch(key_state)
{
case KEY_STATE0: if(key_temp!=NO_KEY)
{
key_state=KEY_STATE1;
}
break;
case KEY_STATE1: if(key_temp==NO_KEY)
{key_state=KEY_STATE0;}
else
{
switch(key_temp)
{
case 0x77:key_value=4;break;
case 0x7b:key_value=5;break;
case 0x7d:key_value=6;break;
case 0x7e:key_value=7;break;
case 0xb7:key_value=8;break;
case 0xbb:key_value=9;break;
case 0xbd:key_value=10;break;
case 0xbe:key_value=11;break;
case 0xd7:key_value=12;break;
case 0xdb:key_value=13;break;
case 0xdd:key_value=14;break;
case 0xde:key_value=15;break;
case 0xe7:key_value=16;break;
case 0xeb:key_value=17;break;
case 0xed:key_value=18;break;
case 0xee:key_value=19;break;
}
key_state=KEY_STATE2;
}
break;
case KEY_STATE2:if(key_temp==NO_KEY)
{key_state=KEY_STATE0;}break;
}
return key_value;
}
unsigned int key_count;
void key_process()
{
unsigned int key_val;
if(key_count>=5)
{
key_count=0;
key_val=key_scan();
switch(key_val)
{
case 4:smgdisplay[key_press]=smg_du[9];wd[key_press]=9;key_press++;break;
case 5:smgdisplay[key_press]=smg_du[6];wd[key_press]=6;key_press++;break;
case 6:smgdisplay[key_press]=smg_du[3];wd[key_press]=3;key_press++;break;
case 7:smgdisplay[key_press]=smg_du[0];wd[key_press]=0;key_press++;break;
case 8:display_mode++;
if(display_mode==2)
{
display_mode=0;
key_press=0;
Tmax=wd[1]*10+wd[2];
Tmin=wd[6]*10+wd[7];
if(Tmax<Tmin)
{
P2=0X80;P0=~0X02;P2=0;
led_flag=0;
}
else
{
P2=0X80;P0=0Xff;P2=0;
led_flag=1;
}
}break;
case 9:smgdisplay[key_press]=smg_du[7];wd[key_press]=7;key_press++;break;
case 10:smgdisplay[key_press]=smg_du[4];wd[key_press]=4;key_press++;break;
case 11:smgdisplay[key_press]=smg_du[1];wd[key_press]=1;key_press++;break;
case 12:if(display_mode==1)
{
smgdisplay[1]=0x00;
smgdisplay[2]=0x00;
smgdisplay[6]=0x00;
smgdisplay[7]=0x00;
key_press=0;
}break;
case 13:smgdisplay[key_press]=smg_du[8];wd[key_press]=8;key_press++;break;
case 14:smgdisplay[key_press]=smg_du[5];wd[key_press]=5;key_press++;break;
case 15:smgdisplay[key_press]=smg_du[2];wd[key_press]=2;key_press++;break;
case 16:break;
case 17:break;
case 18:break;
case 19:break;
}
}
}
void Device_ctrl(unsigned char p2date,unsigned char p0date)
{
P0=p0date;
P2=P2&0X1F|p2date;
P2&=0X1F;
}
unsigned char smg_display[8];
unsigned int smg_count;
void smg_show()
{
unsigned int i;
Device_ctrl(0xc0,0);
if(display_mode==0)
{
Device_ctrl(0xe0,~smg_display[i]);
}
else
{
Device_ctrl(0xe0,~smgdisplay[i]);
}
Device_ctrl(0xc0,0x01<<i);
i=(i+1)%8;
}
void smg_process()
{
smgdisplay[0]=0x40;
smgdisplay[3]=0x00;
smgdisplay[4]=0x00;
smgdisplay[5]=0x40;
if(smg_count>3)
{
smg_count=0;
if(display_mode==0)
{
if(wendu<Tmin)
{
qujian=0;
}
if(Tmin<wendu<Tmax)
{
qujian=1;
}
if(wendu>Tmax)
{
qujian=2;
}
smg_display[0]=0x40;
smg_display[1]=smg_du[qujian];
smg_display[2]=0x40;
smg_display[3]=0x00;
smg_display[4]=0x00;
smg_display[5]=0x00;
smg_display[6]=smg_du[wendu/10];
smg_display[7]=smg_du[wendu%10];
}
else
{
if(key_press==3)
{
key_press=6;
}
if(key_press==8)
{
key_press=9;
}
}
}
}
unsigned int temp_count;
void temp_process()
{
if(temp_count>=100)
{
temp_count=0;
wendu=rd_temperature();
}
}
void work_process()
{
if(qujian==0)
{
P2=0xa0;P0=0x30;P2=0;
}
if(qujian==1)
{
P2=0xa0;P0=0x00;P2=0;
}
if(qujian==2)
{
P2=0xa0;P0=0x30;P2=0;
}
}
void Timer2Init() //1毫秒@12.000MHz
{
AUXR &= 0xFB; //定时器时钟12T模式
T2L = 0x18; //设置定时初值
T2H = 0xFC; //设置定时初值
AUXR |= 0x10; //定时器2开始计时
IE2|=0X04;
EA=1;
}
unsigned int led_count;
bit ledflag;
void led_process()
{
if(qujian==0)
{
if(led_count>800)
{
led_count=0;
ledflag=~ledflag;
if(ledflag)
{
P2=0X80;P0=~0X01;P2=0;
}
else
{
P2=0X80;P0=0xFF;P2=0;
}
}
}
if(qujian==1)
{
if(led_count>400)
{
led_count=0;
ledflag=~ledflag;
if(ledflag)
{
P2=0X80;P0=~0X01;P2=0;
}
else
{
P2=0X80;P0=0xFF;P2=0;
}
}
}
if(qujian==2)
{
if(led_count>200)
{
led_count=0;
ledflag=~ledflag;
if(ledflag)
{
P2=0X80;P0=~0X01;P2=0;
}
else
{
P2=0X80;P0=0xFF;P2=0;
}
}
}
}
void main()
{
Timer2Init();
Device_ctrl(0xa0,0x00);
Device_ctrl(0x80,0xff);
while(1)
{
key_process();
smg_process();
temp_process();
work_process();
led_process();
}
}
void timer2service() interrupt 12
{
smg_count++;
smg_show();
key_count++;
temp_count++;
led_count++;
}onewire.c
#include "onewire.h"
//单总线内部延时函数
void Delay_OneWire(unsigned int t)
{
t=t*12;
while(t--);
}
//单总线写操作
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat&0x01;
Delay_OneWire(5);
DQ = 1;
dat >>= 1;
}
Delay_OneWire(5);
}
//单总线读操作
unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat;
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ= 1;
if(DQ)
{
dat |= 0x80;
}
Delay_OneWire(5);
}
return dat;
}
//DS18B20初始化
bit init_ds18b20(void)
{
bit initflag = 0;
DQ = 1;
Delay_OneWire(12);
DQ = 0;
Delay_OneWire(80);
DQ = 1;
Delay_OneWire(10);
initflag = DQ;
Delay_OneWire(5);
return initflag;
}
float rd_temperature(void)
{
float temp;
unsigned char low,high;
init_ds18b20();
Write_DS18B20(0XCC);
Write_DS18B20(0X44);
init_ds18b20();
Write_DS18B20(0XCC);
Write_DS18B20(0XBE);
low=Read_DS18B20();
high=Read_DS18B20();
temp=(high<<8)|low;
temp=temp*0.0625;
return temp;
}onewire.h
#ifndef __ONEWIRE_H
#define __ONEWIRE_H
#include <STC15F2K60S2.H>
sbit DQ = P1^4;
float rd_temperature(void);
#endif
边栏推荐
- ORA-01547、ORA-01194、ORA-01110
- Framing in data transmission
- venn圖取交集
- Go执行shell命令
- Global and Chinese markets for infant care equipment, 2022-2028: Research Report on technology, participants, trends, market size and share
- Verilog 时序控制
- Getting started with MQ
- Kotlin basic learning 13
- SAML2.0 notes (I)
- Screenshot literacy tool download and use
猜你喜欢

Pycharm2021 delete the package warehouse list you added

数据传输中的成帧

《MATLAB 神经网络43个案例分析》:第42章 并行运算与神经网络——基于CPU/GPU的并行神经网络运算

How to do medium and long-term stocks, and what are the medium and long-term stock trading skills?

Uniapp uses canvas to generate posters and save them locally

Retrofit's callback hell is really vulnerable in kotlin synergy mode

MySQL之账号管理
![[HCIA continuous update] working principle of OSPF Protocol](/img/bc/4eeb091c511fd563fb1e00c8c8881a.jpg)
[HCIA continuous update] working principle of OSPF Protocol

SAML2.0 notes (I)

Which of PMP and software has the highest gold content?
随机推荐
汇率的查询接口
Global and Chinese market of gynaecological health training manikin 2022-2028: Research Report on technology, participants, trends, market size and share
Kotlin基础学习 15
焱融看 | 混合雲時代下,如何制定多雲策略
PY3 link MySQL
aaaaaaaaaaaaa
Verilog state machine
Pointer array & array pointer
Yan Rong looks at how to formulate a multi cloud strategy in the era of hybrid cloud
Verilog 状态机
Verilog wire type
In the era of programmers' introspection, five-year-old programmers are afraid to go out for interviews
Detailed explanation of ThreadLocal
Kotlin 基础学习13
竞争与冒险 毛刺
Getting started with MQ
SAML2.0 笔记(一)
Kotlin basic learning 15
verilog 并行块实现
SAML2.0 notes (I)