利用串口通信控制pwm波并實現l1602顯示提供prtues仿真
運用prtues仿真實現以下功能:
①通過按鈕與pwm波控制舵機的角度 如:按一下增加相應度數角度
②通過lm1602實時顯示pwm波占空比
拓展:通過pwm與L298n控制電機速度從大到小再反向從大到小 如:速度從0 到 100 到 0 到 -100 到0重復
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (48.01 KB, 下載次數: 24)
下載附件
2018-12-9 23:06 上傳
0.png (45.08 KB, 下載次數: 16)
下載附件
2018-12-9 23:05 上傳
單片機源程序如下:
- /*********************************************
- 項目名稱:pwm波與1602的練習
- 不足與補充:1,仿真下程序運行速度較慢
- 2,lcd的判忙函數仿真時無法運行
- 3,模塊化方便以后移植
- 4,仿真時需要改變舵機的屬性成0.5ms~2.5ms
- 5,某些函數沒有用到形成警告L16
- 6,L298n也可寫成.c,.h文件形式并且可以添加更多功能
- 7,按鍵掃描程序不太完善
- *********************************************/
- #include <reg52.h>
- #include <stdio.h>
- #include <math.h>
- #include "lm1602.h"
- #include "delay.h"
- #include "L298N.h"
- #include "pwm.h"
- #include "key.h"
- int pwm0 = 1500;
- int pwm1 = -50;
- int Period0 = 20000;
- int Period1 = 100;
- uint s=1;
- uchar key;
- uchar str[16] = {""};
- void main()
- {
- LCD_Init(); //LCD初始化
- LCD_Clear(); //LCD清屏
- // Init_PwmTimer0(Period0); //定時器0初始化
- // Init_PwmTimer1(Period1); //定時器1初始化
- // DataPro_0(pwm0-13);
- // speed(pwm1);
- while(1)
- {
- // key = Get_KEY(); //掃描按鍵
- // switch(key)
- // {
- // case 1:pwm0+=250;break;
- // case 2:pwm0-=250;break;
- //// case 3:break; //沒用到的按鈕
- //// case 4:break;
- // default:break; //防止出錯
- // }
- //
- // if(pwm0>=2400) //防止過界
- // pwm0=2400;
- // if(pwm0<=600)
- // pwm0=600;
- //
- // if(pwm1>=90) //循環改變
- // s=-1;
- // if(pwm1<=10)
- // s=1;
- // pwm1+=s;
- //
- // sprintf(str,"ZKB1:%0.1f%% ",(double)pwm0/(double)Period0*100); //sprintf方法可以很好的合成字符串%0.1f(只顯示一位小數)
- // LCD_Write_String(0,0,str);
- // sprintf(str,"ZKB2:%0.1f%% ",(double)abs(pwm1)/(double)Period1*100);//占空比顯示 占空比只有正的所以需要abs()函數(在math.h頭文件中)
- // LCD_Write_String(0,1,str);
- // if(!key) //只在有按鈕按下時改變
- // DataPro_0(pwm0-13); //-13為修正 PWM高電平時間有13us左右誤差
- // speed(pwm1);
- // DelayMs(0); //改變程序運行速度
- LCD_Write_String(0,0,"aaaa");
- DelayMs(10);
- }
- }
復制代碼
代碼有問題,求指導:
2018-7-16任務.rar
(123.97 KB, 下載次數: 136)
2018-12-9 15:19 上傳
點擊文件名下載附件
|