标题:
stm32寄存器串口pwm控制呼吸灯最终版源码
[打印本页]
作者:
5552p
时间:
2018-7-31 23:02
标题:
stm32寄存器串口pwm控制呼吸灯最终版源码
本次问题在于开始编程时候根本没想好该怎么实现师兄的要求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)
2018-7-31 23:35 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
lemonluilui
时间:
2019-7-13 18:55
请问一下case 0x30 是怎么实现的呢 USART_RX_STA里面的数据是按照十六进制存储的吗
作者:
xiaozhong1314
时间:
2019-7-13 22:15
if(USART_RX_STA&0x8000) 想问一下这个什么意思啊
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1