亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

標題: 單片機串口控制步進電機的源程序 [打印本頁]

作者: ZCRhandsome    時間: 2018-7-6 09:30
標題: 單片機串口控制步進電機的源程序
  1. #include <reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define LED P1
  6. //因為步進電機是減速步進電機,減速比的1/64 ,
  7. //所以N=64時,步進電機主軸轉一圈
  8. //使用前請短接J2跳線帽,串口助手設置為比特率9600,無校驗位,停止位1,發送數據為16進制形式
  9. uchar code CCW[8]        ={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};                   //逆時鐘旋轉相序表
  10. uchar code CW[8]        ={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};                   //正時鐘旋轉相序表
  11. uchar code table[]        ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};        //數碼管顯示數字表
  12. sbit P2_0 = P2^0;
  13. sbit P2_1 = P2^1;
  14. sbit P2_2 = P2^2;
  15. sbit P2_3 = P2^3;
  16. sbit FMQ=P3^6;  //蜂鳴器

  17. uchar          flag_rec;
  18. uint        data_rec;
  19. /*********************************************************************
  20.         中斷服務特殊功能寄存器配置
  21. *********************************************************************/
  22. void init_interrupt()
  23. {
  24.         TMOD=0x20;                //用定時器1設置串口波特率         9600
  25.         TH1=0xfd;                //T1定時器裝初值
  26.         TL1=0xfd;                //T1定時器裝初值
  27.         TR1=1;                    //啟動T1定時器
  28.         REN=1;          //串口初始化
  29.         SM0=0;                        //設定串口工作方式1
  30.         SM1=1;                        //設定串口工作方式1
  31.         EA=1;           //開啟總中斷
  32.         ES=1;                        //開啟串口中斷

  33. }

  34. /*************************************************************
  35.                                 串口中斷函數
  36. **************************************************************/
  37. void receive() interrupt 4
  38. {
  39.         RI=0;                                        //RI清零;因為收到數據或者或者發送了數據會由硬件置1
  40.         data_rec=SBUF;                        //接收數據SBUF,將SBUF中的數據讀走給data_rec,即將計算機的數據接收。
  41.         //a=SBUF;
  42.         ES = 0;                                        //關閉串口中斷
  43.         flag_rec=1;                                //中斷標志位置1
  44. }
  45. /*****************************************************************
  46.                                 設置延時
  47. ******************************************************************/
  48. void delaynms(uint aa)
  49. {
  50.   uchar bb;
  51.   while(aa--)
  52.   {   
  53.           for(bb=0;bb<115;bb++)     //1ms基準延時程序
  54.         {    ;   }
  55.   }

  56. }
  57. void delay500us()
  58. {
  59.   int j;
  60.   for(j=0;j<57;j++)
  61.   {
  62.    ;
  63.   }
  64. }
  65. /*******************************************
  66.                                 蜂鳴器
  67. ******************************************/
  68. void beep()
  69. {
  70.           uchar t;
  71.           for(t=0;t<100;t++)
  72.           {
  73.                    delay500us();
  74.                  FMQ=!FMQ;   //產生脈沖
  75.           }
  76.           FMQ=1;    //關閉蜂鳴器
  77. }
  78. /***************************************
  79.                                 正反轉設計
  80. ****************************************/
  81. void motor_ccw_deta(uchar deta,uchar speed)        //電機逆時針轉deta度 deta=11時30度,deta=66d時180度
  82. {
  83.         uchar i;
  84.         while(deta--)
  85.         {
  86.                 for(i=0;i<8;i++)  //數組循環一周
  87.                 {
  88.                         P1=CCW[i];
  89.                         delaynms(speed);   //調節轉速
  90.                 }
  91.         }
  92. }

  93. void motor_cw_deta(uchar deta,uchar speed)        //電機順時針轉deta度 deta=11時30度,deta=66時180度
  94. {
  95.         uchar i;
  96.         while(deta--)
  97.         {
  98.                  for(i=0;i<8;i++)  //內部循環一周
  99.                  {
  100.                            P1=CW[i];
  101.                            delaynms(speed);   //調節轉速
  102.                 }
  103.         }
  104. }
  105. void Digital_tube_display(uint num)
  106. {
  107.         //4位數碼管顯示控制
  108.         
  109.         uchar temp,count;
  110.         temp         = 0;
  111.         count         = 0;
  112.         if(num > 999 || num < 0) return;
  113.         while(num)
  114.         {
  115.                 temp         = num % 10;
  116.                 P0                 = table[temp];
  117.                 switch(count)    //判斷
  118.                 {
  119.                         case 0:P2_3=0;break;  //點亮第1個燈
  120.                         case 1:P2_2=0;break;  //點亮第2個燈
  121.                         case 2:P2_1=0;break;  //點亮第3個燈
  122.                         case 3:P2_0=0;break;  //點亮第4個燈
  123.                 }
  124.                 delaynms(5);
  125.                 switch(count)    //判斷
  126.                 {
  127.                         case 0:P2_3=1;break;  //點亮第1個燈
  128.                         case 1:P2_2=1;break;  //點亮第2個燈
  129.                         case 2:P2_1=1;break;  //點亮第3個燈
  130.                         case 3:P2_0=1;break;  //點亮第4個燈
  131.                 }
  132.                 num         = num / 10;
  133.                 count++;
  134.         }
  135. }

  136. /**************************************************************
  137.                                                            中斷處理函數
  138. ****************************************************************/
  139. void deal_interrupt_Date(uint dat)
  140. {

  141.         SBUF=dat;                         //發送數據dat_rec到SBUF,即將單片機的數據發送到計算機
  142.         while(!TI);
  143.         TI = 0;

  144.         beep();
  145.         motor_cw_deta(11,1);        //電機順轉deta度,deta=11時30度,deta=66時180度
  146.         delaynms(10*dat);                //由于目前還沒有找到如何傳輸255以上的數的方法,所以先乘以10
  147.         motor_ccw_deta(11,1);        //電機逆轉deta齲琩eta=11時30度,deta=66時180度                        
  148.         
  149.         ES=1;                 //打開串口中斷        
  150.         flag_rec=0;
  151. }

  152. /**************************************************************
  153.                                                         主程序
  154. ****************************************************************/
  155. void main()
  156. {        
  157.         init_interrupt();
  158.         Digital_tube_display(0);
  159.         while(1)
  160.         {
  161.                 Digital_tube_display(data_rec);
  162.                 P1=0xf0;
  163.                 if(flag_rec)        //收到串口數據時,處理
  164.                 {
  165.                         deal_interrupt_Date(data_rec);
  166.                 }
  167.                
  168.         }
  169. }
復制代碼

作者: lindeijun1    時間: 2020-2-22 10:42
謝謝樓主分享




歡迎光臨 (http://www.denmoz.com/bbs/) Powered by Discuz! X3.1