当前位置:网站首页>蓝桥杯单片机省赛第五届
蓝桥杯单片机省赛第五届
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
边栏推荐
- 高性能 低功耗Cortex-A53核心板 | i.MX8M Mini
- IPhone 6 plus is listed in Apple's "retro products" list
- [golang] leetcode intermediate bracket generation & Full Permutation
- /silicosis/geo/GSE184854_ scRNA-seq_ mouse_ lung_ ccr2/GSE184854_ RAW/GSM5598265_ matrix_ inflection_ demult
- 蓝桥杯单片机第四届省赛
- 在QML中加载不同字体
- Exchange rate query interface
- ImageAI安装
- Kotlin basic learning 16
- How to establish its own NFT market platform in 2022
猜你喜欢
High performance and low power cortex-a53 core board | i.mx8m Mini
蓝桥杯单片机第四届省赛
[mv-3d] - multi view 3D target detection network
汇率的查询接口
On redis (II) -- cluster version
蓝桥杯单片机省赛第十一届第二场
Verilog state machine
Gradle foundation | customize the plug-in and upload it to jitpack
"Analysis of 43 cases of MATLAB neural network": Chapter 42 parallel operation and neural network - parallel neural network operation based on cpu/gpu
Screenshot literacy tool download and use
随机推荐
Global and Chinese markets for ultrasonic probe disinfection systems 2022-2028: Research Report on technology, participants, trends, market size and share
Kotlin basic learning 15
[golang] leetcode intermediate bracket generation & Full Permutation
蓝桥杯单片机省赛第十一届第二场
GSE104154_ scRNA-seq_ fibrotic MC_ bleomycin/normalized AM3
《MATLAB 神经网络43个案例分析》:第41章 定制神经网络的实现——神经网络的个性化建模与仿真
Gradle foundation | customize the plug-in and upload it to jitpack
Pointer array & array pointer
Haute performance et faible puissance Cortex - A53 Core Board | i.mx8m mini
Download and use of the super perfect screenshot tool snipaste
Global and Chinese market of bone adhesives 2022-2028: Research Report on technology, participants, trends, market size and share
Generate random numbers that obey normal distribution
[yolo3d]: real time detection of end-to-end 3D point cloud input
Basic syntax of unity script (6) - specific folder
Pycharm2021 delete the package warehouse list you added
Spark Tuning
Docker installs canal and MySQL for simple testing and implementation of redis and MySQL cache consistency
What is the binding path of SAP ui5
Merge interval, linked list, array
JS generate random numbers