找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5200|回复: 3
收起左侧

51单片机产生PWM控制直流电机LCD显示程序,仿真

[复制链接]
ID:208688 发表于 2017-6-12 21:46 | 显示全部楼层 |阅读模式
压缩包中含有程序、仿真图、HEX文件。

51单片机pwm控制直流电机的仿真原理图如下(proteus仿真工程可到本帖附件中下载):

仿真

仿真
0.png

单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define lcd P0
  6. #define KEY P3
  7. void LCD_Writecmd(uchar cmd);
  8. void LCD_Writedata(uchar dat);
  9. void LCD_write_char(uchar x,uchar y,char ch );
  10. void LCD_write_str(uchar x,uchar y,char str[]);
  11. void LCD_Init(void);
  12. void LCD_clear();
  13. void delay_us(uchar n);
  14. void delay_ms(uchar m);

  15. sbit RW=P2^5;
  16. sbit RS=P2^6;
  17. sbit EN=P2^7;
  18. sbit  pwm1=P1^0;
  19. sbit  pwm2=P1^1;
  20. sbit  pwm=P1^3;
  21. void timer_init();
  22. uchar a=50,b=0,c=0,flag=0,flag1=0;

  23. void main()
  24. {
  25.         LCD_Init();
  26.         timer_init();
  27.         LCD_write_str(0,0,"motor:");
  28.         while(1)
  29.         {
  30.                 b=a/10+0x30;
  31.                 c=a%10+0x30;
  32.                 if(KEY==0xfe)
  33.                 {
  34.                         LCD_clear();
  35.                         LCD_write_str(0,0,"motor:");
  36.                         LCD_write_str(0,1,"ZKB:");
  37.                         LCD_write_str(11,0,"ON");
  38.                         LCD_write_char(8,1,b);
  39.                         LCD_write_char(9,1,c);
  40.                         TR0=1;
  41.                 }       
  42.                 if(KEY==0xfd)
  43.                 {
  44.                         LCD_clear();
  45.                         LCD_write_str(0,0,"motor:");
  46.                         LCD_write_str(0,1,"ZKB:");       
  47.                         LCD_write_str(11,0,"OFF");
  48.                         LCD_write_char(9,1,0);
  49.                         TR0=0;
  50.                         pwm1=0;
  51.                         pwm2=0;
  52.                 }

  53.                 if(KEY==0xfb)
  54.                 {       
  55.                         delay_ms(200);
  56.                         if(KEY!=0xfb)
  57.                         {
  58.                                 flag1=0;
  59.                                 a+=10;
  60.                         }
  61.                 }
  62.                 if(KEY==0xf7)
  63.                 {       
  64.                         delay_ms(200);
  65.                         if(KEY!=0xf7)
  66.                         {
  67.                                 flag1=1;
  68.                                 a-=10;
  69.                         }
  70.                 }
  71.                 if(KEY==0xef)//正转
  72.                 {
  73.                         pwm=0;
  74.                         delay_ms(200);
  75.                         if(KEY!=0xef)
  76.                         {
  77.                                 LCD_write_str(11,0,"  T");
  78.                                 pwm=pwm1;
  79.                                 TR0=1;
  80.                                 pwm1=0;
  81.                                 pwm2=1;
  82.        
  83.                                
  84.                         }
  85.                 }
  86.         if(KEY==0xdf)//反转
  87.                 {
  88.                         pwm=0;
  89.                         delay_ms(200);
  90.                         if(KEY!=0xef)
  91.                         {
  92.                                 LCD_write_str(11,0,"  F");
  93.                                 TR0=1;
  94.                                 pwm=pwm2;
  95.                                 pwm1=1;
  96.                                 pwm2=0;

  97.                         }
  98.                 }



  99.                 if(flag1==1)
  100.                 {
  101.                        
  102.                         LCD_write_str(0,0,"motor:");
  103.                         LCD_write_str(0,1,"ZKB:");
  104.                         LCD_write_char(8,1,b);
  105.                         LCD_write_char(9,1,c);
  106.                         if(a<=1)a=99;
  107.                 }
  108.                 if(flag1==0)
  109.                 {
  110.                         LCD_write_str(0,0,"motor:");
  111.                         LCD_write_str(0,1,"ZKB:");
  112.                         LCD_write_char(8,1,b);
  113.                         LCD_write_char(9,1,c);                       
  114.                         if(a>=99)a=0;
  115.                 }
  116.         }

  117. }
  118. /***********************************/
  119. void timer_init()
  120. {
  121.     TMOD=0x01;
  122.     TH0=(65535-a*100)/256;            
  123.     TL0=(65535-a*100)%256;       
  124.         EA=1;
  125.     ET0=1;
  126.         pwm1=1;
  127. }

  128. void timer0() interrupt 1
  129. {
  130.         if(flag)
  131.         {
  132.                 TH0=(65535-a*100)/256;
  133.                 TL0=(65535-a*100)%256;
  134.                 pwm1=1;
  135.                 flag=0;
  136.         }
  137.         else
  138.         {
  139.                 TH0=((65535-(100-a)*100))/256;
  140.                 TL0=((65535-(100-a)*100))%256;
  141.                 pwm1=0;
  142.                 flag=1;
  143.         }
  144. }
  145. /******************************/
  146. void delay_us(uchar n)
  147. {
  148.         for(n=200;n>0;n--);

  149. }

  150. void delay_ms(unsigned char ms)

  151. {
  152.     unsigned char i ;
  153.     while(ms--)
  154.      {
  155.         for(i = 0 ; i < 120 ; i++) ;
  156.      }
  157. }


  158. void LCD_Writecmd(uchar cmd)//写指令到LCD1602
  159. {
  160.         RS=0;
  161.         delay_us(1);
  162.         RW=0;
  163.         delay_us(1);
  164.        
  165.         EN=1;
  166.         lcd=cmd;
  167.         delay_us(300);
  168.         EN=0;
  169. }


  170. void LCD_Writedata(uchar dat)//写数据到LCD1602
  171. {
  172.         RS=1;
  173.         delay_us(1);
  174.         RW=0;
  175.         delay_us(1);
  176.         EN=1;
  177.         lcd=dat;
  178.         delay_us(300);
  179.         EN=0;
  180.        
  181. }


  182. void LCD_write_char(uchar x,uchar y,char ch )//在指定位置显示一个字符
  183. {
  184.         if(y==0)
  185.                 LCD_Writecmd(0x80+x);
  186.         else
  187.                 LCD_Writecmd(0xc0+x);
  188.         LCD_Writedata(ch);

  189. }

  190. void LCD_write_str(uchar x,uchar y,char str[])//使LCD1602显示一个字符串
  191. {
  192.         uchar i=0;
  193.         if(y==0)
  194.                 LCD_Writecmd(0x80+x);
  195.         else
  196.                 LCD_Writecmd(0xc0+x);
  197.         while(str[i]!='\0')
  198.         {
  199.                 LCD_Writedata(str[i]);
  200.                 ++i;
  201.         }
  202.        
  203. }

  204. void LCD_clear(void)//清屏函数
  205. {
  206.         LCD_Writecmd(0x01);
  207.         delay_ms(5);
  208. ……………………

  209. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
51.zip (24.11 KB, 下载次数: 143)

评分

参与人数 2黑币 +55 收起 理由
KolalaSA + 5 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:195403 发表于 2017-8-4 13:39 | 显示全部楼层
仿真无法运行 有错误
回复

使用道具 举报

ID:308395 发表于 2018-5-3 16:28 | 显示全部楼层
不显示速度,只有ZKB(占空比)
回复

使用道具 举报

ID:321836 发表于 2018-7-28 23:56 | 显示全部楼层
文档比较老了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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