找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1792|回复: 2
收起左侧

单片机pwm直流电机转速控制和测量装置

[复制链接]
ID:629845 发表于 2019-12-16 07:44 | 显示全部楼层 |阅读模式
  1. /**************************************************************************************
  2. 实验现象:k3控制电机加速,k4控制电机减速,一个档位对应一种蜂鸣器频率,两个定时器,一个用于控制电机转速pwm,另一个控制蜂鸣器频率         
  3. 接线说明: (具体接线图可见开发攻略对应实验的“实验现象”章节)
  4.         本实验基于普中51单片机开发板
  5.                    1,单片机-->LED&交通灯模块
  6.                                    P20-->D1
  7.                                         P0-->J6
  8.                                        
  9.                                         LSA=P2^2;
  10.                                         LSB=P2^3;
  11.                                         LSC=P2^4;
  12.                                        
  13.                                         led=P2^0; //定义P20口是beep
  14.                                         P21;      //定义P21 为脉宽输出引脚                           
  15. 注意事项:                                                                                                                                                                 
  16. ***************************************************************************************/
  17. #include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器
  18. #include "intrins.h"

  19. typedef unsigned int u16;          //对数据类型进行声明定义
  20. typedef unsigned char u8;

  21. sbit beep=P2^0;         //定义P20口是Beep(high)
  22. sbit P21=P2^1; //定义P21 为脉宽输出引脚--接电机

  23. //sbit k1=P1^0;         //定义period增加
  24. //sbit k2=P1^1;//定义period减少
  25. sbit k3=P2^5;//定义high增加
  26. sbit k4=P2^6;//定义high减少
  27. sbit k5=P2^7;

  28. sbit LSA=P2^2;
  29. sbit LSB=P2^3;
  30. sbit LSC=P2^4;

  31. u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  32.                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};//显示0~F-x的值

  33. u16 period=100;
  34. u16 high=50;
  35. u16 high1=65;

  36. void led();
  37. /*******************************************************************************
  38. * 函 数 名         : delay
  39. * 函数功能                   : 延时函数,i=1时,大约延时10us
  40. *******************************************************************************/
  41. void delay(u16 i)
  42. {
  43.         while(i--);        
  44. }
  45. /*******************************************************************************
  46. * 函 数 名         : digdisplay
  47. * 函数功能                   : 显示
  48. ******************************/                                       
  49. void DigDisplay()
  50. {
  51.         u8 i;
  52.         u8 index[8]={0};
  53.         u8 ration=high/period*100;//占空比
  54.         
  55.         index[0]=period/1000;
  56.         index[1]=period%1000/100;
  57.         index[2]=period%1000%100/10;
  58.         index[3]=period%1000%100%10;        
  59. //        index[4]=high/1000;
  60. //        index[5]=high%1000/100;
  61.         index[6]=high/10;
  62.         index[7]=high%10;
  63.                
  64.         for(i=0;i<8;i++)
  65.         {
  66.                 switch(i)         //位选,选择点亮的数码管,
  67.                 {
  68.                         case(0):
  69.                                 LSA=0;LSB=0;LSC=0; break;//显示第0位
  70.                         case(1):
  71.                                 LSA=1;LSB=0;LSC=0; break;//显示第1位
  72.                         case(2):
  73.                                 LSA=0;LSB=1;LSC=0; break;//显示第2位
  74.                         case(3):
  75.                                 LSA=1;LSB=1;LSC=0; break;//显示第3位
  76.                         case(4):
  77.                                 LSA=0;LSB=0;LSC=1; break;//显示第4位
  78.                         case(5):
  79.                                 LSA=1;LSB=0;LSC=1; break;//显示第5位
  80.                         case(6):
  81.                                 LSA=0;LSB=1;LSC=1; break;//显示第6位
  82.                         case(7):
  83.                                 LSA=1;LSB=1;LSC=1; break;//显示第7位        
  84.                 }
  85.                 P0=smgduan[index[i]];//发送段码
  86.                 delay(100); //间隔一段时间扫描        
  87.                 P0=0x00;//消隐
  88.         }
  89. }                                       
  90. /*******************************************************************************
  91. * 函 数 名         : keypros
  92. * 函数功能                   : 按键处理函数,判断按键K1是否按下
  93. *******************************************************************************/
  94. void keypros()
  95. {                                       
  96.         if(high<0||high==90)
  97.         {
  98.                 high=50;
  99.                 led();
  100.         }  

  101.         if(k3==0)                  //检测按键K1是否按下
  102.         {        
  103.                 delay(1000);   //消除抖动 一般大约10ms
  104.                 if(k3==0)         //再次判断按键是否按下
  105.                 {
  106.                         TR0=1;
  107.                         TR1=1;
  108.                         high+=10;         
  109.                         led();
  110.                 }
  111.                 while(!k3);         //检测按键是否松开               
  112.         }               
  113.         
  114.         if(k4==0)                  //检测按键K1是否按下
  115.         {        
  116.                 delay(1000);   //消除抖动 一般大约10ms
  117.                 if(k4==0)         //再次判断按键是否按下
  118.                 {
  119.                         TR0=1;
  120.                         TR1=1;
  121.                         high-=10;         
  122.                         led();
  123.                 }
  124.                 while(!k4);         //检测按键是否松开               
  125.         }
  126.         
  127.         if(k5==0)                  //检测按键K1是否按下
  128.         {        
  129.                 delay(1000);   //消除抖动 一般大约10ms
  130.                 if(k5==0)         //再次判断按键是否按下
  131.                 {
  132.                         TR0=0;
  133.                         TR1=0;
  134.                         P21=0;
  135.                         beep=0;
  136.                         high=0;         
  137.                         led();
  138.                 }
  139.                 while(!k5);         //检测按键是否松开               
  140.         }                        
  141. }

  142. void led()
  143. {
  144.         switch(high)
  145.         {
  146.                 case  0:P1=~0x00;break;
  147.                 case 10:P1=~0x01;high1=5;break;
  148.                 case 20:P1=~0x03;high1=20;break;
  149.                 case 30:P1=~0x07;high1=35;break;
  150.                 case 40:P1=~0x0f;high1=50;break;
  151.                 case 50:P1=~0x1f;high1=65;break;
  152.                 case 60:P1=~0x3f;high1=80;break;
  153.                 case 70:P1=~0x7f;high1=90;break;
  154.                 case 80:P1=~0xff;high1=100;break;
  155.         }               
  156. }                                                                                
  157. /*******************************************************************************
  158. * 函 数 名         : Timer0Init
  159. * 函数功能                   : 定时器0初始化
  160. * 输    入         : 无
  161. * 输    出         : 无
  162. *******************************************************************************/
  163. void TimerInit()
  164. {
  165.         TMOD|=0X11;//选择为定时器0模式,工作方式1,仅用TR0打开启动。

  166.         TH0=0XFC;        //给定时器赋初值,定时1ms
  167.         TL0=0X18;        
  168.         
  169.         ET0=1;//打开定时器0中断允许
  170.         EA=1;//打开总中断
  171.         TR0=1;//打开定时器
  172.         
  173.         TH1=0XFC;        //给定时器赋初值,定时1ms
  174.         TL1=0X18;        
  175.         ET1=1;//打开定时器1中断允许
  176.         TR1=1;//打开定时器                        
  177. }
  178. /*******************************************************************************
  179. * 函 数 名       : main
  180. * 函数功能                 : 主函数
  181. * 输    入       : 无
  182. * 输    出             : 无
  183. *******************************************************************************/
  184. void main()
  185. {        
  186.         TimerInit();  //定时器初始化
  187.         led();

  188.         while(1)
  189.         {
  190.                 keypros();
  191.                 DigDisplay();
  192.         }               
  193. }
  194. /*******************************************************************************
  195. * 函 数 名         : void Timer0() interrupt 1
  196. * 函数功能                   : 定时器0中断函数
  197. * 输    入         : 无
  198. * 输    出         : 无
  199. *******************************************************************************/
  200. void Timer0() interrupt 1
  201. {
  202.         static u16 time;
  203.         TH0=0XFC;        //给定时器赋初值,定时1ms
  204.         TL0=0X18;
  205.         time++;
  206.         if(time==high)
  207.         {
  208.                 P21=0;
  209.         }
  210.         else if(time==100)
  211.         {
  212.                 P21=1;
  213.                 time=0;
  214.         }
  215. }
  216. void Timer1() interrupt 3
  217. {
  218.         static u16 time1;
  219.         TH1=0XFC;        //给定时器赋初值,定时1ms
  220.         TL1=0X18;
  221.         time1++;
  222.         if(time1==high1)
  223.         {
  224.                 beep=0;
  225.         }
  226.         else if(time1==200)
  227.         {
  228.                 beep=1;
  229.                 time1=0;
  230.         }
  231. }
复制代码
回复

使用道具 举报

ID:1 发表于 2019-12-16 12:27 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

ID:536047 发表于 2019-12-20 16:37 来自手机 | 显示全部楼层
admin 发表于 2019-12-16 12:27
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)

查看内容
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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