找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3788|回复: 4
收起左侧

单片机串口通信pwm波舵机舵机并1602显示仿真实例+代码

[复制链接]
ID:219972 发表于 2018-12-9 15:19 | 显示全部楼层 |阅读模式
利用串口通信控制pwm波并实现l1602显示提供prtues仿真
运用prtues仿真实现以下功能:
①通过按钮与pwm波控制舵机的角度    如:按一下增加相应度数角度
②通过lm1602实时显示pwm波占空比
拓展:通过pwm与L298n控制电机速度从大到小再反向从大到小    如:速度从0 到 100 到 0 到 -100 到0重复

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png
0.png

单片机源程序如下:
  1. /*********************************************
  2. 项目名称:pwm波与1602的练习
  3. 不足与补充:1,仿真下程序运行速度较慢
  4.                    2,lcd的判忙函数仿真时无法运行
  5.                    3,模块化方便以后移植
  6.                    4,仿真时需要改变舵机的属性成0.5ms~2.5ms
  7.                    5,某些函数没有用到形成警告L16
  8.                    6,L298n也可写成.c,.h文件形式并且可以添加更多功能
  9.                    7,按键扫描程序不太完善
  10. *********************************************/
  11. #include <reg52.h>
  12. #include <stdio.h>
  13. #include <math.h>
  14. #include "lm1602.h"
  15. #include "delay.h"
  16. #include "L298N.h"
  17. #include "pwm.h"
  18. #include "key.h"


  19. int   pwm0 = 1500;
  20. int   pwm1 = -50;
  21. int   Period0 = 20000;
  22. int   Period1 = 100;
  23. uint  s=1;
  24. uchar key;
  25. uchar str[16] = {""};


  26. void main()
  27. {
  28.         LCD_Init();                //LCD初始化
  29.         LCD_Clear();                   //LCD清屏
  30. //        Init_PwmTimer0(Period0);        //定时器0初始化
  31. //        Init_PwmTimer1(Period1);          //定时器1初始化
  32. //        DataPro_0(pwm0-13);
  33. //        speed(pwm1);
  34.         while(1)
  35.         {        
  36. //                key = Get_KEY();             //扫描按键
  37. //                switch(key)
  38. //                {
  39. //                        case 1:pwm0+=250;break;
  40. //                        case 2:pwm0-=250;break;
  41. ////                        case 3:break;          //没用到的按钮
  42. ////                        case 4:break;
  43. //                        default:break;               //防止出错
  44. //                }
  45. //               
  46. //                if(pwm0>=2400)             //防止过界
  47. //                        pwm0=2400;
  48. //                if(pwm0<=600)
  49. //                        pwm0=600;
  50. //               
  51. //                if(pwm1>=90)              //循环改变
  52. //                        s=-1;
  53. //                if(pwm1<=10)
  54. //                        s=1;
  55. //                pwm1+=s;
  56. //               
  57. //                sprintf(str,"ZKB1:%0.1f%% ",(double)pwm0/(double)Period0*100);     //sprintf方法可以很好的合成字符串%0.1f(只显示一位小数)
  58. //                LCD_Write_String(0,0,str);
  59. //                sprintf(str,"ZKB2:%0.1f%% ",(double)abs(pwm1)/(double)Period1*100);//占空比显示 占空比只有正的所以需要abs()函数(在math.h头文件中)
  60. //                LCD_Write_String(0,1,str);
  61. //                if(!key)                   //只在有按钮按下时改变
  62. //                DataPro_0(pwm0-13);        //-13为修正 PWM高电平时间有13us左右误差
  63. //                speed(pwm1);
  64. //        DelayMs(0);                //改变程序运行速度
  65. LCD_Write_String(0,0,"aaaa");
  66. DelayMs(10);
  67.         }
  68. }         
复制代码

代码有问题,求指导:
2018-7-16任务.rar (123.97 KB, 下载次数: 133)
回复

使用道具 举报

ID:290576 发表于 2019-11-15 21:49 | 显示全部楼层
附件数据损坏
回复

使用道具 举报

ID:463598 发表于 2020-3-5 20:19 | 显示全部楼层
压缩包损坏,下载不了,哭唧唧
回复

使用道具 举报

ID:327265 发表于 2020-4-19 22:28 | 显示全部楼层
你这个仿真打不开,可以重新发一份吗?
回复

使用道具 举报

ID:282520 发表于 2023-4-21 11:00 | 显示全部楼层
LCD1602没有显示啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表