历史上的今天
返回首页

历史上的今天

今天是:2026年01月31日(星期六)

2023年01月31日 | 基于51单片机理解SG90舵机原理并用按键控制

2023-01-31 来源:zhihu

具体功能实现

当按下开关时,舵机的角度分别运行到0°,45°,90°,135°,180°,0°(最后停止位置),其中每转动一个角度时间延时1s。


器件:

AT89C52,sg90舵机,三根杜邦线公对母,两支按键

转动角度展示图:


转动至45°

转动至180°

转动至90°

知识介绍:

sg90舵机简介

由直流电机、减速齿轮组、传感器(可变电阻)和控制电路组成的一套自动控制系统。

直流电机是一圈圈转动的,舵机只能在一定角度内转动(有最大旋转角度比如:180度),不能一圈圈转。

外部中断:

STC89C52有4个外部中断;

STC89C52的外部中断有两种触发方式:

下降沿触发和低电平触发

下降沿触发:当按键按下不松手时只触发一次

低电平触发:当按键按下不松手时会持续触发

中断号:

由定时器和中断系统这张图来分析,可以得到定时器0的初始代码如下:

void Init_Timer0()

{

TMOD = 0x01;

TL0 = 0x33; //设置定时初值

TH0 = 0xFE; //设置定时初值

EA = 1;

ET0 = 1;

TR0 = 1;

PT0 = 1;

TF0=0;

}

PWM脉冲宽度调制定理

PWM(Pulse Width Modulation)即脉冲宽度调制,在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速、开关电源等领域

PWM重要参数:

频率 = 1 / TS 占空比 = TON / TS 精度 = 占空比变化步距

例子:在制作LED呼吸灯时,如果想要让LED亮的时间更长,只需要提高比较值。


sg90舵机接线图

舵机的输入线共有三条:

红色线——电源正线(需接5V电源才能驱动)

棕色线——电源地线

黄色线——信号线(本项目使用P2^7端口)

sg90舵机控制原理


本文采用的是定时器0来计时,初始值设为0.5ms,每次定时器溢出是0.5ms,设置一个计数值count=0,每一个0.5ms count都会自增1,加了40次就20ms,是舵机控制的一个周期。


所以0.5ms是自增一次,1ms是自增两次,1.5ms是自增三次,2ms是自增四次,2.5ms是自增五次。

主函数代码(C语言)KEIL5实现:

无按键自转代码:


#include


sbit Sg90_com = P2^7;


unsigned char compare=0,count=0; //compare比较值控制占空比大小,控制舵机转动的角度


void Delay1ms(unsigned int num) //@11.0592MHz


{


unsigned char i, j;


while(num--)


{


i = 2;


j = 199;


do


{


while (--j);


} while (--i);


}


}


void Init_Timer0()


{


TMOD = 0x01;


TL0 = 0x33; //设置定时初值


TH0 = 0xFE; //设置定时初值


EA = 1;


ET0 = 1;


TR0 = 1;


PT0 = 1;


TF0=0;


}


void main()


{


Init_Timer0();


while(1)


{


compare = 1; //0度


Delay1ms(1000);


compare = 2; //45度


Delay1ms(1000);


compare = 3; //90度


Delay1ms(1000);


compare = 4; //135度


Delay1ms(1000);


compare = 5; //180度


Delay1ms(1000);


}


}


void Timer0_Rountine() interrupt 1 //每次定时器溢出时是0.5ms


{


TL0 = 0x33; //设置定时初值


TH0 = 0xFE; //设置定时初值


count++;


//PWM控制


if(count < 40) //每一个0.5mscount都会++,加了40次就20ms,是舵机控制的一个周期


{


if(count < compare) //通过比较值控制高电平占据周期的时间,也就是占空比大小


{


Sg90_com = 1;


}


else


{


Sg90_com = 0;


}


}


else //count加到40后清零


{


count = 0;


Sg90_com = 1;


}


}




按键自转代码:


#include


sbit Sg90_com = P2^7;


sbit key1 = P3^1;    //独立按键1


sbit key2 = P3^0; //独立按键2




unsigned char compare=0,count=0; //compare比较值控制占空比大小,控制舵机转动的角度


void Delay1ms(unsigned int num) //@11.0592MHz


{


unsigned char i, j;


while(num--)


{


i = 2;


j = 199;


do


{


while (--j);


} while (--i);


}


}


void Init_Timer0()


{


TMOD = 0x01;


TL0 = 0x33; //设置定时初值


TH0 = 0xFE; //设置定时初值


EA = 1;


ET0 = 1;


TR0 = 1;


PT0 = 1;


TF0=0;


}


void main()


{


Init_Timer0();


while(1)


{


while(key1==0){


compare = 1; //0度


Delay1ms(1000);


}


while(key2==0){


compare = 5; //180度


Delay1ms(1000);


}


}


}


void Timer0_Rountine() interrupt 1 //每次定时器溢出时是0.5ms


{


TL0 = 0x33; //设置定时初值


TH0 = 0xFE; //设置定时初值


count++;


//PWM控制


if(count < 40) //每一个0.5mscount都会++,加了40次就20ms,是舵机控制的一个周期


{


if(count < compare) //通过比较值控制高电平占据周期的时间,也就是占空比大小


{


Sg90_com = 1;


}


else


{


Sg90_com = 0;


}


}


else //count加到40后清零


{


count = 0;


Sg90_com = 1;


}


}

问题解答:

Q1:代码超出版本限制如何解决?如图:

A1:用注册机对KEIL5软件进行重新破解,破解步骤链接:

Q2:延时函数如何快速自动生成?

A2:在STC-ISP中根据红色方框进行设计


Q3:单片机计时器TH0 和TL0初值的计算方法

A3:首先计算计数值:
例如:计数值=10000us(10ms转换成微秒)* 11.0592(晶振大小)/12 计算结果=9216
TH0=(65536-9216)/256 =DC
TL0=(65536-9216)%256 =00

//8位逢256进位,整除的结果为高位,取余的结果为低位

Q4:单片机计时器TMOD设置

A4:通常情况下,定时器0的TMOD=0x01,工作模式1——16位计时计数器 (65536)


下面两张图是工作模式1和2的对比流程图:



推荐阅读

史海拾趣

智烽维(CDA)公司的发展小趣事

经过几年的技术积累和市场探索,智烽维在2013年成功完成了叠片型超级电容器的研发。这一产品的推出,不仅极大地丰富了公司的产品线,也进一步提升了智烽维在超级电容器领域的技术实力。叠片型超级电容器以其高性能、高可靠性和长寿命等特点,受到了市场的广泛关注和好评。

EM Devices Corporation公司的发展小趣事

EM Devices Corporation的创始人在电子工程领域有着深厚的背景,他们看到了当时市场上对高性能电子元件的迫切需求。于是,他们决定创办EM Devices Corporation,专注于研发和生产高质量的电子元件。起初,公司面临了资金、技术和市场等多方面的挑战。然而,凭借创始人对技术的执着追求和对市场的敏锐洞察,公司成功研发出了一款具有竞争力的产品,并逐渐在市场上获得了认可。

珠海艾派克(APEXMIC)公司的发展小趣事

随着技术的不断进步,艾派克逐渐在打印机芯片领域取得了突破。公司成功研发出一系列从打印机主控SoC芯片到耗材加密芯片的全系列打印机芯片产品,不仅满足了国内市场的需求,还成功打入国际市场,成为全球打印机通用耗材芯片的重要供应商。这一成就标志着艾派克在打印机芯片领域的领先地位得到了进一步巩固。

安碁科技(AKER)公司的发展小趣事

品质是企业的生命线。安碁科技自成立以来,一直注重品质管理和技术创新。2000年,公司引进了全自动化制程设备,正式生产SMD产品,并通过了ISO9002认证。此后,安碁科技陆续通过了多项国际认证,如TL-9000、TS16949等,证明了其在品质管理方面的卓越表现。同时,公司也不断投入研发资源,推动技术创新和产品升级,以满足市场不断变化的需求。

Astro Industries Inc公司的发展小趣事

面对日益激烈的市场竞争,Astro Industries Inc意识到成本控制的重要性。于是,公司开始着手进行供应链的整合与优化。通过与优质供应商建立长期合作关系,公司确保了原材料的稳定供应和质量可控。同时,公司还引入了先进的生产管理系统,提高了生产效率,降低了生产成本。这些措施使得Astro Industries Inc在保持产品质量的同时,也具备了更强的市场竞争力。

Emulation Technology Inc公司的发展小趣事

为了进一步扩大市场份额,Emulation积极实施国际化战略。公司先后在北美、欧洲和亚洲等地设立了分支机构,与当地合作伙伴建立了紧密的合作关系。这些分支机构不仅为Emulation提供了更多的市场机会,还帮助公司更好地了解当地市场需求和竞争态势。

问答坊 | AI 解惑

设计经验交流:AD采样注意的事项

主要针对高精度测量类的AD. 1:参考电压需要足够精确,推荐使用外部高精准参考电压. 2:如果PGA可调,增益系数一般是越小噪声越低. 3:一般最好用到满量程,此时AD精度不浪费. 4:如果有偏置,需要进行自校. 5:请注意在使用DEMO板调试时,会由调试口导入 ...…

查看全部问答>

用Atmega8单片机自制智能型液晶显示充电器

一、概述:    移动通讯、消费类数码产品、笔记本电脑、便携仪器等便携设备市场的不断扩张,使得我们对电池的性能和工作寿命的要求不断地提高。从20世纪60年代的商用镍镉和密封铅酸电池到近几年的镍氢和锂离子技术,可充电电池容量和性能得到了 ...…

查看全部问答>

PLC的运行原理一点就通

PLC执行程序的过程分为三个阶段,即输入采样阶段、程序执行阶段、输出刷新阶段。 在输入采样阶段,PLC以扫描工作方式按顺序对所有输入端的输入状态进行采样,并存入输入映象寄存器中,此时输入映象寄存器被刷新。接着进入程序处理阶段,在程序执行 ...…

查看全部问答>

SRAM DRAM SDRAM区别

DRAM,动态随机存取存储器,需要不断的刷新,才能保存数据。 而且是行列地址复用的,许多都有页模式。 SRAM,静态的随机存取存储器,加电情况下,不需要刷新,数据 不会丢失,而且,一般不是行列地址复用的。 SDRAM,同步的DRAM,即数据的 ...…

查看全部问答>

wince 5.0中SD卡的驱动问题

S3c2410中做wince 的SD卡驱动,sd 的主控制器中有个fifo的状态寄存器,但是硬件并没有提供fifo啊,这个fifo是用软件实现的,就是在pRequest的数据结构中定义了一上buffer指针,那么,这个buffer指针是如何能够影响到这个fifo的状态寄存器的呢?请高 ...…

查看全部问答>

AT89S52程序错误,望指教!

本人写AT89S52单片机1602显示程序出现问题,始终找不到症结,向大家请教!先行谢过!!!! #include sbit RS=P3^4; sbit LCDCS=P1^5; #define uchar unsigned char; uchar mydata; uchar command; uchar a; uchar code table[]={\"i love ...…

查看全部问答>

PC机与平台连不上,Windows CE5.0系统运行得非常慢,且系统时间改不了

    我现在在使用广州致远电子有限公司的“MagicARM2410教学实验开发平台”来做项目,但近来我碰到了一些问题:就是PC机与平台连不上(步骤与实验书中 一样),而且设备中的Windows CE5.0系统运行得非常慢,且系统时间改不了。但另一 ...…

查看全部问答>

应用程序Data Abort定位

我的Data abort错误如下 Data Abort: Thread=8f9f2400 Proc=8e026d90 \'Radio1.exe\' AKY=00000041 PC=03f96480 RA=03f953a0 BVA=0e380030 FSR=00000007 在网上看到的错误PC值都有偏移量,这个怎么在MAP文件里定位啊?…

查看全部问答>

--------逻辑中断-------

DWORD SysIntr = SYSINTR_UNDEFINED;    /*定义一个逻辑中断*/ 是不是定义了一个DWOR类型的变量SysIntr 值是SYSINTR_UNDEFINED ?????? 再请问  逻辑中断 和中断的区别!! 谢谢…

查看全部问答>

ZigBee技术在家庭医疗监护系统的应用

南京瀚之显电子科技有限公司是一家专注于分布式无线传感网及其测控系统核心技术研发与产品应用的高科技企业。瀚之显拥有系列无线传感网核心技术和相关知识产权,包括U-Net网络协议栈、中短距离2.4G/780M无线模块、各类无线数采仪、WSN无线网关单元 ...…

查看全部问答>