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




难点1湿度如何计算,读取的0x03电位器的值,湿度=k电压;五伏对应湿度为99;所以k就可以计算出来
shidu=ad(0x03);
shidu=shidu*99/255;2如何同时控制蜂鸣器继电器,分别定义两个标志位,然后通过定义标志位来操作
if((buzz_flag==0)&&(motor_flag==0))
{
P2=0XA0;MOTOR=0;BUZZ=0;P2=0;
}
if((buzz_flag==1)&&(motor_flag==0))
{
P2=0XA0;MOTOR=0;BUZZ=1;P2=0;
}
if((buzz_flag==0)&&(motor_flag==1))
{
P2=0XA0;MOTOR=1;BUZZ=0;P2=0;
}
if((buzz_flag==1)&&(motor_flag==1))
{
P2=0XA0;MOTOR=1;BUZZ=1;P2=0;
}main.c
#include <STC15F2K60S2.H>
#include <DS1302.H>
#include <IIC.H>
sbit BUZZ=P0^6;
sbit MOTOR=P0^4;
bit buzz_flag;
bit motor_flag;
unsigned int shidu;
unsigned int shidu_fazhi;
unsigned char shi;
unsigned char fen;
unsigned char miao;
unsigned char display_mode;
unsigned int buzzflag;
void write_date(unsigned char add,unsigned char date);
void Device_ctrl(unsigned char p2date,unsigned char p0date)//锁存器控制IO口函数
{
P0=p0date;
P2=P2&0X1F|p2date;
P2&=0x1f;
}
unsigned char trig_btn;
unsigned char cont_btn;
unsigned int key_count;
unsigned char key_flag;
void key_btn()//按键函数
{
unsigned char readdate=P3^0xff;
trig_btn=readdate&(cont_btn^readdate);
cont_btn=readdate;
}
bit work_mode;
void key_process()//按键处理函数
{
if(key_count>5)
{
key_count=0;
key_btn();
if(trig_btn==0x08)//s4
{
if(work_mode==1)//手动状态
{
motor_flag=0;
}
else//自动状态
{
shidu_fazhi--;
}
}
if(trig_btn==0x04)//s5
{
if(work_mode==1)//手动状态
{
motor_flag=1;
}
else//自动状态
{
shidu_fazhi++;
}
}
if(trig_btn==0x02)//s6
{
if(work_mode==0)//自动工作模式
{
display_mode=1;
key_flag++;
if(key_flag>1)
{
display_mode=0;
key_flag=0;
write_date(0xaa,shidu_fazhi);
}
}
else//手动模式
{
buzzflag=~buzzflag;
}
}
if(trig_btn==0x01)//s7
{
work_mode=~work_mode;//改变工作模式
if(work_mode)//手动模式
{
Device_ctrl(0x80,~0x02);
}
else//自动模式
{
Device_ctrl(0x80,~0x01);
}
}
}
}
void set_sfm(unsigned char shi,unsigned char fen,unsigned char miao)//输入时分秒
{
Write_Ds1302_Byte(0x8e,0);
Write_Ds1302_Byte(0x80,miao/10*16+miao%10);
Write_Ds1302_Byte(0x82,fen/10*16+fen%10);
Write_Ds1302_Byte(0x84,shi/10*16+shi%10);
Write_Ds1302_Byte(0x8e,0x80);
}
unsigned char smg_display[8];
unsigned char smg_du[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned int smg_count;
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]=smg_du[shi/10];
smg_display[1]=smg_du[shi%10];
smg_display[2]=0x40;
smg_display[3]=smg_du[fen/10];
smg_display[4]=smg_du[fen%10];
smg_display[5]=0x00;
smg_display[6]=smg_du[shidu/10];
smg_display[7]=smg_du[shidu%10];
}
else
{
smg_display[0]=0x40;
smg_display[1]=0x40;
smg_display[2]=0x00;
smg_display[3]=0x00;
smg_display[4]=0x00;
smg_display[5]=0x00;
smg_display[6]=smg_du[shidu_fazhi/10];
smg_display[7]=smg_du[shidu_fazhi%10];
}
}
}
unsigned int ad_count;
unsigned char ad(unsigned char add)
{
unsigned char date;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
date=IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
return date;
}
void ad_process()
{
if(ad_count>=100)
{
ad_count=0;
shidu=ad(0x03);
shidu=shidu*99/255;
}
}
void write_date(unsigned char add,unsigned char date)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_SendByte(date);
IIC_WaitAck();
IIC_Stop();
}
unsigned int read_date(unsigned char add)
{
unsigned int date;
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0xa1);
IIC_WaitAck();
date=IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
return date;
}
void Timer2Init() //1毫秒@12.000MHz
{
AUXR &= 0xFB; //定时器时钟12T模式
T2L = 0x18; //设置定时初值
T2H = 0xFC; //设置定时初值
AUXR |= 0x10; //定时器2开始计时
IE2|=0X04;
EA=1;
}
void main()
{
Timer2Init(); //定时器初始化
Device_ctrl(0xa0,0x00);
Device_ctrl(0x80,0xFF);
shidu_fazhi=read_date(0xaa);
if(work_mode)//手动模式
{
Device_ctrl(0x80,~0x02);
}
else//自动模式
{
Device_ctrl(0x80,~0x01);
}
set_sfm(8,30,55);
while(1)
{
EA=0;
shi=Read_Ds1302_Byte(0x85);
fen=Read_Ds1302_Byte(0x83);
miao=Read_Ds1302_Byte(0x81);
shi=shi/16*10+shi%16;
fen=fen/16*10+fen%16;
miao=miao/16*10+miao%16;
EA=1;
smg_process();
key_process();
ad_process();
if(work_mode==0)
{
if(shidu<shidu_fazhi)
{
motor_flag=1;buzz_flag=0;
}
else
{
motor_flag=0;buzz_flag=0;
}
}
else
{
if(shidu<shidu_fazhi)
{
if(buzzflag)
{
buzz_flag=1;
}
else
{
buzz_flag=0;
}
}
else
{
buzz_flag=0;
}
}
if((buzz_flag==0)&&(motor_flag==0))
{
P2=0XA0;MOTOR=0;BUZZ=0;P2=0;
}
if((buzz_flag==1)&&(motor_flag==0))
{
P2=0XA0;MOTOR=0;BUZZ=1;P2=0;
}
if((buzz_flag==0)&&(motor_flag==1))
{
P2=0XA0;MOTOR=1;BUZZ=0;P2=0;
}
if((buzz_flag==1)&&(motor_flag==1))
{
P2=0XA0;MOTOR=1;BUZZ=1;P2=0;
}
}
}
void timer2service() interrupt 12 //中断函数
{
smg_count++;
smg_show();
key_count++;
ad_count++;
}iic.c
#include "iic.h"
#define DELAY_TIME 5
sbit SDA = P2^1;
sbit SCL = P2^0;
//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"
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);
#endifds1302.c
#include "ds1302.h"
sbit SCK = P1^7;
sbit SDA = P2^3;
sbit RST = P1^3;
//写字节
void Write_Ds1302(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
SCK = 0;
SDA = temp&0x01;
temp>>=1;
SCK=1;
}
}
//向DS1302寄存器写入数据
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )
{
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
Write_Ds1302(dat);
RST=0;
}
//从DS1302寄存器读出数据
unsigned char Read_Ds1302_Byte ( unsigned char address )
{
unsigned char i,temp=0x00;
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
for (i=0;i<8;i++)
{
SCK=0;
temp>>=1;
if(SDA)
temp|=0x80;
SCK=1;
}
RST=0; _nop_();
SCK=0; _nop_();
SCK=1; _nop_();
SDA=0; _nop_();
SDA=1; _nop_();
return (temp);
}
ds1302.h
#ifndef __DS1302_H
#define __DS1302_H
#include <STC15F2K60S2.H>
#include <intrins.h>
void Write_Ds1302(unsigned char temp);
void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302_Byte( unsigned char address );
#endif
边栏推荐
- C#联合halcon脱离halcon环境以及各种报错解决经历
- On redis (II) -- cluster version
- /silicosis/geo/GSE184854_scRNA-seq_mouse_lung_ccr2/GSE184854_RAW/GSM5598265_matrix_inflection_demult
- 傅里叶级数
- Failed to upgrade schema, error: “file does not exist
- C#聯合halcon脫離halcon環境以及各種報錯解决經曆
- Account management of MySQL
- Grpc快速实践
- Detailed explanation of ThreadLocal
- Use blocking or non blocking for streamline
猜你喜欢

West digital decided to raise the price of flash memory products immediately after the factory was polluted by materials

Verilog avoid latch

MySQL index, transaction and storage engine

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

MySQL connection query and subquery

蓝桥杯单片机省赛第十届

Exchange rate query interface

Pycharm2021 delete the package warehouse list you added

Detailed explanation of the difference between Verilog process assignment
![[golang] leetcode intermediate bracket generation & Full Permutation](/img/93/ca38d97c721ccba2505052ef917788.jpg)
[golang] leetcode intermediate bracket generation & Full Permutation
随机推荐
leetcode-1380. Lucky number in matrix
KL divergence is a valuable article
Oracle 查看被锁的表和解锁
Basic syntax of unity script (7) - member variables and instantiation
Kotlin basic learning 15
Gradle notes
[untitled] basic operation of raspberry pie (2)
Intersection of Venn graph
Named block Verilog
一天上手Aurora 8B/10B IP核(5)----从Framing接口的官方例程学起
"Analysis of 43 cases of MATLAB neural network": Chapter 41 implementation of customized neural network -- personalized modeling and Simulation of neural network
[designmode] Prototype Pattern
Verilog state machine
/silicosis/geo/GSE184854_scRNA-seq_mouse_lung_ccr2/GSE184854_RAW/GSM5598265_matrix_inflection_demult
Large screen visualization from bronze to the advanced king, you only need a "component reuse"!
C # joint halcon out of halcon Environment and various Error Reporting and Resolution Experiences
蓝桥杯单片机省赛第十一届第一场
Merge interval, linked list, array
PY3 link MySQL
在QML中加载不同字体