找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5319|回复: 1
打印 上一主题 下一主题
收起左侧

用电位器控制舵机程序

[复制链接]
跳转到指定楼层
楼主
ID:79544 发表于 2016-6-6 19:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用电位器经过单片机片内AD再由定时器产生PWM控制舵机角度
  1. /*****************************************************
  2.           稳定的电位器控制舵机程序在多功能实验板通过验证
  3.         没用单片机片内PWM

  4.         功能  :用电位器通过单片机片内AD再经过定时器产生
  5.                         PWM信号控制舵机角度,
  6.                         舵机角度随电位器旋转同步转动.
  7.                         1602显示2路AD采集电压值
  8.         单片机:STC12C5A60S2
  9.         晶振  :11.0592M
  10.         作者  :苏义江
  11.         时间  :2016-6-5
  12.         注  释; 单片机电压由7805稳压供给。舵机电压由7806稳压供给,
  13.                        
  14. ******************************************************/

  15. #include<stc12c5a60s2.h>
  16. #include<intrins.h>  
  17. #define uchar unsigned char
  18. #define uint unsigned int
  19. /*Define ADC operation const for ADC_CONTR*/  
  20. #define ADC_POWER   0x80 //ADC power control bit  
  21. #define ADC_FLAG    0x10 //ADC complete flag 模数转换结束标志位
  22. #define ADC_START   0x08 //ADC start control bit  模数转换启动控制位

  23. //转换速度控制位SPEED0和SPEED1,共四种状态,对应四种转换速度
  24. #define ADC_SPEEDLL 0x00            //540 clocks
  25. #define ADC_SPEEDL  0x20            //360 clocks
  26. #define ADC_SPEEDH  0x40            //180 clocks
  27. #define ADC_SPEEDHH 0x60            //90 clocks

  28. sbit rs=P2^7;
  29. sbit rw=P2^6; //已接地
  30. sbit lcden=P2^5;
  31. sbit pwm=P1^3; //第一路舵机
  32. sbit pwm1=P1^4;//第二路舵机


  33. uint temp,bai,shi,ge;

  34. uint ADtemp,ADtemp1;  //定义全局变量
  35. uint high,low;  
  36. static uint count1;

  37. void write_com(uchar);
  38. void write_data(uchar);
  39. void delay(uint x) //简单延时
  40. {   
  41.         uint a,b;  
  42.         for(a=x;a>0;a--)
  43.         for(b=400;b>0;b--);
  44. }


  45. //AD初始化
  46. void InitADC()
  47. {
  48.     P1ASF = 0x03;                   //设置P1,0.P1,1口为AD口
  49.     ADC_RES = 0;
  50.                     //清除结果寄存器
  51.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
  52.     delay(2);                       //ADC上电并延时
  53. }
  54. /*********************************
  55. 读取第几路ADC结果
  56. ***********************************/
  57. uint GetADCResult(uchar ch)
  58. {
  59.     int V;
  60.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
  61.     _nop_();                        //等待4个NOP
  62.     _nop_();
  63.     _nop_();
  64.     _nop_();
  65.     while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成
  66.     ADC_CONTR &= ~ADC_FLAG;         //Close ADC

  67.     V=ADC_RES;
  68.     return V;
  69. }


  70. void display(float ver) //液晶显示 第一路AD
  71. {  
  72.         temp=(int)ver;
  73.         bai=temp/100+0x30;
  74.         shi=temp%100/10+0x30;
  75.         ge=temp%10+0x30;
  76.         write_com(0x87) ;
  77.         write_data(bai);
  78.         write_data('.');
  79.         write_data(shi);
  80.         write_data(ge);
  81. }
  82. void display1(float ver) //液晶显示 第二路AD
  83. {  
  84.         temp=(int)ver;
  85.         bai=temp/100+0x30;
  86.         shi=temp%100/10+0x30;
  87.         ge=temp%10+0x30;
  88.         write_com(0x80+0x47) ;
  89.         write_data(bai);
  90.         write_data('.');
  91.         write_data(shi);
  92.         write_data(ge);
  93. }
  94. void write_com(uchar com) //写指令
  95. {   
  96.          
  97.         rs=0;  
  98.         rw=0;  
  99.         lcden=0;  
  100.         P0=com;
  101.         delay(10);
  102.         lcden=1;  
  103.         delay(10);  
  104.         lcden=0;
  105. }
  106. void write_data(uchar date) //写数据
  107. {   
  108.           
  109.         rs=1;
  110.         rw=0;  
  111.         lcden=0;  
  112.         P0=date;
  113.         delay(10);
  114.         lcden=1;  
  115.         delay(10);  
  116.         lcden=0;
  117. }
  118. void LCD_init() //液晶显示初始化
  119. {   
  120.         write_com(0x38);  
  121.         _nop_();   

  122.         write_com(0x06);  
  123.         _nop_();   
  124.         write_com(0x01);  
  125.         _nop_();
  126.         write_com(0x0c);  
  127.         _nop_();
  128.         write_com(0x83) ;
  129.         write_data('V');
  130.         write_data('1');
  131.         write_data('=');
  132.         write_com(0x80+0X43) ;
  133.         write_data('V');
  134.         write_data('2');
  135.         write_data('=');
  136. }


  137. void pwm_init_t0() //PWM波初始化
  138. {  
  139.         TMOD |=0x01;              
  140.         //定时器设置 0.1ms in 11.0592M crystal  
  141.         TH0=(65536-78)/256;   
  142.         TL0=(65536-78)%256;      //定时0.1mS      
  143.         ET0=1;//定时器中断打开     
  144.         EA=1;//总中断  
  145.         TR0=1;   //启动定时器0
  146. }  

  147. void main() //主函数
  148. {   
  149.         uint angle,angle1;
  150.         pwm_init_t0(); //PWM波初始化  
  151.         LCD_init();
  152.         InitADC();
  153.         ADtemp=GetADCResult(0);
  154.         high=65075-7.2*ADtemp;
  155.         low=47563+7.2*ADtemp;
  156.         ADtemp1=GetADCResult(1);
  157.         high=65075-7.2*ADtemp1;      
  158. // ( high=65035-7.8*ADtemp;12MHz)
  159. //(65535-(460+7.2*ADtemp    11.0592MHz)  
  160.         low=47563+7.2*ADtemp1;        
  161. // (  low=46035+7.8*ADtemp; )  
  162. //( 65535-(17972-7.2*ADtemp    11.0592MHz  )
  163.        
  164.        
  165.         while(1)  
  166.         {   angle=ADtemp*1.8;
  167.                 angle1=ADtemp1*1.8;
  168.                 ADtemp=GetADCResult(0);
  169.                 high=65075-7.2*ADtemp;
  170.                 low=47563+7.2*ADtemp;

  171.                 ADtemp1=GetADCResult(1);
  172.                 high=65075-7.2*ADtemp1;
  173.                 low=47563+7.2*ADtemp1;

  174.                 display(angle);
  175.                 display1(angle1);
  176.         }
  177. }  
  178. void time0() interrupt 1 //定时器T1
  179. {

  180.         static uchar count;  
  181.           
  182.         if (!count)     
  183.         {      
  184.                 pwm = 1;        //第一路给高电平
  185.               pwm1= 1;                //第二路给高电平
  186.                 TH0=high/256;        
  187.                 TL0=high%256;     //定时0.05mS,经过示波器的测量     
  188.         }  
  189.         else  
  190.         {   
  191.                 pwm =0 ;         //第一路给低电平                         
  192.                 pwm1=0;     //第二路给低电平
  193.                 TH0=low/256;         
  194.                 TL0=low%256;     //定时0.05mS,经过示波器的测量  
  195.         }  
  196.         count=~count;

  197. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:164217 发表于 2017-7-23 18:39 | 只看该作者
请问电位器怎么接?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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