Tanki 发表于 2026-6-19 17:39:19

8g1k08a定时器驱动舵机 失败

代码是缝合怪 左抄右抄而来的
目的是想用uart控制舵机
但舵机没有反应

已经试过TM0_Isr()改成以下代码
再接上LED(IO1 ) 可以稳定有1s闪烁



void TM0_Isr() interrupt 1
{
      c2++;
      if(c2 < 100) return;
      c2 = 0;
      
      c1++;
      if(c1 >= 1000){
                c1 = 0;
                IO1 = ~IO1;
         }
      
}

全部代码 :#include <stc8g.h>

//#define FOSC            11059200UL
#define FOSC            12000000UL
#define BRT             (65536 - FOSC / 115200 / 4)

bit busy;
char wptr;
char rptr;
char buffer;

sbit RRXD = P3 ^ 0;
sbit TTXD = P3 ^ 1;
sbit IO1 = P3 ^ 2;
sbit IO2 = P3 ^ 3;
sbit IO3 = P5 ^ 4;
sbit IO4 = P5 ^ 5;

unsigned int c1,c2,c3;
unsigned int Udata,i;
bit flag = 1;


void UartIsr() interrupt 4
{
    if (TI)
    {
      TI = 0;
      busy = 0;
    }
    if (RI)
    {
      RI = 0;
      buffer = SBUF;
      wptr &= 0x0f;
    }
}

void UartSend(char dat)
{
    while (busy);
    busy = 1;
    SBUF = dat;
}

void UartSendStr(char *p)
{
    while (*p)
    {
      UartSend(*p++);
    }
}

void TM0_Isr() interrupt 1
{
      /*
      c2++;
      if(c2 < 100) return;
      c2 = 0;
      
                        c1++;
                        if(c1 >= 1000){
                              c1 = 0;
                              IO1 = ~IO1;
                        }
      
      */
      
      // 每 1/100 毫秒中断一次
                        c1++;
                        if(flag == 0){
                              if(c1 >= 150){ // 1.5ms
                              //if(c1 >= Udata){
                                        c1 = 0;
                                        flag = 1;
                                        IO1 = 1;
                              }
                        }else{
                              if(c1 >= 1850){ // (20-1.5)ms = 18.5ms
                              //if(c1 >= 2000 - Udata){
                                        c1 = 0;
                                        flag = 0;
                                        IO1 = 0;
                              }
                        }
}

void main()
{
    SCON = 0x50;
    TMOD = 0x00;
    TL1 = BRT;
    TH1 = BRT >> 8;
    TR1 = 1;
    AUXR = 0x40;
    wptr = 0x00;
    rptr = 0x00;
    busy = 0;
      
    TL0 = 0xf6; //65536-12M/12/1000/100
    TH0 = 0xff;
    TR0 = 1;
    ET0 = 1;
      
    ES = 1;
    EA = 1;

    P3M0 = 0xff;
    P3M1 = 0x00;
    IO1 = 0;

    while (1)
    {
      if (rptr != wptr)
      {
            Udata = buffer;
            UartSend(Udata);
            rptr &= 0x0f;
      }
    }
}





神农鼎 发表于 2026-6-19 18:10:50


STC8G1K08A-SOP8如何驱动舵机,帮提供程序






















狂热主宰 发表于 2026-6-19 18:24:41

使用串口数据如:0x010x00
控制舵机左右旋转谋角度
AI助手可得示例code
尽量描述详细
接线正确

Tanki 发表于 2026-6-19 19:12:57

看了示例code 找到问题了
我以为高电平是0 低电平是1 {:daku:}
IO1 = 0 和 IO1 = 1 反过来就ok了

正确code :
void TM0_Isr() interrupt 1
{
      // 每 1/100 毫秒中断一次
                        c1++;
                        if(flag == 0){
                              if(c1 >= 150){ // 1.5ms
                              //if(c1 >= Udata){
                                        c1 = 0;
                                        flag = 1;
                                        IO1 = 0;
                              }
                        }else{
                              if(c1 >= 1850){ // (20-1.5)ms = 18.5ms
                              //if(c1 >= 2000 - Udata){
                                        c1 = 0;
                                        flag = 0;
                                        IO1 = 1;
                              }
                        }
}

神农鼎 发表于 2026-6-20 10:12:02

Tanki 发表于 2026-6-19 19:12
看了示例code 找到问题了
我以为高电平是0 低电平是1
IO1 = 0 和 IO1 = 1 反过来就ok了


STC 【AI 助手】,20秒搞出来的程序,真有帮助 ?
页: [1]
查看完整版本: 8g1k08a定时器驱动舵机 失败