利用串口通信控制pwm波并实现l1602显示提供prtues仿真
运用prtues仿真实现以下功能:
①通过按钮与pwm波控制舵机的角度 如:按一下增加相应度数角度
②通过lm1602实时显示pwm波占空比
拓展:通过pwm与L298n控制电机速度从大到小再反向从大到小 如:速度从0 到 100 到 0 到 -100 到0重复
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- /*********************************************
- 项目名称: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)
|