|
刚接触单片机,还属于菜鸟级别,还望各位前辈多多指教。
#include<reg51.h>
sfr CCON=0xd8;
sfr CMOD=0xd9;
sfr CL=0xe9;
sfr CH=0xf9;
sfr CCAP0L=0xea;
sfr CCAP0H=0xfa;
sfr CCAP1L=0xeb;
sfr CCAP1H=0xfb;
sfr CCAPM0=0xda;
sfr CCAPM1=0xdb;
sfr PCA_PWM0=0xf2;
sfr PCA_PWM1=0xf3;
sbit CR=0xde;
sbit K1=P1^0;
sbit K2=P1^1;
sbit K3=P1^2;
sbit K4=P1^3;
sbit out1=P2^0;
sbit out2=P2^1;
sbit out3=P2^2;
sbit out4=P2^3;
unsigned char zhuangtai1,zhuangtai2,zhuangtai3;
/****************************************
函数名:延时子函数
调用:delay(unsigned int t);
参数:unsigned char j;
返回值:unsigned int t;
结果:
备注:
/*********************************************/
void delay(unsigned int t){ //延时子程序
unsigned char j;
while(t--){
for(j=1;j>0;j--);
}
}
/*******************************************/
/********************************************
函数名:PWM初始化函数
调用:PWM_init();
参数:无
返回值:无
结果:将PCA初始化为PWM模式,初始占空比为0
备注:需要多路PWM输出直接插入CCAPnH和CCAPnL即可
/********************************************/
void PWM_init(void){
CMOD=0x02; //设置PCA定时器
CL=0x00;
CH=0x00;
CCAPM0=0x42; //PWM0设置PCA工作方式为PWM方式(0100 0010)
CCAP0L=0x00; //设置PWM0初始值与CCAP0H相同
CCAP0H=0x00; //PWM0初始时为0
CCAPM1=0x42; //PWM1设置PCA工作方式为PWM方式
CCAP1L=0x00; //设置PWM1初始值与CCAP0H相同
CCAP1H=0x00; //PWM1初始时为0
CR=1; //启动PCA定时器
}
/*****************************************************/
/****************************************
函数名:PWM0占空比设置函数
调用:PWM0_set();
参数:0x00~oxFF(也可用0~255)
返回值:无
结果:设置PWM模式占空比,为0时全部高电平,为1时全部为低电平
备注:如果需要PWM1的设置函数,只要把CCAP0L和CCAP0H中的0改为1即可
/**************************************************/
void PWM0_set(unsigned char a){
CCAP0L=a; //设置值直接写入CCAP0L
CCAP0H=a; //设置值直接写入CCAP0H
}
void PWM1_set(unsigned char a){
CCAP1L=a; //设置值直接写入CCAP1L
CCAP1H=a; //设置值直接写入CCAP1H
}
/**************************************************/
/*********************************************
函数名:电机转动
调用:comeleft();comeright();comeon();comeback();PWM0_set();PWM1_set();
参数:0xc0;0x00;
返回值:无
备注:
/****************************************************/
void comeleft(){ //左转
unsigned char j;
PWM0_set(0xc0);
PWM1_set(0xff);
out2=0;
out4=0;
out3=1;
for(j=0;j<10;j++)
{
out1=0;
delay(2);
out1=1;
out3=1;
delay(1);
}
}
void comeright()
{ //右转
unsigned char j;
PWM0_set(0xff);
PWM1_set(0xc0);
out2=0;
out4=0;
out1=1;
for(j=0;j<10;j++)
{
out3=0;
delay(2);
out1=1;
out3=1;
delay(1);
}
}
void comeon()
{ //直行
PWM0_set(0xc0);
PWM1_set(0xc0);
out2=0;
out4=0;
out1=1;
out3=1;
}
void comeback()
{ //后退
PWM0_set(0xc0);
PWM1_set(0xc0);
out2=1;
out4=0;
out1=0;
out3=0;
delay(5);
}
/*************************************************/
/**************************************************
函数名:循迹
调用:scanline();
参数:无
返回值:无
备注:
/*****************************************************/
void scanline()
{ //循迹
if(K3==1)
{
comeleft(); // 左 转
zhuangtai3=1;
zhuangtai2=0;
zhuangtai1=0;
}
else if(K1)
{
comeright(); //右转
zhuangtai3=0;
zhuangtai2=0;
zhuangtai1=1;
}
else if(K2||(!K1&&!K2&&!K3))
{
comeon(); //直行
zhuangtai3=0;
zhuangtai2=1;
zhuangtai1=0;
}
else{
if(zhuangtai3){comeleft();}
if(zhuangtai2){comeon();}
if(zhuangtai1){comeright();}
else{;}
}
}
/***********************************************/
/*************************************************
函数名:主函数
调用:无
参数:无
返回值:无
结果:程序开始处,无限循环
备注:
/***********************************************/
void main(void){
P1=0xff;
P2=0xff;
PWM_init(); //PWM初始化
while(1){
if(K4){
scanline();
}
else{comeback();}
}
}
/**********************************************/
![](http://cache.amobbs.com/bbs_upload782111/files_47/ourdev_691791VUIQAO.jpg)
循迹 (原文件名:20100301716.jpg)
![](http://cache.amobbs.com/bbs_upload782111/files_47/ourdev_691792ZB3HAC.jpg)
(原文件名:20100301720.jpg)
![](http://cache.amobbs.com/bbs_upload782111/files_47/ourdev_691793CNS7VO.jpg)
(原文件名:图像028.jpg) |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|