?

菩提本无树,明镜亦非台,本来无一物,何处惹尘埃。
改一下错User\main.c(552): error: #159: declaration is incompatible with previous "Delay" (declared at line 332) #include "stm32f10x.h" #include "stm32f10x_rcc.h" #include "stm32f10x_gpio.h" #include "stm32f10x_adc.h" #include "stm32f10x_tim.h" #include "stm32f10x_i2c.h" #include "stm32f10x_rtc.h" #include "stm32f10x_pwr.h" #include "stm32f10x_bkp.h" // ?????? #define KEY_SET_PIN GPIO_Pin_11 #define KEY_SET_PORT GPIOB #define KEY_ADJ_PIN GPIO_Pin_1 #define KEY_ADJ_PORT GPIOB #define LED_ALARM_PIN GPIO_Pin_13 #define LED_ALARM_PORT GPIOB #define DHT11_PIN GPIO_Pin_0 #define DHT11_PORT GPIOA #define LIGHT_SENSOR_PIN GPIO_Pin_1 #define LIGHT_SENSOR_PORT GPIOA #define PWM_PIN GPIO_Pin_2 #define PWM_PORT GPIOA #define OLED_SCL_PIN GPIO_Pin_8 #define OLED_SDA_PIN GPIO_Pin_9 #define OLED_I2C_PORT GPIOB // OLED?? #define OLED_I2C I2C1 #define OLED_ADDRESS 0x3C #define OLED_WIDTH 128 #define OLED_HEIGHT 64 // DHT11?? #define DHT11_TIMEOUT 10000 // ???? volatile uint8_t set_mode = 0; // 0:?? 1:???? 2:???? volatile uint16_t light_value = 0; volatile uint8_t temperature = 0; volatile uint8_t humidity = 0; volatile uint8_t turbidity = 0; // ?????(0-100) // ???? void System_Init(void); void GPIO_Config(void); void ADC_Config(void); void TIM_Config(void); void RTC_Config(void); void RTC_SetTime(uint8_t hour, uint8_t min, uint8_t sec); void RTC_GetTime(uint8_t *hour, uint8_t *min, uint8_t *sec); void Key_Scan(void); void Update_Display(void); void Process_Control(void); uint8_t DHT11_Read(void); void OLED_Init(void); void OLED_WriteCommand(uint8_t cmd); void OLED_WriteData(uint8_t data); void OLED_SetCursor(uint8_t x, uint8_t y); void OLED_Clear(void); void OLED_PrintChar(char ch); void OLED_PrintString(char *str); void OLED_UpdateScreen(void); // ???? (6x8??) const uint8_t Font6x8[95][6] = { {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // space {0x00, 0x00, 0x5F, 0x00, 0x00, 0x00}, // ! // ??????,????????? {0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00}, // A {0x7F, 0x49, 0x49, 0x49, 0x36, 0x00}, // B {0x3E, 0x41, 0x41, 0x41, 0x22, 0x00}, // C {0x7F, 0x41, 0x41, 0x22, 0x1C, 0x00}, // D {0x7F, 0x49, 0x49, 0x49, 0x41, 0x00}, // E {0x7F, 0x09, 0x09, 0x09, 0x01, 0x00}, // F {0x3E, 0x41, 0x49, 0x49, 0x7A, 0x00}, // G {0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00}, // H {0x00, 0x41, 0x7F, 0x41, 0x00, 0x00}, // I {0x20, 0x40, 0x41, 0x3F, 0x01, 0x00}, // J {0x7F, 0x08, 0x14, 0x22, 0x41, 0x00}, // K {0x7F, 0x40, 0x40, 0x40, 0x40, 0x00}, // L {0x7F, 0x02, 0x0C, 0x02, 0x7F, 0x00}, // M {0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00}, // N {0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00}, // O {0x7F, 0x09, 0x09, 0x09, 0x06, 0x00}, // P {0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00}, // Q {0x7F, 0x09, 0x19, 0x29, 0x46, 0x00}, // R {0x46, 0x49, 0x49, 0x49, 0x31, 0x00}, // S {0x01, 0x01, 0x7F, 0x01, 0x01, 0x00}, // T {0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00}, // U {0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00}, // V {0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00}, // W {0x63, 0x14, 0x08, 0x14, 0x63, 0x00}, // X {0x07, 0x08, 0x70, 0x08, 0x07, 0x00}, // Y {0x61, 0x51, 0x49, 0x45, 0x43, 0x00}, // Z // ??0-9 {0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00}, // 0 {0x00, 0x42, 0x7F, 0x40, 0x00, 0x00}, // 1 {0x42, 0x61, 0x51, 0x49, 0x46, 0x00}, // 2 {0x21, 0x41, 0x45, 0x4B, 0x31, 0x00}, // 3 {0x18, 0x14, 0x12, 0x7F, 0x10, 0x00}, // 4 {0x27, 0x45, 0x45, 0x45, 0x39, 0x00}, // 5 {0x3C, 0x4A, 0x49, 0x49, 0x30, 0x00}, // 6 {0x01, 0x71, 0x09, 0x05, 0x03, 0x00}, // 7 {0x36, 0x49, 0x49, 0x49, 0x36, 0x00}, // 8 {0x06, 0x49, 0x49, 0x29, 0x1E, 0x00} // 9 }; // ????? uint8_t OLED_Buffer[OLED_WIDTH * OLED_HEIGHT / 8] = {0}; int main(void) { System_Init(); GPIO_Config(); ADC_Config(); TIM_Config(); RTC_Config(); OLED_Init(); // ???RTC??(????) RTC_SetTime(15, 30, 0); while(1) { // ??DHT11????? if(DHT11_Read() == 0) { // ????,???temperature?humidity??? } // ?????? light_value = ADC_GetConversionValue(ADC1); // ???????(??????????) turbidity = (light_value > 3000) ? 20 : (light_value > 2000 ? 50 : 80); // ???? Key_Scan(); // ??OLED?? Update_Display(); // ?????? Process_Control(); // ??500ms for(volatile int i=0; i<500000; i++); } } // ????? void System_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO | RCC_APB2Periph_ADC1, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_PWR | RCC_APB1Periph_BKP | RCC_APB1Periph_I2C1, ENABLE); } // GPIO?? void GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; // ???? (PB11, PB1) GPIO_InitStructure.GPIO_Pin = KEY_SET_PIN | KEY_ADJ_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(KEY_SET_PORT, &GPIO_InitStructure); // LED??? (PB13) GPIO_InitStructure.GPIO_Pin = LED_ALARM_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LED_ALARM_PORT, &GPIO_InitStructure); // ????? (PA1) GPIO_InitStructure.GPIO_Pin = LIGHT_SENSOR_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(LIGHT_SENSOR_PORT, &GPIO_InitStructure); // PWM?? (PA2) GPIO_InitStructure.GPIO_Pin = PWM_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(PWM_PORT, &GPIO_InitStructure); // OLED I2C (PB8-SCL, PB9-SDA) GPIO_InitStructure.GPIO_Pin = OLED_SCL_PIN | OLED_SDA_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(OLED_I2C_PORT, &GPIO_InitStructure); // DHT11??? (PA0) GPIO_InitStructure.GPIO_Pin = DHT11_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(DHT11_PORT, &GPIO_InitStructure); } // ADC??(?????) void ADC_Config(void) { ADC_InitTypeDef ADC_InitStructure; ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5); ADC_Cmd(ADC1, ENABLE); ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); ADC_SoftwareStartConvCmd(ADC1, ENABLE); } // TIM??(PWM??) void TIM_Config(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; // ??????? (1kHz PWM) TIM_TimeBaseStructure.TIM_Period = 999; // ARR TIM_TimeBaseStructure.TIM_Prescaler = 71; // 72MHz/(72*1000) = 1kHz TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // PWM???? TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0; // ?????0 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC3Init(TIM2, &TIM_OCInitStructure); // ??3??PA2 TIM_Cmd(TIM2, ENABLE); TIM_CtrlPWMOutputs(TIM2, ENABLE); } // RTC?? void RTC_Config(void) { // ??PWR?BKP?? PWR_BackupAccessCmd(ENABLE); BKP_DeInit(); // ??LSE?? RCC_LSEConfig(RCC_LSE_ON); while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET); // ??LSE??RTC??? RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); RCC_RTCCLKCmd(ENABLE); // ??RTC????? RTC_WaitForSynchro(); RTC_WaitForLastTask(); // ??RTC?? (1Hz) RTC_SetPrescaler(32767); // 32.768kHz / 32768 = 1Hz RTC_WaitForLastTask(); } // ??RTC?? void RTC_SetTime(uint8_t hour, uint8_t min, uint8_t sec) { uint32_t counter = sec + min*60 + hour*3600; // ????? RTC_WriteProtectionCmd(DISABLE); RTC_WaitForLastTask(); RTC_SetCounter(counter); RTC_WaitForLastTask(); // ????? RTC_WriteProtectionCmd(ENABLE); } // ??RTC?? void RTC_GetTime(uint8_t *hour, uint8_t *min, uint8_t *sec) { uint32_t counter = RTC_GetCounter(); *sec = counter % 60; *min = (counter / 60) % 60; *hour = (counter / 3600) % 24; } // ???? void Key_Scan(void) { static uint8_t key_set_last = 1; static uint8_t key_adj_last = 1; uint8_t key_set = GPIO_ReadInputDataBit(KEY_SET_PORT, KEY_SET_PIN); uint8_t key_adj = GPIO_ReadInputDataBit(KEY_ADJ_PORT, KEY_ADJ_PIN); // ????? if(key_set == 0 && key_set_last == 1) { set_mode = (set_mode + 1) % 3; // ?????? } key_set_last = key_set; // ?????(??????) if(set_mode > 0 && key_adj == 0 && key_adj_last == 1) { uint8_t h, m, s; RTC_GetTime(&h, &m, &s); if(set_mode == 1) { // ???? h = (h + 1) % 24; } else if(set_mode == 2) { // ???? m = (m + 1) % 60; } RTC_SetTime(h, m, s); } key_adj_last = key_adj; } // DHT11???? uint8_t DHT11_Read(void) { uint8_t data[5] = {0}; uint8_t i, j; // ???????? GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = DHT11_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(DHT11_PORT, &GPIO_InitStructure); // ??18ms GPIO_ResetBits(DHT11_PORT, DHT11_PIN); Delay(18000); // ??20-40us GPIO_SetBits(DHT11_PORT, DHT11_PIN); Delay(30); // ??????? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(DHT11_PORT, &GPIO_InitStructure); // ??DHT11?? if (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) != 0) return 1; while (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == 0); while (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) != 0); // ??40??? for (i = 0; i < 5; i++) { for (j = 0; j < 8; j++) { while (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == 0); Delay(40); if (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) != 0) { data[i] |= (1 << (7 - j)); while (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) != 0); } } } // ???? if (data[4] == (data[0] + data[1] + data[2] + data[3])) { humidity = data[0]; temperature = data[2]; return 0; // ?? } return 1; // ?? } // OLED??? void OLED_Init(void) { // I2C??? I2C_InitTypeDef I2C_InitStructure; I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_OwnAddress1 = 0x00; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = 100000; // 100kHz I2C_Init(OLED_I2C, &I2C_InitStructure); I2C_Cmd(OLED_I2C, ENABLE); // OLED????? OLED_WriteCommand(0xAE); // ???? OLED_WriteCommand(0xD5); // ???????? OLED_WriteCommand(0x80); OLED_WriteCommand(0xA8); // ?????? OLED_WriteCommand(0x3F); OLED_WriteCommand(0xD3); // ?????? OLED_WriteCommand(0x00); OLED_WriteCommand(0x40); // ??????? OLED_WriteCommand(0x8D); // ????? OLED_WriteCommand(0x14); OLED_WriteCommand(0x20); // ???????? OLED_WriteCommand(0x00); // ?????? OLED_WriteCommand(0xA1); // ?????? OLED_WriteCommand(0xC8); // ?????? OLED_WriteCommand(0xDA); // ??COM?????? OLED_WriteCommand(0x12); OLED_WriteCommand(0x81); // ????? OLED_WriteCommand(0xCF); OLED_WriteCommand(0xD9); // ??????? OLED_WriteCommand(0xF1); OLED_WriteCommand(0xDB); // ??VCOMH???? OLED_WriteCommand(0x40); OLED_WriteCommand(0xA4); // ?????? OLED_WriteCommand(0xA6); // ?????? OLED_WriteCommand(0xAF); // ???? OLED_Clear(); OLED_UpdateScreen(); } // OLED??? void OLED_WriteCommand(uint8_t cmd) { I2C_GenerateSTART(OLED_I2C, ENABLE); while(!I2C_CheckEvent(OLED_I2C, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(OLED_I2C, OLED_ADDRESS, I2C_Direction_Transmitter); while(!I2C_CheckEvent(OLED_I2C, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); I2C_SendData(OLED_I2C, 0x00); // ????: Co=0, D/C=0 while(!I2C_CheckEvent(OLED_I2C, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_SendData(OLED_I2C, cmd); while(!I2C_CheckEvent(OLED_I2C, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_GenerateSTOP(OLED_I2C, ENABLE); } // OLED??? void OLED_WriteData(uint8_t data) { I2C_GenerateSTART(OLED_I2C, ENABLE); while(!I2C_CheckEvent(OLED_I2C, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(OLED_I2C, OLED_ADDRESS, I2C_Direction_Transmitter); while(!I2C_CheckEvent(OLED_I2C, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); I2C_SendData(OLED_I2C, 0x40); // ????: Co=0, D/C=1 while(!I2C_CheckEvent(OLED_I2C, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_SendData(OLED_I2C, data); while(!I2C_CheckEvent(OLED_I2C, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_GenerateSTOP(OLED_I2C, ENABLE); } // ?????? void OLED_SetCursor(uint8_t x, uint8_t y) { OLED_WriteCommand(0xB0 + y); // ????? OLED_WriteCommand(x & 0xF); // ?????? OLED_WriteCommand(0x10 | (x >> 4)); // ?????? } // ?? void OLED_Clear(void) { for(uint16_t i=0; i<sizeof(OLED_Buffer); i++) { OLED_Buffer[i] = 0x00; } } // ???? void OLED_PrintChar(char ch) { if(ch < 32 || ch > 126) return; // ???????? uint8_t c = ch - 32; for(uint8_t i=0; i<6; i++) { OLED_WriteData(Font6x8[c][i]); } } // ????? void OLED_PrintString(char *str) { while(*str) { OLED_PrintChar(*str++); } } // ?????? void OLED_UpdateScreen(void) { for(uint8_t page=0; page<8; page++) { OLED_SetCursor(0, page); for(uint8_t col=0; col<128; col++) { OLED_WriteData(OLED_Buffer[page*128 + col]); } } } // ?????? void Update_Display(void) { char buf[20]; uint8_t hour, min, sec; RTC_GetTime(&hour, &min, &sec); OLED_Clear(); OLED_SetCursor(0, 0); // ???? sprintf(buf, "Time: %02d:%02d:%02d", hour, min, sec); OLED_PrintString(buf); // ???? OLED_SetCursor(0, 1); sprintf(buf, "Temp: %d C", temperature); OLED_PrintString(buf); // ???? OLED_SetCursor(0, 2); sprintf(buf, "Light: %d", light_value); OLED_PrintString(buf); // ???? OLED_SetCursor(0, 3); sprintf(buf, "Turbidity: %d%%", turbidity); OLED_PrintString(buf); // ?????? if(set_mode > 0) { OLED_SetCursor(0, 4); if(set_mode == 1) OLED_PrintString("Set Hour"); else if(set_mode == 2) OLED_PrintString("Set Minute"); } OLED_UpdateScreen(); } // ?????? void Process_Control(void) { uint8_t hour, min, sec; RTC_GetTime(&hour, &min, &sec); // ????????? if(light_value < 1000) { GPIO_WriteBit(LED_ALARM_PORT, LED_ALARM_PIN, (sec % 2) ? Bit_SET : Bit_RESET); // 1Hz?? } else { GPIO_WriteBit(LED_ALARM_PORT, LED_ALARM_PIN, Bit_RESET); } // ???? if(light_value < 1000 || hour >= 20) { // ???????8?? if(hour >= 20) { TIM_SetCompare3(TIM2, 800); // ???? (80%???) } else { TIM_SetCompare3(TIM2, 300); // ???? (30%???) } } else { TIM_SetCompare3(TIM2, 0); // ???? } } // ??????(????????????) void Delay(uint32_t nCount) { for(; nCount != 0; nCount--); }
最新发布
06-26
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值