- /*=============================================================================
- * filename: main.c
- * author: Wood Wang
- * date: 2020.03
- * describe:
- *===========================================================================*/
- /* Includes -----------------------------------------------------------------*/
- #include "main.h"
- #include "oled.h"
- sbit led1 = P5^2;
- sbit led2 = P5^3;
- sbit beep = P1^0;
- U16 RH_Read_Time;
- U8 P_Check;
- //=================================================================
- //
- //=================================================================
- volatile unsigned int TimeTick;
- volatile unsigned int Time_1ms;
- void Delay_ms(unsigned int ms)
- {
- Time_1ms = ms;
- while(Time_1ms);
- }
- void Delay_us(unsigned int us)
- {
- unsigned char i;
- while(us--) for(i=30;i>0;i--) ;
- }
- //=============================================================
- void Timer01_Init(void)
- {
- TimeTick = 0;
- //Timer0=1ms
- TMOD = 0X11; //16位定时器
- TCON = 0X00;
- TMCON = 0X00; //12分频
- TL0 = (65536-(32000/(12*1))); //定时1ms
- TH0 = (65536-(32000/(12*1)))>>8; //
- TR0 = 1;
- ET0 = 1; //中断
- //Timer1=100us
- TL1 = (65536-(3200/(12*1))); //定时100us
- TH1 = (65536-(3200/(12*1)))>>8; //
- TR1 = 1;
- ET1 = 1; //中断
- }
- void GPIO_Init(void)
- {
- P0CON = 0x00; //设置P0为输入带上拉模式
- P0PH = 0xFF;
- P1CON = 0x01; //设置P1为高阻输入模式
- P1PH = 0x00;
- P2CON = 0xFC; //设置P20,P21为输入带上拉模式,其他推挽输出
- P2PH = 0x03;
- P3CON = 0xFF; //设置P3为强推挽模式
- P3PH = 0x00;
- P4CON = 0xFF; //设置P4为强推挽模式
- P4PH = 0x00;
- P5CON = 0xFF; //设置P5为强推挽模式
- P5PH = 0x00;
- //P16,P17=外部中断
- P1CON &= 0X3F; //中断IO口设置为高阻输入
- P1PH |= 0xC0; //中断IO口设置为高阻带上拉
- //配置P16下降沿中断、P17边沿中断
- //下降沿设置
- INT0F = 0X00 ; //xxxx 0000 0关闭 1使能
- INT1F = 0XC0 ; //xxxx xxxx 0关闭 1使能
- INT2F = 0X00 ; //0000 xxxx 0关闭 1使能
- //上升沿设置
- INT0R = 0X00 ; //xxxx 0000 0关闭 1使能
- INT1R = 0X80 ; //xxxx xxxx 0关闭 1使能
- INT2R = 0X00 ; //0000 xxxx 0关闭 1使能
- //外部中断设置
- IE &= ~0x01; //0000 0x0x INT0使能
- IE |= 0x04; //0000 0x0x INT1使能
- IE1 &= ~0x08; //0000 x000 INT2使能
- beep = 1;
- led1 = 1;
- led2 = 1;
- }
- //==============================================
- int main(void)
- {
- U8 str[16];
- U8 IR_num;
- U8 rh,tem;
- float t;
- RH_Read_Time = 0;
- P_Check = 0;
- GPIO_Init();
- Timer01_Init();
- BTM_Init();
- EA = 1;
- Uart_Init(0,115200); //调试
- Uart0SendStr("SinOne SC95F8617 Test. By WoodData.\n");
- OLED_Init();
- LCD12864RAM_ShowString(0,0,"SinOne SC95F8617.By WoodData.");
- LCD12864RAM_DrawRect(0,0,OLED_MAX_X,OLED_MAX_Y,1);
- LCD12864RAM_Refresh();
- Delay_ms(1000);
- LCD12864RAM_Clear();
- if(IR_Init() == 0) Uart0SendStr("VS1838B IR Init OK.\n");
- if(DS18B20_Init() == 0) Uart0SendStr("DS18B20 Init OK.\n");
- if(DHT11_Init() == 0) Uart0SendStr("DHT11 Init OK.\n");
- while(1)
- {
- if(IR_Process(&IR_num) == 1)
- {
- sprintf(str,"IR Key:%3bu\n",IR_num);
- LCD12864RAM_ShowString(0,0,str);
- LCD12864RAM_Refresh();
- Uart0SendStr(str);
- }
- if(RH_Read_Time == 0)
- {
- if(RH_Read(&rh,&tem) == 0)
- {
- sprintf(str,"H:%3bu,T:%3bu\n",rh,tem);
- LCD12864RAM_ShowString(0,16,str);
- LCD12864RAM_Refresh();
- Uart0SendStr(str);
- }
- t = DS18B20_TempValue(DS18B20_Temp_Raw());
- sprintf(str,"T:%0.2f",t);
- LCD12864RAM_ShowString(0,32,str);
- LCD12864RAM_Refresh();
- Uart0SendStr(str);
- RH_Read_Time = 1000;
- }
- if(P_Check == 1)
- {
- LCD12864RAM_ShowString(0,48,"People In ");
- LCD12864RAM_Refresh();
- P_Check = 0;
- }else if(P_Check == 2)
- {
- LCD12864RAM_ShowString(0,48,"People Out");
- LCD12864RAM_Refresh();
- P_Check = 0;
- }
- }
- }
- //===============================================
- //中断
- void Timer0_ISR() interrupt 1
- {
- TL0 = (65536-(32000/(12*1))); //定时1ms
- TH0 = (65536-(32000/(12*1)))>>8; //
- if(Time_1ms) Time_1ms--;
- if(RH_Read_Time) RH_Read_Time--;
- TimeTick++;
- }
- void Timer1_ISR() interrupt 3
- {
- TL1 = (65536-(3200/(12*1))); //定时100us
- TH1 = (65536-(3200/(12*1)))>>8; //
-
- IR_Timer_Handler();
- }
- void EX0() interrupt 0
- {
- TCON &= 0XFD;
- }
- void EX1() interrupt 2
- {
- TCON &= 0XF7;
- //VS1838B红外解码
- if(P16 == 0) //下降沿
- {
- led1 = ~led1;
- IR_Receive_Handler();
- }
- //人体红外感应
- if(P17 == 0) //下降沿
- {
- //beep = 1;
- led2 = 1;
- P_Check = 2;
- }else
- {
- //beep = 0;
- led2 = 0;
- P_Check = 1;
- }
- }
- void EX2() interrupt 10
- {
- }