基于STM8105,使用库函数V2.1编写的切换测试程式

该博客介绍了一款基于STM8S105K4微控制器的主板控制程序,利用库函数V2.1实现了与上位机的通讯,通过串口进行数据交换,对主板的DC电压和继电器状态进行控制。程序包括USART初始化、IO口初始化、延时函数和主函数,通过中断处理接收和响应来自上位机的命令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**说明************************************************************
MCU:STM8S105K4
FREQ:内部2MHz
TIME:2014-10-20
FUNCTION:与上位机通讯实现对主板的控制
**头文件***********************************************************/
#include <stm8s.h>
#include <stm8s_it.h>
const unsigned char author[]={'w','h','p'};
/**宏定义************************************************************/
#define DATA_BEGIN 0xAA //起始命令
unsigned char RECE_FLAG=1,R_count; //计数标志
unsigned char T_data1; //定义2位输出变量
unsigned char getok=0;
u8 R_buffer[4];
//u8 T_buffer[13]; //缓存区
//unsigned char index; //位序指针
//fmaster=fcpu=2MHz
/*****delay*********************************************************/
void _delay_ms(unsigned char ms)
{
unsigned char i,j;
while(ms--)
{
for(i=4;i!=0;i--)
for(j=100;j!=0;j--);
}
}
/**USART初始化*******************************************************/
void UART_init()
{
UART2_DeInit();
//UART初始化19200,8位,1停止位,接收发送使能
UART2_Init((u32)19200, UART2_WORDLENGTH_8D, UART2_STOPBITS_1, UART2_PARITY_NO,
UART2_SYNCMODE_CLOCK_DISABLE, UART2_MODE_TXRX_ENABLE);
UART2_ITConfig(UART2_IT_RXNE_OR, ENABLE); //使能接收中断
// UART2_ITConfig(UART2_IT_TXE, ENABLE); //发送寄存器空中断使能
// UART2_ITConfig(UART2_IT_TXE, DISABLE); //关串口开始发送中断
// UART2_ITConfig(UART2_IT_TC, DISABLE); //关串口发送结束中断
UART2_Cmd(ENABLE); //使能UART
}
/****IO口初始化*****************************************************/
void IO_init()
{
GPIO_DeInit(GPIOC);
GPIO_Init(GPIOD, GPIO_PIN_6, GPIO_MODE_IN_PU_NO_IT); //RX内部上拉,去除干扰
GPIO_Init(GPIOC, GPIO_PIN_ALL, GPIO_MODE_OUT_PP_LOW_SLOW);//初始化PC口
}
/**发送子函数********************************************************/
void send(u8 c)
{
UART2_SendData8(c);
while (UART2_GetFlagStatus(UART2_FLAG_TXE)==RESET);//发送数据寄存器非空则等待
}
/**主函数************************************************************/
int main()
{
IO_init(); //控制PORT口初始化
UART_init(); //UART初始化
enableInterrupts(); //开全局中断
//中断函数写进 stm8s_it.c 中
while(1)
{
if(!RECE_FLAG) //RECE_FLAG=0代表接收完成
{
switch(R_buffer[1])
{
case 0xF0: //读版本号
getok=2;
break;
case 0x01: //测DC5V
GPIO_WriteHigh(GPIOC, GPIO_PIN_6);
_delay_ms(100);
getok=1;
break;
case 0x02: //测DC3.3V
GPIO_WriteHigh(GPIOC, GPIO_PIN_4);
_delay_ms(100);
getok=1;
break;
case 0x03: //测DC24V
GPIO_WriteHigh(GPIOC, GPIO_PIN_7);
_delay_ms(100);
getok=1;
break;
case 0x04: //测DC22V
GPIO_WriteHigh(GPIOC, GPIO_PIN_5);
_delay_ms(100);
getok=1;
break;
case 0x30: //测量继电器复位
GPIO_WriteLow(GPIOC, GPIO_PIN_HNIB);
_delay_ms(100);
getok=1;
break;
case 0x31: //上电5V
GPIO_WriteHigh(GPIOC, GPIO_PIN_2);
_delay_ms(100);
getok=1;
break;
case 0x32: //上电24V
GPIO_WriteHigh(GPIOC, GPIO_PIN_3);
_delay_ms(100);
getok=1;
break;
case 0x33: //所有继电器关闭
GPIO_WriteLow(GPIOC, GPIO_PIN_ALL);
_delay_ms(100);
getok=1;
break;
default:
_delay_ms(100);
getok=0;
break;
}
T_data1=R_buffer[1];
switch (getok)
{
case 2:
send(DATA_BEGIN);
send(0xF0);
send(0x0D);
send(0xA9);
send(0x30);
send(0x47);
send(0x39);
send(0xE1);
send(0x01);
send(0);
send(0);
send(0);
send(0xE5);
break;
case 1:
send(DATA_BEGIN);
send(T_data1);
send(0x05);
send(0x01);
send((170+T_data1+5+1)%255);
break;
case 0:
send(DATA_BEGIN);
send(T_data1);
send(0x05);
send(0x00);
send((170+T_data1+5+1)%255);
break;
default:
send(DATA_BEGIN);
send(T_data1);
send(0x05);
send(0x00);
send((170+T_data1+5)%255);
break;
}
RECE_FLAG=1; //处理完一个数据包,开启能接收标志
getok=0;
}
}
}

#ifdef USE_FULL_ASSERT

/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval : None
*/
void assert_failed(u8* file, u32 line)
{
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

/* Infinite loop */
while (1)
{
}
}
#endif

/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值