本次问题在于开始编程时候根本没想好该怎么实现师兄的要求1:一个灯能亮or灭 2:实现PWM功能 3:能暂停and继续
记住老师说的话,编程一定要构思好才动手,而且本次放弃的太早,考验的就是你的编程能力
单片机源程序如下:
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "led.h"
- #include "timer.h"
- u8 data=1;
- u16 num=1;
- //函数名:main(void).
- //功能:初始化各类函数,在死循环内执行相应命令
- //输入参数:data,来自USART_RX_BUF[0]
- //返回值:NULL
- //时间:2018-7-27
- int main(void)
- {
- u8 t;
- u8 len;
- Stm32_Clock_Init(336,8,2,7);//设置时钟,168Mhz
- delay_init(168); //延时初始化
- uart_init(84,115200); //串口初始化为115200
- LED_Init(); //初始化与LED连接的硬件接口
- TIM14_PWM_Init(500-1,84-1); //2Khz的PWM.84M/84=1Mhz的计数频率,重装载值500
- while(1)
- {
- if(USART_RX_STA&0x8000)
- {
- len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
- printf("\r\n您发送的消息为:\r\n");
- for(t=0;t<len;t++)
- {
- USART1->DR=USART_RX_BUF[t];
- while((USART1->SR&0X40)==0);//等待发送结束
- }
- printf("\r\n\r\n");//插入换行
- USART_RX_STA=0;
- data=USART_RX_BUF[0];
- switch(data)
- {
- case 0x30: num=0; break;//按0 关
- case 0x31: num=1; break;//按1 开
- case 0x32: num=100; break;//按2 呼吸灯1
- case 0x33: num=200; break;//按3 呼吸灯2
- case 0x34: num=300; break;//按4 呼吸灯3
- case 0x35: num=5; break;//按5 暂停
- default:printf("\r\n 错误 \r\n");
- }
- }
- My_mainpwm(num);
- }
- }
- //函数名:My_mainpwm(u16 num).
- //功能:根据上一次输入data对应num选择相应LED0_PWM_VAL.
- //输入参数:num(对应LED0_PWM_VAL).
- //输出参数:NULL
- //返回值:NULL
- //时间:2018-7-27
- void My_mainpwm(u16 num)
- {
- static u16 led0pwmval=0;
- static u8 dir=1;
- switch(num)
- {
- case 0:LED0_PWM_VAL=0; break;//关灯
- case 1:LED0_PWM_VAL=400;break;//开灯
- case 100:
- case 200:
- case 300:
- delay_ms(10);
- //TIM14->CR1|=1<<0; //使能定时器
- if(dir)led0pwmval++;
- else led0pwmval--;
- if(led0pwmval>num)dir=0;
- if(led0pwmval==0)dir=1;
- LED0_PWM_VAL=led0pwmval; //开始或继续呼吸灯
- break;
- case 5: break;
- }
- }
复制代码
所有资料51hei提供下载:
寄存器串口控制呼吸灯最终版.rar
(133.77 KB, 下载次数: 73)
|