油烟机智能控制系统(A 平台)
一、任务
设计并制作油烟机智能控制系统。开机后,屏幕第一行显示"22 油烟机",第
二行显示“Y+抽签号后 3 位”显示(如 Y008),并自下而上滚动,3 秒钟后停止滚动。
画出系统各组件连接图,并简要说明,画出键盘图并标注各键功能。画出全部程序流
程图。必须使用答题纸作答,竞赛结束上交。
二、基本功能要求
(1)以 LCD12864 点阵屏作为显示终端,实时显示油烟浓度、环境温度、电机
挡位(关、1 档、2 档、3 档、自动、定时)状态等信息。
(2)通过烟雾检测传感器和温度传感器实时检测当前厨房油烟浓度和环境温度,
数据每隔 2 秒动态刷新,采用合理方式调整油烟浓度、温度信号变化,以产生可见动
态效果。
(3)可实现按键调整油烟机电机的转速,至少三档可调。
三、发挥要求
(1)可设置和显示当前时间(格式:**时:**分),可实现油烟机定时工作,
实现定时时间长短的调整。
(2)设计键盘输入,设置油烟浓度、环境温度限定值报警功能,设置数据掉电
不丢失,并实现声、光报警。
(3)通过电位器模拟输入,实现油烟浓度来自动控制抽油烟机电机启停和转速
调整。
(4)可通过红外遥控方式,实现油烟机电机启停和至少三档电机转速可调控制。
并使用学生示波器观察,画出单片机接收到的遥控数据波形,共多少位数据,每位数
据波形宽度时间和幅值。
#include<public.h>
#include<LCD12864.h>
#include<key.h>
#include<XPT2046.h>
#include<SMG.h>
#include<BEEP.h>
#include<IRED.h>
#include<ds1302.h>
#include<ds18b20.h>
#include<People_red.h>
#include<JQ8900.h>
#include<24c02.h>
/*中断等级
中断0 最高
定时器0
中断1
定时器1 最低 中断0在红外遥控里面
*/
sbit DSSS=P3^0;
sbit PWM=P3^7;
u16 XPT2046_num=0;
u8 temp_limit=28;
u16 temp_value=0;
u8 time_flag=0;
u16 time_shuxing=0;
u8 duty=0;
u8 key_num=0;
u8 posion_flag=0;
u8 mode=0;
u8 SetPlace=0;
u8 ding_time_fen=58;
u8 ding_time_shi=12;
u8 ding_time_long=0;
u8 time_flag11=0;
u16 time_flag22=0;
u8 ired_buf=0;
u8 hongwai_moto_flag=0;
void exti1_init(void)
{
IT1=1;//跳变沿触发方式(下降沿)
EX1=1;//打开INT1的中断允许
EA=1;//打开总中断
}
void time0_init(void)
{
TMOD|=0X01;//选择为定时器0模式,工作方式1
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
/*******************************************************************************
* 函 数 名 : time1_init
* 函数功能 : 定时器1中断配置函数,通过设置TH和TL即可确定定时时间
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void time1_init(void)
{
TMOD|=0X10;//选择为定时器0模式,工作方式1
TH1=0XFC; //给定时器赋初值,定时1ms
TL1=0X18;
ET1=1;//打开定时器1中断允许
EA=1;//打开总中断
TR1=1;//打开定时器
}
void youyanji()
{
time_shuxing++;
XPT2046_num=XPT2046_read_adc_value(1);
LCD12864_write_cmd(0x88+5);
LCD12864_write_data(XPT2046_num/1000+0X30); //写元素
LCD12864_write_data(XPT2046_num%1000/100+0X30); //写元素
LCD12864_write_data(XPT2046_num%1000%100/10+0X30); //写元素
LCD12864_write_data(XPT2046_num%10+0X30); //写元素
LCD12864_show_string(2,0,"v"); //写汉字
if((XPT2046_num>=2)&&(XPT2046_num<3))
{
posion_flag=1;
duty=50;
}
else if((XPT2046_num>=3)&&(XPT2046_num<4))
{
duty=70;
posion_flag=2;
}
else if((XPT2046_num>=4)&&(XPT2046_num<5))
{
duty=100;
posion_flag=3;
}
else if((XPT2046_num>=1)&&(XPT2046_num<2))
{
duty=0;
posion_flag=0;
}
if(ired_flag)
{
ired_buf=gired_data[2];//16进制 取十位/16 个位%16
ired_flag=0;
}
else
{
ired_buf=0; //按下时是遥控值 否则是0
}
if(ired_buf==0x45)
{
hongwai_moto_flag++;
if(hongwai_moto_flag==2)
{
hongwai_moto_flag=0;
}
}
if(hongwai_moto_flag==1)
{
if(ired_buf==0x46)
{
posion_flag=1;
duty=50;
}
else if(ired_buf==0x47)
{
posion_flag=2;
duty=70;
}
else if(ired_buf==0x44)
{
posion_flag=3;
duty=100;
}
else if(ired_buf==0x43)
{
posion_flag=0;
duty=0;
hongwai_moto_flag=0;
}
}
if(time_shuxing==50)
{
XPT2046_num=XPT2046_read_adc_value(4);
temp_value=ds18b20_read_temperture();//保留温度值小数后一位
if(temp_value<0)//负温度
{
temp_value=-temp_value;
}
time_shuxing=0;
LCD12864_write_cmd(0x80);
LCD12864_write_data(XPT2046_num/1000+0X30); //写元素
LCD12864_write_data(XPT2046_num%1000/100+0X30); //写元素
LCD12864_write_data(XPT2046_num%1000%100/10+0X30); //写元素
LCD12864_write_data(XPT2046_num%10+0X30); //写元素
LCD12864_write_cmd(0x80+4);
LCD12864_write_data(temp_value/1000+0x30);//百位
LCD12864_write_data(temp_value%1000/100+0x30);//十位
LCD12864_write_data(temp_value%100/10+0x30);//个位
LCD12864_write_data('.');//小数点后一位
LCD12864_write_data(temp_value%10+0x30);//小数点后一位
LCD12864_write_data('C');//小数点后一位
LCD12864_show_string(2,1,"电机:");
}
if(posion_flag==0)
LCD12864_show_string(5,1,"关");
if(posion_flag==1)
LCD12864_show_string(5,1,"1 ");
if(posion_flag==2)
LCD12864_show_string(5,1,"2 ");
if(posion_flag==3)
LCD12864_show_string(5,1,"3 ");
LCD12864_write_cmd(0x90);
LCD12864_write_data(duty/100+0x30);//百位
LCD12864_write_data(duty%100/10+0x30);//十位
LCD12864_write_data(duty%10+0x30);//十位
if((ding_time_fen!=0)&&(ding_time_shi!=0))
{
LCD12864_show_string(6,1,"定时");
}
else
{
LCD12864_show_string(6,1,"关闭");
}
if(((gDS1302_TIME[1]/16*10+gDS1302_TIME[1]%16)==ding_time_fen))
{
time_flag11++;
if(time_flag11==1)
{
time_flag22=gDS1302_TIME[1]/16*10+gDS1302_TIME[1]%16;
}
if(time_flag11==3)
{
time_flag11=2;
}
}
if(time_flag11!=0)
{
if((ding_time_long-((gDS1302_TIME[1]/16*10+gDS1302_TIME[1]%16)-time_flag22))>0)
{
duty=70;
posion_flag=2;
LCD12864_write_cmd(0x98+2);
LCD12864_write_data(time_flag11+0x30);//百位
}
else
{
duty=0;
posion_flag=0;
LCD12864_write_cmd(0x98+2);
LCD12864_write_data(time_flag11+0x30);//百位
}
}
if(((gDS1302_TIME[1]/16*10+gDS1302_TIME[1]%16)==ding_time_fen))
{
LCD12864_write_cmd(0x98+2);
LCD12864_write_data(time_flag11+0x30);//百位
}
LCD12864_write_cmd(0x98);
LCD12864_write_data((gDS1302_TIME[2]/16*10+gDS1302_TIME[2]%16)/100+0x30);//百位
LCD12864_write_data((gDS1302_TIME[2]/16*10+gDS1302_TIME[2]%16)%100/10+0x30);//十位
LCD12864_write_data((gDS1302_TIME[2]/16*10+gDS1302_TIME[2]%16)%10+0x30);//十位
LCD12864_write_cmd(0x98+3);
LCD12864_write_data(gired_data[2]/16+0x30);//百位
LCD12864_write_data(gired_data[2]%16+0x30);//十位
//LCD12864_write_data((gDS1302_TIME[2]/16*10+gDS1302_TIME[2]%16)%10+0x30);//十位
if(temp_value/10>=temp_limit)
{
SendData(0x0a);
SendData(0x03);
SendData(0x0b);// 0x0b是播报 0x0c是设置音量
delay_10us(50000); //后面需要延迟 延迟的时间和语音时间长短有关
}
if(key_num==10)
{
temp_limit++;
}
else if(key_num==11)
{
temp_limit--;
}
if(key_num==12)
{
at24c02_write_one_byte(2,temp_limit);
}
if(key_num==13)
{
temp_limit=at24c02_read_one_byte(2);
}
LCD12864_write_cmd(0x98+5);
LCD12864_write_data(temp_limit/10+0x30);//百位
LCD12864_write_data(temp_limit%10+0x30);//十位
}
void adjust_speed()
{
if(key_num==1)
{
posion_flag=1;
duty=50;
}
else if(key_num==2)
{
duty=70;
posion_flag=2;
}
else if(key_num==3)
{
posion_flag=3;
duty=100;
}
else if(key_num==4)
{
posion_flag=0;
duty=0;
}
}
void time_xiugai()
{
if(key_num==0) //检测按键K1是否按下
{
SetPlace++;
if(SetPlace>=7)
SetPlace=0;
}
if(key_num==1) //检测按键K2是否按下
{
gDS1302_TIME[SetPlace]++;
if((gDS1302_TIME[SetPlace]&0x0f)>9) //换成BCD码。
{
gDS1302_TIME[SetPlace]=gDS1302_TIME[SetPlace]+6;
}
if((gDS1302_TIME[SetPlace]>=0x60)&&(SetPlace<2)) //分秒只能到59
{
gDS1302_TIME[SetPlace]=0;
}
if((gDS1302_TIME[SetPlace]>=0x24)&&(SetPlace==2)) //小时只能到23
{
gDS1302_TIME[SetPlace]=0;
}
if((gDS1302_TIME[SetPlace]>=0x32)&&(SetPlace==3)) //日只能到31
{
gDS1302_TIME[SetPlace]=0;
}
if((gDS1302_TIME[SetPlace]>=0x13)&&(SetPlace==4)) //月只能到12
{
gDS1302_TIME[SetPlace]=0;
}
if((gDS1302_TIME[SetPlace]>=0x7)&&(SetPlace==5)) //周只能到7
{
gDS1302_TIME[SetPlace]=1;
}
}
}
void LCD_display()
{
LCD12864_write_cmd(0x88+0);
LCD12864_write_data('0'+gDS1302_TIME[2]/16); //时
LCD12864_write_data('0'+(gDS1302_TIME[2]&0x0f));
LCD12864_write_data('-');
LCD12864_write_data('0'+gDS1302_TIME[1]/16); //分
LCD12864_write_data('0'+(gDS1302_TIME[1]&0x0f));
LCD12864_write_data('-');
LCD12864_write_data('0'+gDS1302_TIME[0]/16); //秒
LCD12864_write_data('0'+(gDS1302_TIME[0]&0x0f));
}
void ding_time()
{
if(key_num==0)
{
ding_time_fen++;
if(ding_time_fen==60)
ding_time_fen=0;
}
if(key_num==1)
{
ding_time_shi++;
if(ding_time_fen==24)
ding_time_fen=0;
}
if(key_num==2)
{
ding_time_long++;
}
LCD12864_write_cmd(0x80+0);
LCD12864_write_data('0'+ding_time_shi/10); //时
LCD12864_write_data('0'+ding_time_shi%10);
LCD12864_write_data('-');
LCD12864_write_data('0'+ding_time_fen/10); //分
LCD12864_write_data('0'+ding_time_fen%10);
LCD12864_write_data('-');
LCD12864_write_data('0'+ding_time_long/100); //分
LCD12864_write_data('0'+ding_time_long%100/10);
LCD12864_write_data('0'+ding_time_long%10);
}
int main()
{
u8 power_cnt1=0;
power_cnt1=power_cnt(8);
PWM=0;
LCD12864_inti();
ds18b20_init( );
gundong();
time1_init();
ds1302_init();//初始化DS130
ired_init();//红外初始化
while(1)
{
key_num=key_scan2();
LCD12864_write_cmd(0x98+7);
LCD12864_write_data('0'+mode); //时
if(power_cnt1!=1)
temp_limit=at24c02_read_one_byte(2);
if(key_num==15)
{
mode++;
if(mode==6)
{
mode=0;
}
LCD12864_write_cmd(0x01);
}
if(key_num==14)
{
mode--;
if(mode==0)
{
mode=0;
}
LCD12864_write_cmd(0x01);
}
if(mode==0)
{
youyanji();
adjust_speed();
LCD_display() ;
}
if(mode==1)
{
ding_time();
}
if(mode==4)
{
LCD_display();
LCD12864_write_cmd(0x80+7);
LCD12864_write_data('0'+SetPlace); //时
time_xiugai();
}
if((mode!=4)&&(mode!=5))
{
ds1302_read_time();
}
if(mode==5&&key_num==15)
{
ds1302_init();//初始化DS130
}
}
}
void time0() interrupt 1 //定时器0中断函数
{
static u16 i;//定义静态变量i
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
i++;
}
//void exti1() interrupt 2 //外部中断1中断函数
//{
//
//}
void time1() interrupt 3 //定时器1中断函数
{
static u16 i;//定义静态变量i
static u16 ii;
TH1=0XFC; //给定时器赋初值,定时1ms
TL1=0X18;
i++;
ii++;
if(i==1000)
{
time_flag++;
if(time_flag==3)
{
time_flag=0;
}
i=0;
}
if(ii>=100)
{
ii=0;
}
if(ii>duty)
{
PWM=0;
}
else
{
PWM=1;
}
}