#include "STC15F2K60S2.h"
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/**************函数声明****************/
void Adjust(void);
void Timer0_Init(void);
void delay(unsigned int ms);
void direction();
/***************定义使用的I/O管脚*****************/
//模块信号输入端口
sbit IN_1=P0^0;
sbit IN_2=P0^1;
sbit IN_3=P0^2;
sbit IN_4=P0^3;
sbit east= P0^4;
sbit south= P0^5;
sbit western= P0^6;
sbit north= P0^7;
//PWM输出
sbit PWM=P4^1;
sbit PWM2=P4^2;
//选择信号
uchar pwm_flag=0;
//定时器初值
uint code low_ms=461; //0.5ms 舵机0度对应占空比 11.0592Mhz
uint code high_ms=9216; //10ms
uint pwm[]={1382,1382}; //1.5ms,舵机1和舵机2处于90度位郑50%占空比
void main()
{
//设定舵机输出端口为强推挽输出模式
P4M0=0X06;
P4M1=0X00;
//PO端口设为双向I/O口
P0M0=0X00;
P0M1=0X00;
Timer0_Init();
while(1)
{
Adjust();
direction();
}
}
/************舵机控制**************/
void Adjust(void)
{
//判断3,4口引脚输入状态
if(IN_2==1&&IN_1==0)
{
pwm[1]=pwm[1]+5; // 舵机向北转0.5度
if(pwm[1]>1602) //1602us向北转20度
pwm[1]=1602; //不大于20度
}
else if(IN_2==1&&IN_1==1)
{
pwm[1]=pwm[1];
}
else if(IN_2==0&&IN_1==1)
{
pwm[1]=pwm[1]-5; //舵机向南转0.5度
if(pwm[1]<1102) //1102 向南转20度
pwm[1]=1102; //不大于20度
}
//判断1,2口引脚输入状态
if(IN_4==1&&IN_3==0)
{
pwm[0]=pwm[0]+5; //舵机向西转0.5度
if(pwm[0]>2304) //不大于180度
pwm[0]=2304;
}
else if(IN_4==1&&IN_3==1)
{
pwm[0]=pwm[0];
}
else if(IN_4==0&&IN_3==1)
{
pwm[0]=pwm[0]-5; //舵机向东转0.5度
if(pwm[0]<461) //到0度时不继续往下
pwm[0]=461;
}
delay(30);
}
void direction()
{
if(pwm[0]>1402) //西面时,西方向灯点亮
{
east=1;
western=0;
}
else if(pwm[0]<1362) //东面时,西方向灯点亮
{
east=0;
western=1;
}
else
{
east=1;
western=1;
}
if(pwm[1]>1402) //南面时,南方向灯点亮
{
south=0;
north=1;
}
else if(pwm[1]<1362) //北面时,北方向灯点亮
{
south=1;
north=0;
}
else
{
south=1;
north=1;
}
}
void Timer0_Init(void)
{
TMOD |=0x01;
TH0=-high_ms>>8;
TL0=-high_ms;
TR0 = 1; //定时器0开始计时
EA = 1;
ET0 = 1;
}
void timer() interrupt 1
{
switch(pwm_flag)
{
case 1: PWM=1; TH0=-pwm[0]>>8; TL0=-pwm[0]; break; // 高电平持续时间pwm[0]
case 2: PWM=0; TH0=-(high_ms-pwm[0])>>8; TL0=-(high_ms-pwm[0]); break; //低电平时间10-pwm[0] ms
case 3: PWM2=1; TH0=-pwm[1]>>8; TL0=-pwm[1]; break; // 高电平持续时间pwm[1]
case 4: PWM2=0; TH0=-(high_ms-pwm[1])>>8; TL0=-(high_ms-pwm[1]); break; //低电平时间10-pwm[1] ms
default: TH0=0xff; TL0=0x80; pwm_flag=0;
}
pwm_flag++;
}
//毫秒延时
void delay(unsigned int ms)
{
unsigned int i;
do{
i = 11059200 / 13000;
while(--i);
}while(--ms);
}
|