OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6807|回复: 5

[战舰F103] 分享:串口发送数字,灯就闪几下,发个s1,s2,s3,s4就分别以100,200,300,400ms的速度闪烁

[复制链接]

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2018-10-16 20:56:25 | 显示全部楼层 |阅读模式
本帖最后由 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]


战舰:实验4 串口控制灯闪烁次数实验.zip

2.7 MB, 下载次数: 222

战舰:实验4 串口输入数字灯闪烁次数实验.zip

3.12 MB, 下载次数: 2329

业精于勤荒于嬉;行成于思毁于随!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
 楼主| 发表于 2019-1-21 19:53:06 | 显示全部楼层
用stm32f103串口接收数据时怎么把接收数据做判断处理
例如接收到48-50输出1,接收51-53输出0
           if (48<=num&&num<=50)
                {               
                      LED0=0;                                                        
                      printf("1 \n");        
                      delay_ms(1000);
                }

            if (51<=num&&num<=53)
                {               
                      LED1=0;                                                        
                      printf("2 \n");        
                      delay_ms(1000);
                }
                num=0;

战舰:串口接收数据判断,进行输出.zip

2.7 MB, 下载次数: 193

业精于勤荒于嬉;行成于思毁于随!
回复 支持 反对

使用道具 举报

9

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2019-1-3
在线时间
34 小时
发表于 2019-1-21 20:23:36 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

13

主题

633

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1331
金钱
1331
注册时间
2016-8-1
在线时间
229 小时
发表于 2019-1-22 10:53:57 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

6

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
146
金钱
146
注册时间
2019-7-1
在线时间
34 小时
发表于 2019-7-22 10:51:41 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2021-4-18
在线时间
6 小时
发表于 2021-4-19 22:01:23 | 显示全部楼层
学习学习
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-28 17:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表