找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1352|回复: 6
收起左侧

请教单片机interrupt 4 控制步进电机圈数有问题 控制led运行正常

[复制链接]
ID:1016815 发表于 2023-3-16 22:29 | 显示全部楼层 |阅读模式
  1. #include<reg52.h>                  
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. uchar buf;
  5. char code zh[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09}; //--1# 此部分为步进电机控制部分
  6. void delay(char x)//延时程序
  7. {                          
  8.    char i;
  9.    while(x--)
  10.    {
  11.      for(i=0; i<120; i++);
  12.    }
  13. }
  14. void  motor(unsigned int a)//a即想要转的圈数
  15. {
  16.    unsigned char b;
  17.    unsigned int  c;
  18.    for (c=0; c<8*64*a; c++)
  19.     {
  20.       for (b=0; b<8; b++)
  21.         {
  22.           P1 = zh[b];
  23.          delay(1);
  24.          }
  25.     }
  26. }//--1# 此部分为步进电机控制部分
  27.   void main(void)
  28. {
  29. SCON=0x50;//设定串口工作方式0101 0000  串行口控制寄存器SCON  详细注释后面
  30. PCON=0x00;                 //=PCON主要是为CHMOS型单片机的电源控制而设置的专用寄存器,在51单片机中单元地址是87H,其结构格式如下:
  31. TMOD=0x20;   //> 20=10100   //TMOD是定时器/计数器模式控制寄存器(TIMER/COUNTER MODE CONTROL REGISTER)。
  32. EA=1;  //=EA引脚表示存取外部程序代码之意,低电平动作,当此引脚接低电平后,系统会取用外部的程序代码(存于外部EPROM中)来执行程序。EA引脚必须接低电平,因为其内部无程序存储器空间。
  33. ES=1; //=           ES:串行口中断控制位。ES=1,允许串行口中断。
  34. TL1=0xfd; //=fd=11111101         为什么51单片机串行中断中TL1和TH1的值要相同
  35. TH1=0xfd;  //= fd=11111101
  36. TR1=1;         //=                  TH1,TL1、TR1、TMOD是单片机的特殊寄存器 ,是用来控制计数/中断器的.TMOD(工作方式控制寄存器);TH1/TL1是定时器/计数器1;TR1=1是启动定时器1。
  37. while(1);
  38. }
  39. //串行中断服务函数
  40. void serial() interrupt 4          //==          interrupt翻译:打断
  41.         {
  42.         ES=0;
  43.         RI=0;
  44.     buf=SBUF;                //= SBUF全称serial data buffer,中文名称“串行数据缓冲器”
  45. //**********************************************************************************
  46. //2#-段内容            =正确运行  等待串口助手"文本输入数字后点亮灯光
  47. //if(buf<50)//35=3  可以输入0 1点亮LED灯
  48. // P1=0X01;
  49. //***********************************************************************************
  50.           if(buf<100)//------------------1#--步进电机控制
  51.          {          delay(1000); //不知道什么问题加载电机就运转,不是等待输入数字转多少圈,
  52.            motor(buf); //转n圈(可以改动)         
  53.        delay(1000);
  54.        while(1) ;
  55.          } //------------------1#--步进电机控制<<
  56.         ES=1;//串口中断
  57. }
复制代码


回复

使用道具 举报

ID:1016815 发表于 2023-3-16 22:34 | 显示全部楼层
请教各位朋友们,我运用interrupt 4 串口助手输入数字,即等待输入后控制LED ,
但步进电机不起作用,下载程序后就开始运转,不知道什么问题,我是想输入数据步进电机走多少圈。
回复

使用道具 举报

ID:161164 发表于 2023-3-17 10:31 | 显示全部楼层
2023-03-17_142054.png
回复

使用道具 举报

ID:1016815 发表于 2023-3-17 21:00 | 显示全部楼层
感谢这位朋友的帮助。我这测试了电机没有动。
不知道什么原因,是否要放 interrupt 里面,我放了也不行。
我照抄的,应该没错。
#include<reg52.h>                  
#define uchar unsigned char
#define uint  unsigned int
uchar buf;
char code zh[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09}; //--1# 此部分为步进电机控制部分
void delay(char x)//延时程序
{                          
   char i;
   while(x--)
   {
     for(i=0; i<120; i++);
   }
}
void  motor(unsigned int a)//a即想要转的圈数
{
   unsigned char b;
   unsigned int  c;
   for (c=0; c<8*64*a; c++)
    {
      for (b=0; b<8; b++)
        {
          P1 = zh[b];
         delay(1);
         }
    }
}//--1# 此部分为步进电机控制部分
  void main(void)
{
    SCON=0x50;//设定串口工作方式0101 0000  串行口控制寄存器SCON  详细注释后面
    PCON=0x00;                 //=PCON主要是为CHMOS型单片机的电源控制而设置的专用寄存器,在51单片机中单元地址是87H,其结构格式如下:
    TMOD=0x20;   //> 20=10100   //TMOD是定时器/计数器模式控制寄存器(TIMER/COUNTER MODE CONTROL REGISTER)。
    EA=1;  //=EA引脚表示存取外部程序代码之意,低电平动作,当此引脚接低电平后,系统会取用外部的程序代码(存于外部EPROM中)来执行程序。EA引脚必须接低电平,因为其内部无程序存储器空间。
    ES=1; //=           ES:串行口中断控制位。ES=1,允许串行口中断。
    TL1=0xfd; //=fd=11111101         为什么51单片机串行中断中TL1和TH1的值要相同
    TH1=0xfd;  //= fd=11111101
    TR1=1;         //=                  TH1,TL1、TR1、TMOD是单片机的特殊寄存器 ,是用来控制计数/中断器的.TMOD(工作方式控制寄存器);TH1/TL1是定时器/计数器1;TR1=1是启动定时器1。
while(1);
{
  if(buf < 100 && buf > 0)
   {
  motor(buf);
  buf = 0;
      }
     }
  }//串行中断服务函数
void serial() interrupt 4          //==          interrupt翻译:打断
        {
        RI=0;
   buf=SBUF;                //= SBUF全称serial data buffer,中文名称“串行数据缓冲器”
          }
回复

使用道具 举报

ID:161164 发表于 2023-3-18 13:37 | 显示全部楼层
434939575 发表于 2023-3-17 21:00
感谢这位朋友的帮助。我这测试了电机没有动。
不知道什么原因,是否要放 interrupt 里面,我放了也不行。
...

While(1)后多了个分号
回复

使用道具 举报

ID:1016815 发表于 2023-3-18 16:08 | 显示全部楼层
lkc8210 发表于 2023-3-18 13:37
While(1)后多了个分号

真的太感谢,太大意了。就是这个串口发送还是没起作用,接通就转,这个现象好像就是认现在的这个100作为参数去转。不是等串口助手发送数据再去转。
回复

使用道具 举报

ID:846219 发表于 2023-3-18 22:39 | 显示全部楼层
我最近也遇到了,有启发
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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