登录|立即注册|使用QQ帐号登录
论坛 > 51单片机
发帖|
看7333|回1|收藏
楼主 ID:366074 只看他
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. }
沙发 ID:298008 只看他
2020-2-22 10:42
谢谢楼主分享

51黑电子论坛

Powered by Discuz! X3.1

首页|标准版|触屏版|电脑版