当前位置:网站首页>蓝桥杯单片机省赛第十一届第二场
蓝桥杯单片机省赛第十一届第二场
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);
#endif
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;
}
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
边栏推荐
- Global and Chinese markets for infant care equipment, 2022-2028: Research Report on technology, participants, trends, market size and share
- Competition and adventure burr
- Download and use of the super perfect screenshot tool snipaste
- Verilog 线型wire 种类
- Kotlin basic learning 15
- 【DesignMode】建造者模式(Builder model)
- Eight steps of agile development process
- In depth interpretation of pytest official documents (26) customized pytest assertion error information
- [database]jdbc
- Grpc快速实践
猜你喜欢
数据传输中的成帧
Detailed explanation of ThreadLocal
West digital decided to raise the price of flash memory products immediately after the factory was polluted by materials
Analyse de 43 cas de réseaux neuronaux MATLAB: Chapitre 42 opérations parallèles et réseaux neuronaux - - opérations parallèles de réseaux neuronaux basées sur CPU / GPU
High performance and low power cortex-a53 core board | i.mx8m Mini
Retrofit's callback hell is really vulnerable in kotlin synergy mode
[yolo3d]: real time detection of end-to-end 3D point cloud input
SAML2.0 notes (I)
How to do medium and long-term stocks, and what are the medium and long-term stock trading skills?
【DesignMode】建造者模式(Builder model)
随机推荐
[C Advanced] brother Peng takes you to play with strings and memory functions
Go执行shell命令
Grpc快速实践
[yolo3d]: real time detection of end-to-end 3D point cloud input
焱融看 | 混合雲時代下,如何制定多雲策略
Form custom verification rules
C # joint Halcon's experience of breaking away from Halcon environment and various error reporting solutions
焱融看 | 混合云时代下,如何制定多云策略
Sentry experience and architecture, a fledgling monitoring product with a market value of $100million
leetcode-1380. Lucky number in matrix
Competition and adventure burr
Kotlin 基础学习13
Merge interval, linked list, array
Intersection of Venn graph
竞争与冒险 毛刺
Verilog parallel block implementation
《MATLAB 神经网络43个案例分析》:第41章 定制神经网络的实现——神经网络的个性化建模与仿真
终日乾乾,夕惕若厉
aaaaaaaaaaaaa
FFMpeg AVFrame 的概念.