厨房危险监测报警系统设计_第1页
厨房危险监测报警系统设计_第2页
厨房危险监测报警系统设计_第3页
厨房危险监测报警系统设计_第4页
厨房危险监测报警系统设计_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

附录电路图源代码u16co;u8coshu[15];unsignedintcoyu=200;u8coyus[15];unsignedintyayu=150;u16ya;u8yas[15];u8yayus[15];intfragment=0;u8send[30];intbeepnum=0;intbiaozhi=0;intbiaozhi1=0;intbiaozhi2=0;intbiaozhi3=0;intbiaozhi4=0;intbiaozhi5=0;voidUSART1_Puts(char*str){while(*str){USART1->DR=*str++;while((USART1->SR&0X40)==0);}}voidUSART3_Puts(char*str){while(*str){USART3->DR=*str++;while((USART3->SR&0X40)==0);}}intmain(void){ inti,j; delay_init(); NVIC_Configuration(); OLED_Init(); OLED_ColorTurn(0);//0正常显示,1反色显示OLED_DisplayTurn(0);//0正常显示1屏幕翻转显示 OLED_Refresh(); OLED_Clear(); KEY_Init(); LED_Init(); beep_Init(); beep=0; Adc_Init(); //ADC初始化 usart2_init(9600);usart3_init(9600); JDQ1=1; JDQ2=1;JDQ3=1;OLED_ShowChinese(0,0,0,16);// OLED_ShowChinese(18,0,1,16);// OLED_ShowString(36,0,":",16); OLED_ShowString(0,20,"CO:",16); OLED_ShowChinese(0,40,2,16);//系 OLED_ShowChinese(18,40,3,16);//统 OLED_ShowString(36,40,":",16); OLED_Refresh();LED1=0;LED2=0;LED3=0; KEY_Init(); yayus[0]=yayu/100+'0'; yayus[1]=yayu%100/10+'0'; yayus[2]=yayu%10+'0'; yayus[3]=0; OLED_ShowString(95,0,yayus,16); coshu[0]=coyu/100+'0'; coshu[1]=coyu%100/10+'0'; coshu[2]=coyu%10+'0'; coshu[3]=0; OLED_ShowString(95,20,coshu,16); OLED_Refresh(); while(1) { if(USART3_RX_STA==1){ USART3_RX_STA=0; if(USART3_TX_BUF[0]=='w'){ if(USART3_TX_BUF[1]=='1'){ coyu=(USART3_TX_BUF[2]-'0')*100+(USART3_TX_BUF[3]-'0')*10+USART3_TX_BUF[4]-'0'; yayu=(USART3_TX_BUF[5]-'0')*100+(USART3_TX_BUF[6]-'0')*10+USART3_TX_BUF[7]-'0'; yayus[0]=yayu/100+'0'; yayus[1]=yayu%100/10+'0'; yayus[2]=yayu%10+'0'; yayus[3]=0; OLED_ShowString(95,0,yayus,16); coshu[0]=coyu/100+'0'; coshu[1]=coyu%100/10+'0'; coshu[2]=coyu%10+'0'; coshu[3]=0; OLED_ShowString(95,20,coshu,16); } } } ya=Get_Adc_Average(ADC_Channel_1,10); co=Get_Adc_Average(ADC_Channel_0,10)/10; coshu[0]=co/1000+'0'; coshu[1]=co%1000/100+'0'; coshu[2]=co%100/10+'0'; coshu[3]=co%10+'0'; OLED_ShowString(54,20,coshu,16); yas[0]=ya/1000+'0'; yas[1]=ya%1000/100+'0'; yas[2]=ya%100/10+'0'; yas[3]=ya%10+'0'; OLED_ShowString(54,0,yas,16); OLED_Refresh(); if(HW==0){ biaozhi3=1;JDQ3=0; OLED_ShowChinese(60,40,4,16);//系 OLED_ShowChinese(78,40,5,16);//统 OLED_Refresh(); }else{ biaozhi3=0;JDQ3=1; OLED_ShowChinese(60,40,6,16);//系 OLED_ShowChinese(78,40,7,16);//统 OLED_Refresh(); } if(ya>yayu){ biaozhi1=1;JDQ1=0; }else{ biaozhi1=0; } if(co>coyu){ biaozhi2=1;JDQ1=0; }else{ biaozhi2=0; } if(co<coyu&&ya<yayu){ JDQ1=1; } if(biaozhi1==1||biaozhi2==1||biaozhi3==1){ beep=0; delay_ms(500); }else{ delay_ms(500); beep=1; } send[0]='w';send[1]='1'; send[2]=co/1000+'0'; send[3]=co%1000/100+'0'; send[4]=co%100/10+'0'; send[5]=co%10+'0'; send[6]=ya/1000+'0'; send[7]=ya%1000/100+'0'; send[8]=ya%100/10+'0'; send[9]=ya%10+'0'; send[10]=biaozhi1%10+'0'; send[11]=biaozhi2%10+'0'; send[12]=biaozhi3%10+'0'; send[13]='z'; send[14]=0; USART3_Puts(send); if(KEY2==1){ } }}#include"key.h"voidKEY_Init(void){ GPIO_InitTypeDefGPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);//使能PORTA,PORTC时钟 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//关闭jtag,使能SWD,可以用SWD模式调试 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;//PA0 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//PA0设置成输入,默认下? GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化GPIOA.0 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;//PC5 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//设置成上拉输入 GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化GPIOC5 }#include"oled.h"#include"stdlib.h"#include"oledfont.h" #include"delay.h"u8OLED_GRAM[144][8];//反显函数voidOLED_ColorTurn(u8i){ if(i==0) { OLED_WR_Byte(0xA6,OLED_CMD);//正常显示 } if(i==1) { OLED_WR_Byte(0xA7,OLED_CMD);//反色显示 }}//屏幕旋转180度voidOLED_DisplayTurn(u8i){ if(i==0) { OLED_WR_Byte(0xC8,OLED_CMD);//正常显示 OLED_WR_Byte(0xA1,OLED_CMD); } if(i==1) { OLED_WR_Byte(0xC0,OLED_CMD);//反转显示 OLED_WR_Byte(0xA0,OLED_CMD); }}//起始信号voidI2C_Start(void){ OLED_SDIN_Set(); OLED_SCLK_Set(); OLED_SDIN_Clr(); OLED_SCLK_Clr();}//结束信号voidI2C_Stop(void){ OLED_SCLK_Set(); OLED_SDIN_Clr(); OLED_SDIN_Set();}//等待信号响应voidI2C_WaitAck(void)//测数据信号的电平{ OLED_SCLK_Set(); OLED_SCLK_Clr();}//写入一个字节voidSend_Byte(u8dat){ u8i; for(i=0;i<8;i++) { OLED_SCLK_Clr();//将时钟信号设置为低电平 if(dat&0x80)//将dat的8位从最高位依次写入 { OLED_SDIN_Set();} else { OLED_SDIN_Clr();} OLED_SCLK_Set();//将时钟信号设置为高电平 OLED_SCLK_Clr();//将时钟信号设置为低电平 dat<<=1;}}//发送一个字节//向SSD1306写入一个字节。//mode:数据/命令标志0,表示命令;1,表示数据;voidOLED_WR_Byte(u8dat,u8mode){ I2C_Start(); Send_Byte(0x78); I2C_WaitAck(); if(mode){Send_Byte(0x40);}else{Send_Byte(0x00);} I2C_WaitAck(); Send_Byte(dat); I2C_WaitAck(); I2C_Stop();}//开启OLED显示voidOLED_DisPlay_On(void){ OLED_WR_Byte(0x8D,OLED_CMD);//电荷泵使能 OLED_WR_Byte(0x14,OLED_CMD);//开启电荷泵 OLED_WR_Byte(0xAF,OLED_CMD);//点亮屏幕}//关闭OLED显示voidOLED_DisPlay_Off(void){ OLED_WR_Byte(0x8D,OLED_CMD);//电荷泵使能 OLED_WR_Byte(0x10,OLED_CMD);//关闭电荷泵 OLED_WR_Byte(0xAF,OLED_CMD);//关闭屏幕}//更新显存到OLED voidOLED_Refresh(void){ u8i,n; for(i=0;i<8;i++) { OLED_WR_Byte(0xb0+i,OLED_CMD);//设置行起始地址 OLED_WR_Byte(0x00,OLED_CMD);//设置低列起始地址 OLED_WR_Byte(0x10,OLED_CMD);//设置高列起始地址 for(n=0;n<128;n++) OLED_WR_Byte(OLED_GRAM[n][i],OLED_DATA);}}//清屏函数voidOLED_Clear(void){ u8i,n; for(i=0;i<8;i++) { for(n=0;n<128;n++) { OLED_GRAM[n][i]=0;//清除所有数据 }} OLED_Refresh();//更新显示}//画点//x:0~127//y:0~63voidOLED_DrawPoint(u8x,u8y){ u8i,m,n; i=y/8; m=y%8; n=1<<m; OLED_GRAM[x][i]|=n;}//清除一个点//x:0~127//y:0~63voidOLED_ClearPoint(u8x,u8y){ u8i,m,n; i=y/8; m=y%8; n=1<<m; OLED_GRAM[x][i]=~OLED_GRAM[x][i]; OLED_GRAM[x][i]|=n; OLED_GRAM[x][i]=~OLED_GRAM[x][i];}//画线//x:0~128//y:0~64voidOLED_DrawLine(u8x1,u8y1,u8x2,u8y2){ u8i,k,k1,k2; if((x1<0)||(x2>128)||(y1<0)||(y2>64)||(x1>x2)||(y1>y2))return; if(x1==x2)//画竖线 { for(i=0;i<(y2-y1);i++) { OLED_DrawPoint(x1,y1+i); }} elseif(y1==y2)//画横线 { for(i=0;i<(x2-x1);i++) { OLED_DrawPoint(x1+i,y1); }} else//画斜线 { k1=y2-y1; k2=x2-x1; k=k1*10/k2; for(i=0;i<(x2-x1);i++) { OLED_DrawPoint(x1+i,y1+i*k/10); } }}//x,y:圆心坐标//r:圆的半径voidOLED_DrawCircle(u8x,u8y,u8r){ inta,b,num;a=0;b=r;while(2*b*b>=r*r){OLED_DrawPoint(x+a,y-b);OLED_DrawPoint(x-a,y-b);OLED_DrawPoint(x-a,y+b);OLED_DrawPoint(x+a,y+b);OLED_DrawPoint(x+b,y+a);OLED_DrawPoint(x+b,y-a);OLED_DrawPoint(x-b,y-a);OLED_DrawPoint(x-b,y+a);a++;num=(a*a+b*b)-r*r;//计算画的点离圆心的距离if(num>0){b--;a--;}}}//在指定位置显示一个字符,包括部分字符//x:0~127//y:0~63//size:选择字体12/16/24voidOLED_ShowChar(u8x,u8y,u8chr,u8size1){ u8i,m,temp,size2,chr1; u8y0=y; size2=(size1/8+((size1%8)?1:0))*(size1/2);//得到字体一个字符对应点阵集所占的字节数 chr1=chr-'';//计算偏移后的值 for(i=0;i<size2;i++) { if(size1==12){temp=asc2_1206[chr1][i];}//调用1206字体 elseif(size1==16){temp=asc2_1608[chr1][i];}//调用1608字体 elseif(size1==24){temp=asc2_2412[chr1][i];}//调用2412字体 elsereturn; for(m=0;m<8;m++)//写入数据 { if(temp&0x80)OLED_DrawPoint(x,y); elseOLED_ClearPoint(x,y); temp<<=1; y++; if((y-y0)==size1) { y=y0; x++; break;} }}}//显示字符串//x,y:起点坐标//size1:字体大小//*chr:字符串起始地址voidOLED_ShowString(u8x,u8y,u8*chr,u8size1){ while((*chr>='')&&(*chr<='~'))//判断是不是非法字符! { OLED_ShowChar(x,y,*chr,size1); x+=size1/2; if(x>128-size1)//换行 { x=0; y+=2;} chr++;}}//m^nu32OLED_Pow(u8m,u8n){ u32result=1; while(n--) { result*=m; } returnresult;}////显示2个数字////x,y:起点坐标 ////len:数字的位数////size:字体大小voidOLED_ShowNum(u8x,u8y,u32num,u8len,u8size1){ u8t,temp; for(t=0;t<len;t++) { temp=(num/OLED_Pow(10,len-t-1))%10; if(temp==0) { OLED_ShowChar(x+(size1/2)*t,y,'0',size1);} else { OLED_ShowChar(x+(size1/2)*t,y,temp+'0',size1); }}}//显示汉字//x,y:起点坐标//num:汉字对应的序号voidOLED_ShowChinese(u8x,u8y,u8num,u8size1){ u8i,m,n=0,temp,chr1; u8x0=x,y0=y; u8size3=size1/8; while(size3--) { chr1=num*size1/8+n; n++; for(i=0;i<size1;i++) { if(size1==16) {temp=Hzk1[chr1][i];}//调用16*16字体 elseif(size1==24) {temp=Hzk2[chr1][i];}//调用24*24字体 elseif(size1==32) {temp=Hzk3[chr1][i];}//调用32*32字体 elseif(size1==64) {temp=Hzk4[chr1][i];}//调用64*64字体 elsereturn; for(m=0;m<8;m++) { if(temp&0x01)OLED_DrawPoint(x,y); elseOLED_ClearPoint(x,y); temp>>=1; y++; } x++; if((x-x0)==size1) {x=x0;y0=y0+8;} y=y0; } }}//num显示汉字的个数//space每一遍显示的间隔voidOLED_ScrollDisplay(u8num,u8space){ u8i,n,t=0,m=0,r; while(1) { if(m==0) { OLED_ShowChinese(128,24,t,16);//写入一个汉字保存在OLED_GRAM[][]数组中 t++; } if(t==num) { for(r=0;r<16*space;r++)//显示间隔 { for(i=0;i<144;i++) { for(n=0;n<8;n++) { OLED_GRAM[i-1][n]=OLED_GRAM[i][n]; } }OLED_Refresh(); }t=0;} m++; if(m==16){m=0;} for(i=0;i<144;i++)//实现左移 { for(n=0;n<8;n++) { OLED_GRAM[i-1][n]=OLED_GRAM[i][n]; } } OLED_Refresh(); }}//配置写入数据的起始位置voidOLED_WR_BP(u8x,u8y){ OLED_WR_Byte(0xb0+y,OLED_CMD);//设置行起始地址 OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD); OLED_WR_Byte((x&0x0f)|0x01,OLED_CMD);}//x0,y0:起点坐标//x1,y1:终点坐标//BMP[]:要写入的图片数组voidOLED_ShowPicture(u8x0,u8y0,u8x1,u8y1,u8BMP[]){ u32j=0; u8x=0,y=0; if(y%8==0)y=0; elsey+=1; for(y=y0;y<y1;y++) { OLED_WR_BP(x0,y); for(x=x0;x<x1;x++) { OLED_WR_Byte(BMP[j],OLED_DATA); j++;} }}//OLED的初始化voidOLED_Init(void){ GPIO_InitTypeDefGPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //使能A端口时钟 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//速度50MHz GPIO_Init(GPIOC,&GPIO_InitStructure); GPIO_SetBits(GPIOC,GPIO_Pin_13|GPIO_Pin_15); OLED_WR_Byte(0xAE,OLED_CMD);//--turnoffoledpanel OLED_WR_Byte(0x00,OLED_CMD);//setlowcolumnaddress OLED_WR_Byte(0x10,OLED_CMD);//sethighcolumnaddress OLED_WR_Byte(0x40,OLED_CMD);//--setstartlineaddressSetMappingRAMDisplayStartLine(0x00~0x3F) OLED_WR_Byte(0x81,OLED_CMD);//--setcontrastcontrolregister OLED_WR_Byte(0xCF,OLED_CMD);//SetSEGOutputCurrentBrightness OLED_WR_Byte(0xA1,OLED_CMD);//--SetSEG/ColumnMapping0xa0左右反置0xa1正常 OLED_WR_Byte(0xC8,OLED_CM

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论