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;
}
}
}
STC8G1K08A-SOP8如何驱动舵机,帮提供程序
使用串口数据如:0x010x00
控制舵机左右旋转谋角度
AI助手可得示例code
尽量描述详细
接线正确 看了示例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;
}
}
} Tanki 发表于 2026-6-19 19:12
看了示例code 找到问题了
我以为高电平是0 低电平是1
IO1 = 0 和 IO1 = 1 反过来就ok了
STC 【AI 助手】,20秒搞出来的程序,真有帮助 ?
页:
[1]