标题:
寻迹小车程序 采用stc12单片机的PCA模块输出PWM,舵机控制转向
[打印本页]
作者:
grh
时间:
2017-7-31 13:40
标题:
寻迹小车程序 采用stc12单片机的PCA模块输出PWM,舵机控制转向
采用stc12c5a60s2的PCA模块输出PWM,舵机控制转向
单片机源程序如下:
#include<stc12c5a.h>
//ENA=P1^3;
//ENB=P1^4;
sbit dj=P1^0; // 陀机
sbit in1=P2^0; //电机转向控制端
sbit in2=P2^1; //
sbit in3=P2^2; //
sbit in4=P2^3; //
sbit HW1=P1^1; //红外传感器信号接收端
sbit HW2=P1^2; //
sbit HW3=P1^5; //
sbit HW4=P1^6; //
sbit HW5=P1^7; //
unsigned int zkb; //陀机 占空比
void Timer1(unsigned long int us)//给定时器赋初值
{
unsigned long int valu;
valu=us*12; //工作在1T,对机器周期计数12次,才是1us
valu=valu;
valu=0xffff-valu; //
TH1=valu>>8;
TL1=(valu<<8)>>8;
TR1 = 1; //T0开始工作
}
void main()
{
//PCA模块初始化
CMOD=0x04; //时钟源为定时器0
CCON=0; //PCA控制寄存器,CF、CR、CCF1(PCA模块中断标志,匹配或捕获时置位)、CCF0
CL=0; //当CL>CCAP0L时,输出为高电平
CH=0; //没有用到
CCAPM0=0x42; //8位PWM,无中断
CCAPM1=0x42; //PCA比较/捕获寄存器。8位PWM,无中断
CR=1;
CCAP0H=CCAP0L=256-45; //设置占空比(电机)
CCAP1H=CCAP1L=256-45;
//定时器初始化
AUXR|=0xc0; //辅助寄存器,这里让定时器为1T模式
TMOD=0x12;
TH0=256-47;
TL0=256-47;
TR0=1;
P1M1=0; //
P1M0=0XFF; //
EA=1; //开总中断
ET1 = 1;
Timer1(36); //开启定时器,进入中断函数
while(1)
{
if((HW1==0)&&(1==HW2)&&(1==HW3)&&(1==HW4)&&(1==HW5))
{
zkb=1250;
in1=0;
in2=1;
in3=1;
in4=0;
CCAP0H=CCAP0L=256-110; //设置占空比(电机)
CCAP1H=CCAP1L=256-150;
while(HW3&&HW4&&HW5);
}
else if((1==HW1)&&(0==HW2)&&(1==HW3)&&(1==HW4)&&(1==HW5))
{
zkb=1400;
in1=1;
in2=0;
in3=1;
in4=0;
CCAP0H=CCAP0L=256-80; //设置占空比(电机)
CCAP1H=CCAP1L=256-110;
while(HW1&&HW3&&HW4&&HW5);
}
else if((1==HW1)&&(1==HW2)&&(1==HW3)&&(0==HW4)&&(1==HW5))
{
in1=1;
in2=0;
in3=1;
in4=0;
zkb=1600;
CCAP0H=CCAP0L=256-80; //设置占空比(电机)
CCAP1H=CCAP1L=256-110;
while(HW5&&HW3&&HW2&&HW1);
}
else if((1==HW1)&&(1==HW2)&&(1==HW3)&&(1==HW4)&&(0==HW5))
{
in1=1;
in2=0;
in3=0;
in4=1;
zkb=1750;
CCAP0H=CCAP0L=256-150; //设置占空比(电机)
CCAP1H=CCAP1L=256-110;
while(HW3&&HW2&&HW1);
}
else
{
zkb=1500;
in1=1;
in2=0;
in3=1;
in4=0;
CCAP0H=CCAP0L=256-100; //设置占空比(电机)
CCAP1H=CCAP1L=256-100;
}
}
}
/*************************************
t0 中断 中断
*************************************/
void T1zd() interrupt 3 //产生中断后,又给定时器0赋初值,准备下一次中断
{
static unsigned char num=1; //静态全局变量,初始化操作只会被执行一次
switch(num)
{
case 1:
{
dj=1;
Timer1(zkb); //pwm_valu微秒后再次产生中断
} break;
case 2:
{
dj=0; //pwm1变低
Timer1(2500-zkb);//
} break;
case 3:
{
Timer1(2500);//
} break;
case 4:
{
Timer1(2500);//
} break;
case 5:
{
Timer1(2500);//
} break;
case 6:
{
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
STC12.rar
(25.23 KB, 下载次数: 57)
2017-7-31 13:39 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
yu霈
时间:
2017-8-19 15:16
有接线图吗?谢谢分享,
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1