资深版主
- 积分
- 4306
- 金钱
- 4306
- 注册时间
- 2018-6-30
- 在线时间
- 808 小时
|
本帖最后由 1208 于 2019-12-7 10:56 编辑
本实验:怎么通过串口发送数字几灯就闪几下
比如发个5灯就闪五下然后熄灭或者长亮
再发个s1,s2,s3,s4就分别以100,200,300,400ms的速度闪烁
1)这里的问题要解决如何实现不同数字,灯对应的闪烁次数
且要做到就要考虑一百,一千,一万次以上
这里就写了一个函数用于接收不同数字大小
u32 tpingg(u32 tmp)
{
u32 num=1;
if(tmp==0) return 1;
while(tmp--)
num*=10;
return num;
}返回的是num是10的平方次数
USART_RX_BUF作为接收不同数字
len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
i=len-1; //得到相应的数字
while(len--) //位数递减
{
t=tpingg(len);
t2=USART_RX_BUF[i-len]-'0'; //数字
num+=t* t2 ;
}
如USART_RX_BUF接收到125,len就是3位数,即i=2,
len--会递减,即len=2,则USART_RX_BUF[0]=1,t=tpingg(2)=100
len--会再递减,即len=1,则USART_RX_BUF[1]=2,t=tpingg(1)=10
len--会再递减,即len=0,则USART_RX_BUF[2]=5,t=tpingg(0)=1
2)s1,s2,s3,s4就分别以100,200,300,400ms的速度闪烁
这个需要USART_RX_BUF[0]==‘0’,第二个USART_RX_BUF[1]==‘数字’
闪烁的速度可以通过延时函数来实现
if(USART_RX_BUF[0]=='s')
{
k=USART_RX_BUF[1]-'0';
for(j=0;j<10;j++)
{
LED0 =!LED0;
delay_ms(100*k);
}
}
[mw_shl_code=c,true]int main(void)
{
u16 num=0;
u16 t;
u16 k;
u16 len;
u16 i;
u16 j;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
LED_Init(); //LED端口初始化
KEY_Init(); //初始化与按键连接的硬件接口
while(1)
{
int t2;
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
printf("\r\n您发送的消息为:\r\n\r\n");
for(t=0;t<len;t++)
{
USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
}
printf("\r\n\r\n");
if(USART_RX_BUF[0]=='s')
{
k=USART_RX_BUF[1]-'0';
for(j=0;j<10;j++)
{
LED0 =!LED0;
delay_ms(100*k);
}
}
else
{
i=len-1;
while(len--) //几位数
{
t=tpingg(len);
t2=USART_RX_BUF[i-len]-'0'; //ACSII数字
num+=t* t2 ;
}
while(num--)
{
LED0 =!LED0;
delay_ms(100);
printf("%d--\r\n",num);
}
num=0;
}
USART_RX_STA=0;
}
}
}[/mw_shl_code]
|
|