资讯详情

51单片机 陀机 955 测试

红色,橙色信号线,棕色GND

单片机系统实现对舵机输出转角的控制,必须首先完成两项任务:首先,产生基本的PWM周期信号,即产生20ms的周期信号;其次,调整脉宽,即单片机调节PWM信号的占空比。单片机能使PWM信号的脉冲宽度实现微秒级的变化,从而提高舵机的转角精度。单片机完成控制算法,再将PWM信号输出到舵机。 #include<reg52.h>

typedef unsigned char BY; typedef unsigned int WORD; BYTE count,jd; sbit pwm=P1^6; sbit jia=P3^2; sbit jian=P3^3;

sbit LS138A = P2^2; //定义138译码器的输入A脚由P2.2控制 sbit LS138B = P2^3;//定义138译码器的输入脚B由P2.3控制 sbit LS138C = P2^4; //定义138译码器的输入脚C由P2.4控制 //此表为 LED 的字模, 共阴 0-9 - BYTE code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; WORD LedOut[10];//数码管数组

/*************************************************************************** *

* * 延时程序 * ****************************************************************************/

void Delay(WORD n) { WORD x;

while (n--) { x = 250; while (x--); } } /*************************************************************************** *

* * 显示函数 * ****************************************************************************/ void display(WORD num) {

WORD i,LedNumVal ; LedNumVal=num; LedOut[0]=Disp_Tab[LedNumVal%100000/10000]; //万位 LedOut[1]=Disp_Tab[LedNumVal%10000/1000]; //千位 LedOut[2]=Disp_Tab[LedNumVal%1000/100]; //百位 LedOut[3]=Disp_Tab[LedNumVal%100/10]; //十位 LedOut[4]=Disp_Tab[LedNumVal%10];//个位 LedOut[5]=Disp_Tab[LedNumVal%1000/100]|0x80; //百位带小数点 LedOut[6]=Disp_Tab[LedNumVal%100/10]; //十位 LedOut[7]=Disp_Tab[LedNumVal%10]; //个位 for( i=0; i<8; i++) //实现8位动态扫描循环 { P0 = LedOut[i]; //将字模送到P0口显示 switch(i) //使用switch 语句控制位选 也可以是用查表的方式 { case 0:LS138A=0; LS138B=0; LS138C=0; break; case 1:LS138A=1; LS138B=0; LS138C=0; break; case 2:LS138A=0; LS138B=1; LS138C=0; break; case 3:LS138A=1; LS138B=1; LS138C=0; break; case 4:LS138A=0; LS138B=0; LS138C=1; break; case 5:LS138A=1; LS138B=0; LS138C=1; break; case 6:LS138A=0; LS138B=1; LS138C=1; break; case 7:LS138A=1; LS138B=1; LS138C=1; break; } Delay(1);

} } //定时器初始化 void Time0_init() { TMOD=0x01; //定时器0工作方式1 IE=0x82; TH0=0xfe; TL0=0x33; //11.0592MHZ晶振,0.5ms TR0=1; } //定时器0中断程序 void Time0() interrupt 1 { TH0=0xfe; TL0=0x33; if(count<jd) //判断0.5ms次数是否小于角度标识 pwm=1; //是,pwm输出高电平 else pwm=0; //否,输出低电平 count=count+1; count=count%40; //次数始终保持为40,即保持周期为20ms } //按键扫描 void keyscan() { if(jia==0) { Delay(1); if(jia==0) { jd++; //角度增加 1 count=0; //按键按下则20ms周期重新开始计时 if(jd==6) jd=5; //已经是180度,保持 while(jia==0); } } if(jian==0) { Delay(1); if(jian==0) { jd--; count=0; if(jd==0) jd=1; //已经0度,保持 while(jian==0); } } } void main() { jd=1; count=0; Time0_init(); while(1) { keyscan(); display(jd); } }

-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台