本次問題在于開始編程時候根本沒想好該怎么實現師兄的要求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
|