標(biāo)題: 請(qǐng)教單片機(jī)interrupt 4 控制步進(jìn)電機(jī)圈數(shù)有問(wèn)題 控制led運(yùn)行正常 [打印本頁(yè)]

作者: 434939575    時(shí)間: 2023-3-16 22:29
標(biāo)題: 請(qǐng)教單片機(jī)interrupt 4 控制步進(jìn)電機(jī)圈數(shù)有問(wèn)題 控制led運(yùn)行正常
  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# 此部分為步進(jìn)電機(jī)控制部分
  6. void delay(char x)//延時(shí)程序
  7. {                          
  8.    char i;
  9.    while(x--)
  10.    {
  11.      for(i=0; i<120; i++);
  12.    }
  13. }
  14. void  motor(unsigned int a)//a即想要轉(zhuǎn)的圈數(shù)
  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# 此部分為步進(jìn)電機(jī)控制部分
  27.   void main(void)
  28. {
  29. SCON=0x50;//設(shè)定串口工作方式0101 0000  串行口控制寄存器SCON  詳細(xì)注釋后面
  30. PCON=0x00;                 //=PCON主要是為CHMOS型單片機(jī)的電源控制而設(shè)置的專用寄存器,在51單片機(jī)中單元地址是87H,其結(jié)構(gòu)格式如下:
  31. TMOD=0x20;   //> 20=10100   //TMOD是定時(shí)器/計(jì)數(shù)器模式控制寄存器(TIMER/COUNTER MODE CONTROL REGISTER)。
  32. EA=1;  //=EA引腳表示存取外部程序代碼之意,低電平動(dòng)作,當(dāng)此引腳接低電平后,系統(tǒng)會(huì)取用外部的程序代碼(存于外部EPROM中)來(lái)執(zhí)行程序。EA引腳必須接低電平,因?yàn)槠鋬?nèi)部無(wú)程序存儲(chǔ)器空間。
  33. ES=1; //=           ES:串行口中斷控制位。ES=1,允許串行口中斷。
  34. TL1=0xfd; //=fd=11111101         為什么51單片機(jī)串行中斷中TL1和TH1的值要相同
  35. TH1=0xfd;  //= fd=11111101
  36. TR1=1;         //=                  TH1,TL1、TR1、TMOD是單片機(jī)的特殊寄存器 ,是用來(lái)控制計(jì)數(shù)/中斷器的.TMOD(工作方式控制寄存器);TH1/TL1是定時(shí)器/計(jì)數(shù)器1;TR1=1是啟動(dòng)定時(shí)器1。
  37. while(1);
  38. }
  39. //串行中斷服務(wù)函數(shù)
  40. void serial() interrupt 4          //==          interrupt翻譯:打斷
  41.         {
  42.         ES=0;
  43.         RI=0;
  44.     buf=SBUF;                //= SBUF全稱serial data buffer,中文名稱“串行數(shù)據(jù)緩沖器”
  45. //**********************************************************************************
  46. //2#-段內(nèi)容            =正確運(yùn)行  等待串口助手"文本輸入數(shù)字后點(diǎn)亮燈光
  47. //if(buf<50)//35=3  可以輸入0 1點(diǎn)亮LED燈
  48. // P1=0X01;
  49. //***********************************************************************************
  50.           if(buf<100)//------------------1#--步進(jìn)電機(jī)控制
  51.          {          delay(1000); //不知道什么問(wèn)題加載電機(jī)就運(yùn)轉(zhuǎn),不是等待輸入數(shù)字轉(zhuǎn)多少圈,
  52.            motor(buf); //轉(zhuǎn)n圈(可以改動(dòng))         
  53.        delay(1000);
  54.        while(1) ;
  55.          } //------------------1#--步進(jìn)電機(jī)控制<<
  56.         ES=1;//串口中斷
  57. }
復(fù)制代碼



作者: 434939575    時(shí)間: 2023-3-16 22:34
請(qǐng)教各位朋友們,我運(yùn)用interrupt 4 串口助手輸入數(shù)字,即等待輸入后控制LED ,
但步進(jìn)電機(jī)不起作用,下載程序后就開(kāi)始運(yùn)轉(zhuǎn),不知道什么問(wèn)題,我是想輸入數(shù)據(jù)步進(jìn)電機(jī)走多少圈。
作者: lkc8210    時(shí)間: 2023-3-17 10:31


作者: 434939575    時(shí)間: 2023-3-17 21:00
感謝這位朋友的幫助。我這測(cè)試了電機(jī)沒(méi)有動(dòng)。
不知道什么原因,是否要放 interrupt 里面,我放了也不行。
我照抄的,應(yīng)該沒(méi)錯(cuò)。
#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# 此部分為步進(jìn)電機(jī)控制部分
void delay(char x)//延時(shí)程序
{                          
   char i;
   while(x--)
   {
     for(i=0; i<120; i++);
   }
}
void  motor(unsigned int a)//a即想要轉(zhuǎn)的圈數(shù)
{
   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# 此部分為步進(jìn)電機(jī)控制部分
  void main(void)
{
    SCON=0x50;//設(shè)定串口工作方式0101 0000  串行口控制寄存器SCON  詳細(xì)注釋后面
    PCON=0x00;                 //=PCON主要是為CHMOS型單片機(jī)的電源控制而設(shè)置的專用寄存器,在51單片機(jī)中單元地址是87H,其結(jié)構(gòu)格式如下:
    TMOD=0x20;   //> 20=10100   //TMOD是定時(shí)器/計(jì)數(shù)器模式控制寄存器(TIMER/COUNTER MODE CONTROL REGISTER)。
    EA=1;  //=EA引腳表示存取外部程序代碼之意,低電平動(dòng)作,當(dāng)此引腳接低電平后,系統(tǒng)會(huì)取用外部的程序代碼(存于外部EPROM中)來(lái)執(zhí)行程序。EA引腳必須接低電平,因?yàn)槠鋬?nèi)部無(wú)程序存儲(chǔ)器空間。
    ES=1; //=           ES:串行口中斷控制位。ES=1,允許串行口中斷。
    TL1=0xfd; //=fd=11111101         為什么51單片機(jī)串行中斷中TL1和TH1的值要相同
    TH1=0xfd;  //= fd=11111101
    TR1=1;         //=                  TH1,TL1、TR1、TMOD是單片機(jī)的特殊寄存器 ,是用來(lái)控制計(jì)數(shù)/中斷器的.TMOD(工作方式控制寄存器);TH1/TL1是定時(shí)器/計(jì)數(shù)器1;TR1=1是啟動(dòng)定時(shí)器1。
while(1);
{
  if(buf < 100 && buf > 0)
   {
  motor(buf);
  buf = 0;
      }
     }
  }//串行中斷服務(wù)函數(shù)
void serial() interrupt 4          //==          interrupt翻譯:打斷
        {
        RI=0;
   buf=SBUF;                //= SBUF全稱serial data buffer,中文名稱“串行數(shù)據(jù)緩沖器”
          }
作者: lkc8210    時(shí)間: 2023-3-18 13:37
434939575 發(fā)表于 2023-3-17 21:00
感謝這位朋友的幫助。我這測(cè)試了電機(jī)沒(méi)有動(dòng)。
不知道什么原因,是否要放 interrupt 里面,我放了也不行。
...

While(1)后多了個(gè)分號(hào)
作者: 434939575    時(shí)間: 2023-3-18 16:08
lkc8210 發(fā)表于 2023-3-18 13:37
While(1)后多了個(gè)分號(hào)

真的太感謝,太大意了。就是這個(gè)串口發(fā)送還是沒(méi)起作用,接通就轉(zhuǎn),這個(gè)現(xiàn)象好像就是認(rèn)現(xiàn)在的這個(gè)100作為參數(shù)去轉(zhuǎn)。不是等串口助手發(fā)送數(shù)據(jù)再去轉(zhuǎn)。
作者: woshitomge    時(shí)間: 2023-3-18 22:39
我最近也遇到了,有啟發(fā)




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