久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5922|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美精三区欧美精三区 | 亚洲欧美日韩在线 | 国产三级电影网站 | 一区二区三区四区在线视频 | 欧美日韩高清一区 | 精品国产青草久久久久福利 | 九色网址 | 国产一区二区精品在线 | 999久久久久久久久6666 | 日本超碰| 请别相信他免费喜剧电影在线观看 | 性生生活大片免费看视频 | 97视频在线观看网站 | 一区二区三区国产好的精 | 色婷婷av一区二区三区软件 | 亚洲欧美国产精品一区二区 | 国产99久久精品一区二区永久免费 | 色av一区二区三区 | 亚洲xxxxx | 免费在线一区二区三区 | 精品国产免费一区二区三区五区 | 免费在线h视频 | 欧美一级片a | 日韩在线 | 久久久久国产精品一区三寸 | 日韩视频区 | 亚洲在线| 亚洲视频免费 | 丝袜毛片 | 污污免费网站 | 丝袜 亚洲 另类 欧美 综合 | аⅴ资源新版在线天堂 | 日本福利视频免费观看 | 精品国产一区二区三区免费 | 欧美美女爱爱 | 久久精品国产一区 | 日韩在线小视频 | 欧美韩一区二区三区 | av网站在线看 | 色综合色综合色综合 | 日韩精品欧美精品 |