硬件设计
链接:https://pan.baidu.com/s/19wTxekm79648fs_1JWFt_Q
提取码:btcm
代码设计
主程序:
#define __MIAN_C
#include "main.h"
#include "stdio.h"
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "bsp_gpio.h"
#include "bsp_clkconfig.h"
#include "bsp_delay.h"
#include "bsp_lcd1602.h"
#include "bsp_key.h"
#include "bsp_GeneralTim.h"
#include "bsp_display.h"
#include "bsp_at24c02.h"
#include "bsp_adc.h"
#include "bsp_ds1302.h"
#include "bsp_remote.h"
#include "bsp_28BYJ48.h"
// 局部变量,用于保存转换计算后的电压值
CreatByte Flag;
// ADC1转换的电压值通过MDA方式传到SRAM
extern volatile uint16_t ADC_ConvertedValue;
// 局部变量,用于保存转换计算后的电压值
uint8_t volatile ds[4] = {8, 30, 16, 20}; //定时控制开时、分、控制关时、分
uint16_t light; //存储光强
uint8_t volatile light_up = 80; //存储光强上、下限值
uint8_t volatile light_down = 30; //存储光强上、下限值
uint8_t mode = 0; //模式标记。=0手动,=1定时,=2光控
uint8_t moto_state = 0;
uint16_t moto_num = 0;
int main(void)
{
uint8_t lowtime = 0; //记录上次采集光强的时间
// 使用HSI,SYSCLK = 4M * RCC_PLLMul_x, x:[2,3,...16],最高是64MH
HSI_SetSysClock(RCC_PLLMul_2); //使用内部8MHz晶振,并设置PLL输出为8MHz
// 端口初始化
GPIO_Config();
EEPROM_Init();
GENERAL_TIM_Init();
Key_GPIO_Config();
DelayMs(200);
if (KEY_ENTER == 0)
{
DelayMs(50);
if (KEY_ENTER == 0)
{
EEPROM_WriteByte(PARAM_ADDR, ds[0]); //写入【定时时间】数据保存
EEPROM_WriteByte(PARAM_ADDR+1, ds[1]); //写入【定时时间】数据保存存
EEPROM_WriteByte(PARAM_ADDR+2, ds[2]); //写入【定时时间】数据保存存
EEPROM_WriteByte(PARAM_ADDR+3, ds[3]); //写入【定时时间】数据保存存
EEPROM_WriteByte(PARAM_ADDR+4, light_up); //写入【光强上限值】数据保存
EEPROM_WriteByte(PARAM_ADDR+5, light_down); //写入【光强下限值】数据保存
}
}
LCD_GPIO_Init();
LCD_Init();
LCD_Clear();
DelayMs(200);
LCD_DispStr(0, 0, " Welcome!!! ");
LCD_DispStr(0, 1, " By JH");
DelayMs(1000);
DS1302_Init();
// DS1302_WriteTime();
DS1302_ReadTime(); //读取日期、时间
ADCx_Init();
#ifndef _SIMULATION_
REMOTE_TIM_Init(); //仿真时不启用红外遥控
#endif
ULN_DQ_GPIO_Init();
LCD_Clear();
ds[0] = EEPROM_ReadByte(PARAM_ADDR); //读取存储的【定时时间】数据
ds[1] = EEPROM_ReadByte(PARAM_ADDR+1); //读取存储的【定时时间】数据
ds[2] = EEPROM_ReadByte(PARAM_ADDR+2); //读取存储的【定时时间】数据
ds[3] = EEPROM_ReadByte(PARAM_ADDR+3); //读取存储的【定时时间】数据
light_up = EEPROM_ReadByte(PARAM_ADDR+4); //读取存储的【光强上限值】数据
light_down = EEPROM_ReadByte(PARAM_ADDR+5); //读取存储的【光强下限值】数据
mode = EEPROM_ReadByte(PARAM_ADDR+6); //读取存储的【模式】数据
while (1)
{
if (set_f == 0) //正常显示
{
DS1302_ReadTime(); //读取日期、时间
if (timeBufDec[6] != lowtime) //时间过去一秒
{
lowtime = timeBufDec[6]; //重新记录时间
light = ADC_ConvertedValue; //读取AD值
light = 100 - light * 100 / 4096; //转换为光强
}
DispTime(); //更新显示数据
}
else if (set_f < 7) //校准日期、时间
{
DS1302_ReadTime(); //读取日期、时间
DispSetTime();
}
else if (set_f < 11) //设置定时
DispTimerTask();
else if (set_f < 13) //设置光强控制值
DispSetLight();
KeyProcess();
}
}
/*********************************************END OF FILE**********************/