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



main.c
#include <STC15F2K60S2.H>
#include <ONEWIRE.H>
#include <IIC.H>
void Device_ctrl(unsigned char p2date,unsigned char p0date)
{
P0=p0date;
P2=P2&0X1F|p2date;
P2&=0X1F;
}
unsigned char smg_display[8];
unsigned char smg_du[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned int smg_count;
unsigned char display_mode;
unsigned int temp;
unsigned int temp_count;
unsigned int Tmax_set=30;
unsigned int Tmin_set=20;
unsigned int Tmax=30;
unsigned int Tmin=20;
unsigned int da_count;
unsigned int led_count;
unsigned char led_ctrl=0xff;
bit led_flag;
void da(unsigned char date)
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x40);
IIC_WaitAck();
IIC_SendByte(date);
IIC_WaitAck();
IIC_Stop();
}
void da_process()
{
if(da_count>10)
{
da_count=0;
if(temp<Tmin)
{
da(51*2);
}
if((Tmin<=temp)&&(temp<=Tmax))
{
da(51*3);
}
if(temp>Tmax)
{
da(51*4);
}
}
}
void led_process()
{
if(led_count>10)
{
led_count=0;
if(temp<Tmin)
{
led_ctrl&=~0x04;
}
else
{
led_ctrl|=0x04;
}
if((temp<=Tmax)&&(temp>=Tmin))
{
led_ctrl&=~0x02;
}
else
{
led_ctrl|=0x02;
}
if(temp>Tmax)
{
led_ctrl&=~0x01;
}
else
{
led_ctrl|=0x01;
}
if(led_flag)
{
led_ctrl&=~0x08;
}
else
{
led_ctrl|=0x08;
}
Device_ctrl(0x80,led_ctrl);
}
}
void temp_process()
{
if(temp_count>100)
{
temp_count=0;
temp=read_temp();
Init_temp();
}
}
void smg_show()
{
unsigned char i;
Device_ctrl(0xc0,0);
Device_ctrl(0xe0,~smg_display[i]);
Device_ctrl(0xc0,0x01<<i);
i=(i+1)%8;
}
void smg_process()
{
if(smg_count>3)
{
smg_count=0;
if(display_mode==0)
{
smg_display[0]=0x39;
smg_display[1]=0x00;
smg_display[2]=0x00;
smg_display[3]=0x00;
smg_display[4]=0x00;
smg_display[5]=0x00;
smg_display[6]=smg_du[temp/10];
smg_display[7]=smg_du[temp%10];
}
else if(display_mode==1)
{
smg_display[0]=0x73;
smg_display[1]=0x00;
smg_display[2]=0x00;
smg_display[3]=smg_du[Tmax_set/10];
smg_display[4]=smg_du[Tmax_set%10];
smg_display[5]=0x00;
smg_display[6]=smg_du[Tmin_set/10];
smg_display[7]=smg_du[Tmin_set%10];
}
}
}
unsigned char Trig_btn;
unsigned char Cont_btn;
unsigned int key_count;
bit key_set;
void key_btn()
{
unsigned char readdate=P3^0XFF;
Trig_btn=readdate&(Cont_btn^readdate);
Cont_btn=readdate;
}
void key_process()
{
if(key_count>10)
{
key_count=0;
key_btn();
if(Trig_btn==0x08)//s4
{
display_mode++;
if(display_mode==2)
{
if(Tmax_set>=Tmin_set)
{
Tmax=Tmax_set;
Tmin=Tmin_set;
led_flag=0;
}
else
{
Tmax=Tmax;
Tmin=Tmin;
Tmax_set=Tmax;
Tmin_set=Tmin;
led_flag=1;
}
display_mode=0;
}
}
if(Trig_btn==0x04)//s5
{
key_set=~key_set;
}
if(Trig_btn==0x02)//s6
{
if(display_mode==1)
{
if(key_set==0)
{
if(Tmax_set<99)
{
Tmax_set++;
}
}
else
{
if(Tmin_set<99)
{
Tmin_set++;
}
}
}
}
if(Trig_btn==0x01)//s7
{
if(display_mode==1)
{
if(key_set==0)
{
if(Tmax_set>0)
{
Tmax_set--;
}
}
else
{
if(Tmin_set>0)
{
Tmin_set--;
}
}
}
}
}
}
void Timer2Init() //1毫秒@12.000MHz
{
AUXR &= 0xFB; //定时器时钟12T模式
T2L = 0x18; //设置定时初值
T2H = 0xFC; //设置定时初值
AUXR |= 0x10; //定时器2开始计时
IE2|=0x04;
EA=1;
}
void main()
{
Timer2Init();
while(1)
{
key_process();
smg_process();
temp_process();
da_process();
led_process();
}
}
void timer2service() interrupt 12
{
key_count++;
smg_count++;
temp_count++;
da_count++;
led_count++;
smg_show();
}iic.c
#include "iic.h"
#define DELAY_TIME 5
//I2C总线内部延时函数
void IIC_Delay(unsigned char i)
{
do{_nop_();}
while(i--);
}
//I2C总线启动信号
void IIC_Start(void)
{
SDA = 1;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 0;
}
//I2C总线停止信号
void IIC_Stop(void)
{
SDA = 0;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 1;
IIC_Delay(DELAY_TIME);
}
//发送应答或非应答信号
void IIC_SendAck(bit ackbit)
{
SCL = 0;
SDA = ackbit;
IIC_Delay(DELAY_TIME);
SCL = 1;
IIC_Delay(DELAY_TIME);
SCL = 0;
SDA = 1;
IIC_Delay(DELAY_TIME);
}
//等待应答
bit IIC_WaitAck(void)
{
bit ackbit;
SCL = 1;
IIC_Delay(DELAY_TIME);
ackbit = SDA;
SCL = 0;
IIC_Delay(DELAY_TIME);
return ackbit;
}
//I2C总线发送一个字节数据
void IIC_SendByte(unsigned char byt)
{
unsigned char i;
for(i=0; i<8; i++)
{
SCL = 0;
IIC_Delay(DELAY_TIME);
if(byt & 0x80) SDA = 1;
else SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 1;
byt <<= 1;
IIC_Delay(DELAY_TIME);
}
SCL = 0;
}
//I2C总线接收一个字节数据
unsigned char IIC_RecByte(void)
{
unsigned char i, da;
for(i=0; i<8; i++)
{
SCL = 1;
IIC_Delay(DELAY_TIME);
da <<= 1;
if(SDA) da |= 1;
SCL = 0;
IIC_Delay(DELAY_TIME);
}
return da;
}
iic.h
#ifndef __IIC_H
#define __IIC_H
#include <STC15F2K60S2.H>
#include "intrins.h"
sbit SDA = P2^1;
sbit SCL = P2^0;
void IIC_Start(void);
void IIC_Stop(void);
bit IIC_WaitAck(void);
void IIC_SendAck(bit ackbit);
void IIC_SendByte(unsigned char byt);
unsigned char IIC_RecByte(void);
#endifonewire.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;
}
void Init_temp()
{
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
}
float read_temp()
{
float temp;
unsigned char low,high;
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 read_temp();
void Init_temp();
#endif
边栏推荐
- Qt的网络连接方式
- [数据库]JDBC
- C # joint halcon out of halcon Environment and various Error Reporting and Resolution Experiences
- C#聯合halcon脫離halcon環境以及各種報錯解决經曆
- Uniapp uses canvas to generate posters and save them locally
- /silicosis/geo/GSE184854_scRNA-seq_mouse_lung_ccr2/GSE184854_RAW/GSM5598265_matrix_inflection_demult
- Kotlin基础学习 16
- [yolo3d]: real time detection of end-to-end 3D point cloud input
- Global and Chinese market of gynaecological health training manikin 2022-2028: Research Report on technology, participants, trends, market size and share
- ThreadLocal详解
猜你喜欢

"Analysis of 43 cases of MATLAB neural network": Chapter 42 parallel operation and neural network - parallel neural network operation based on cpu/gpu

uniapp 使用canvas 生成海报并保存到本地

微信小程序中 在xwml 中使用外部引入的 js进行判断计算

Which of PMP and software has the highest gold content?

verilog 并行块实现

Review materials of project management PMP high frequency examination sites (8-1)

表单自定义校验规则
![[designmode] builder model](/img/e8/855934d57eb6868a4d188b2bb1d188.png)
[designmode] builder model

【DesignMode】原型模式(prototype pattern)

Continuous assignment of Verilog procedure
随机推荐
PY3 link MySQL
Named block Verilog
一天上手Aurora 8B/10B IP核(5)----从Framing接口的官方例程学起
竞争与冒险 毛刺
verilog 并行块实现
[数据库]JDBC
焱融看 | 混合雲時代下,如何制定多雲策略
Xlwings drawing
The page in H5 shows hidden execution events
Basic syntax of unity script (8) - collaborative program and destruction method
JS introduction < 1 >
venn图取交集
C#聯合halcon脫離halcon環境以及各種報錯解决經曆
Detailed explanation of the difference between Verilog process assignment
Kotlin基础学习 17
Unity脚本的基础语法(6)-特定文件夹
《MATLAB 神經網絡43個案例分析》:第42章 並行運算與神經網絡——基於CPU/GPU的並行神經網絡運算
Screenshot literacy tool download and use
《MATLAB 神经网络43个案例分析》:第42章 并行运算与神经网络——基于CPU/GPU的并行神经网络运算
Global and Chinese markets for ultrasonic probe disinfection systems 2022-2028: Research Report on technology, participants, trends, market size and share