STM8单片机学习总结初步03
扫描二维码
随时随地手机看文章
实物焊接及对应驱动程序全部调试完成,视屏地址为:自制蓝牙灯操作视屏
网络地址:http://v.youku.com/v_show/id_XMjk0ODk1MjUyMA==.html;
实物图01为:
实物图02为:
---------------
对程序代码均使用“函数分割”形式实现,并添加“适当注释”,这种代码编写方式在初期编写时,会很繁琐,因为其将本可使用“1个函数”实现的代码分割为“2个或2个以上”的“函数”,但在后期维护或是别人接手你的“代码”时,会大大缩短所需时间;
在实际工作中,个人建议,所有东西留2份,若你是个好人,请直接忽略“02”所说内容!!!:
01、第一份:带详细内容注释、问题注释、注意事项等内容,可以让你即时过1年以后,也能在10分钟内把握到核心脉络;
02、第二份:删除主要的内容注释、问题注释、注意事项等内容,让后面的工作变得繁琐一些;好心点的能做到“不留BUG”,这个可以适时考虑;次一点的,会留很多“后窗”,这个相当不推荐;
由于“代码”自由度太高,编写代码的方式也千变万化,所以没有统一的强制规范,到现在为止,也只是有部分所谓的“编程标准”而已,至于“遵守或不遵守”,这就是“个人问题”了;
坊间有句话:“最烦被人写注释,更烦别人不写注释”,这种说法“懂的人自然懂”,就不赘述了;
一下是本人从工程中截取的一些函数,其中:
01、“主函数”只做“按键检测”;
02、“蓝牙”使用“USART中断”执行,保证“实时性”;
03、使用“TIM4”控制“小功率LED灯”进行“0.5m/次”亮灭闪烁,用于指示“程序是否正在运行”;
程序架构及写法均为个人见解,高手见谅:
01、主函数只做“按键检测”为:
int main(void)
{
// 临时变量,为程序后续运行方便而定义
uint8_t i = 0;
uint8_t key_value = 0;
uint8_t key01_num = 0,key02_num = 0,key03_num = 0;
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
Led_GPIO_Init();
Relay_GPIO_Init();
Relay_Left_ALL_OFF();
Relay_Right_ALL_OFF();
Key_Init_No_Interrupt_Func();
USART1_Init();//"USART1"初始化函数
__enable_interrupt();
TIM4_Init();
Relay_Left_ALL_OFF();
Relay_Right_ALL_OFF();
while (1)
{
key_value = Key_Get_Value_No_Interrupt_Func(1);
if(0 != key_value)
{
switch(key_value)
{
case 1:
{
key_value = 0;
key01_num++;
if(4 == key01_num)
{
key01_num = 0;
}
Relay_Right_Single_ON(key01_num);
break;
}
case 2:
{
key_value = 0;
key02_num++;
if(4 == key02_num)
{
key02_num = 0;
}
Relay_Left_Single_ON(key02_num);
break;
}
case 3:
{
key_value = 0;
key03_num++;
if(key03_num >= 12)
{
key03_num = 0;
}
if((key03_num%2))
{
Relay_Left_ALL_OFF();
Relay_Right_ALL_OFF();
}
else
{
Relay_Left_ALL_ON();
Relay_Right_ALL_ON();
}
break;
}
default:
{
break;
}
}
}
}
return 0;
}
02、“USART中断响应函数”,响应函数位于“stm8s_it.c”中:
i)、“串口初始化”函数:
void USART1_Init(void)
{
//初始化"USART1"
UART1_Init((u32)115200, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO,
UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);
//开启"USART1"接收中断
UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);
//启动"USART1"
UART1_Cmd(ENABLE);
}
ii)、“串口响应函数”:
INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18)
{
uint8_t temp_rec;
temp_rec = UART1_ReceiveData8();
USART1_RX_Date_uint8_t = temp_rec;//=========================
//USART1_Flag = 1;
Relay_Left_Right_USART1_Action(USART1_RX_Date_uint8_t);//=========================
UART1_ClearITPendingBit(UART1_IT_RXNE);//清"中断"
UART1_SendData8(temp_rec);
while((UART1_GetFlagStatus(UART1_FLAG_TXE)) == RESET);//等待发送数据完成
}
03、“TIM4”函数,响应函数位于“stm8s_it.c”中::
i)、“TIM4初始化函数”:
void TIM4_Init(void)
{
TIM4_TimeBaseInit(TIM4_PRESCALER_128, 0xFF); //初始化,"分频"、"初始值"
TIM4_ClearFlag(TIM4_FLAG_UPDATE); //清"标志"
TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE); //配置"中断设置"
TIM4_Cmd(ENABLE); //开启"定时器TIM4"
}
ii)、“TIM4响应函数”:
INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)
{
cnt_tim4++;
if(cnt_tim4==480)
{
Led_Triggle();
cnt_tim4=0;
}
TIM4_ClearITPendingBit(TIM4_IT_UPDATE);//清"中断"
}
只要借助以上几个主要函数,再结合“GPIO”控制“Relay驱动电路”就可以直接控制“功率LED灯”的有效动作;
Note:实际使用时,可以将“功率LED灯”换为其他“驱动器件”,进而控制“市电”或“其他用电器”的有效工作,实现简单的“智能家居控制”,但此时“电压过高”,“危险性很大”,有需要,还是找专业人士更为可靠,切忌“胡乱尝试”;