当前位置:网站首页>蓝桥杯单片机省赛第五届
蓝桥杯单片机省赛第五届
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);
#endif
ds1302.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
边栏推荐
- MySQL connection query and subquery
- Named block Verilog
- Global and Chinese market of gynaecological health training manikin 2022-2028: Research Report on technology, participants, trends, market size and share
- C # joint halcon out of halcon Environment and various Error Reporting and Resolution Experiences
- How to establish its own NFT market platform in 2022
- Load different fonts in QML
- Generate random numbers that obey normal distribution
- Verilog avoid latch
- Retrofit's callback hell is really vulnerable in kotlin synergy mode
- Grpc快速实践
猜你喜欢
蓝桥杯单片机第四届省赛
知物由学 | 自监督学习助力内容风控效果提升
[C Advanced] brother Peng takes you to play with strings and memory functions
Haute performance et faible puissance Cortex - A53 Core Board | i.mx8m mini
Pointer array & array pointer
焱融看 | 混合云时代下,如何制定多云策略
halcon图像矫正
微信小程序中 在xwml 中使用外部引入的 js进行判断计算
Generate random numbers that obey normal distribution
跟着CTF-wiki学pwn——ret2shellcode
随机推荐
Network connection mode of QT
[HCIA continuous update] overview of dynamic routing protocol
ORA-01547、ORA-01194、ORA-01110
/silicosis/geo/GSE184854_scRNA-seq_mouse_lung_ccr2/GSE184854_RAW/GSM5598265_matrix_inflection_demult
Failed to upgrade schema, error: “file does not exist
What is the binding path of SAP ui5
Comment élaborer une stratégie nuageuse à l'ère des nuages mixtes
蓝桥杯单片机第四届省赛
C#联合halcon脱离halcon环境以及各种报错解决经历
UI (New ui:: MainWindow) troubleshooting
Pointer array & array pointer
Unity脚本的基础语法(7)-成员变量和实例化
[designmode] Prototype Pattern
JS generate random numbers
Docker安装canal、mysql进行简单测试与实现redis和mysql缓存一致性
Global and Chinese market of autotransfusion bags 2022-2028: Research Report on technology, participants, trends, market size and share
PY3 link MySQL
aaaaaaaaaaaaa
Use blocking or non blocking for streamline
[mv-3d] - multi view 3D target detection network