智能小车舵机控制

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

// 只利用一个定时器T0 ,定时时间为,定义一个角度标识,数值为1 、2、3、4、5,// 实现、1ms、、2ms、高电平的输出,再定义一个变量,数值最大为40 ,实现周期为// 每次进入定时中断,判断此时的角度标识,进行

// 相应的操作。比如此时为5 ,则进入的前5 次中断期间,信号输出为高电平,即为

// 高电平。剩下的35 次中断期间,信号输出为低电平,即为的低电平。这样总的时间// 是

20ms,为一个周期。

// 用51 板上s1 和s2 按键

// 用P1^7 输出PWM信号控制舵机

#include ""

sbit dula=P2^6;

sbit wela=P2^7;

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e

void delay(unsigned char i)// {

unsigned char j,k;

for(j=i;j>0;j--)

for(k=125;k>0;k--);

}

void Time0_Init() //

{

TMOD = 0x01; //

IE= 0x82;

TH0= 0xfe;

TL0= 0x33; //

TR0=1; //

}

void Time0_Int() interrupt 1 //

{

TH0 = 0xfe; //

TL0 = 0x33;

if(count

pwm=1; //

else

pwm=0; //

count=(count+1); //

count=count%40; //

延时

定时器初始化

定时器0 工作在方式1

晶振,定时器开始

中断程序

重新赋值

判断次数是否小于角度标识

确实小于,PWM输出高电平大于则

输出低电平

次数加1

次数始终保持为40 即保持周期为20ms

20ms。

unsigned char count; // sbit pwm =P1^7 ; //PWM sbit jia =P3^0; //

sbit jan =P3^1; //

sbit jianwei=P3^4; // unsigned char jd; //

次数标识

信号输出角度增加按键检测IO 口角度减少按键检测IO 口按键位

角度标识

按键扫描

角度增加按键是否按下 按下延时,消抖 确实按下 角度标识加 1 按键按下 则 20ms 周期从新开始 已经是 180 度,则保持 等待按键放开 角度减小按键是否按下 , 角度标识减 1 已经是 0 度,则保持 数码管显示函数 根据角度标识显示相应的数值 为 1 ,角度为 0,前 3 个数码管显示

ge=0;

break;

case 2:

bai=0;

shi=4;

ge=5;

break;

case 3:

bai=0;

shi=9;

ge=0; } void keyscan() //

{

if(jia==0) //

{

delay(10); // if(jia==0) //

{

jd++; //

count=0; // if(jd==6)

jd=5; // while(jia==0);

//

}

}

if(jan==0) //

{

delay(10);

if(jan==0)

{

jd--; //

count=0;

if(jd==0)

jd=1; //

while(jan==0);

}

}

}

void display() //

{

unsigned char bai,shi,ge;

switch(jd) //

{

case 1: //

bai=0;

shi=0;

000

break;

case 4: bai=1; shi=3;

ge=5; break;

case 5: // bai=1;

shi=8; ge=0; break;

}

dula=0;

为5,角度为180 ,前 3 个数码管显示

180 P0=table[bai];

dula=1;

dula=0;

wela=0;

P0=0xfe;

wela=1;

wela=0;

delay(5);

P0=table[shi];

dula=1;

dula=0;

P0=0xfd;

wela=1;

wela=0;

delay(5);

P0=table[ge];

dula=1;

dula=0;

P0=0xfb;

wela=1;

wela=0;

delay(5);

}

void main()

{

jd=1;

jianwei=0;

count=0;

Time0_Init();

while(1)

{

keyscan(); //

display();

}

按键扫描

相关文档
最新文档