|
爱科技、爱创意、爱折腾、爱极致,我们都是技术控
您需要 登录 才可以下载或查看,没有账号?立即注册
x
用STC12C5A60S2编写的程序不能正常运行,进入for中正反转循环就跳不出来,数码管也不亮了,其他红外按键也没用了,还有就是PWM给电机调速只有CCAP1H的值在200至255中间有效,跪求大神解惑。
#include<STC12C5A60S2.H> //头文件
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
typedef uchar INT8U;
typedef uint INT16U;
sbit PWM_1=P1^4; //PWM输出端口
sbit A1=P1^5; //定义直流电机正端口
sbit A2=P1^6; //定义直流电机负端口
sbit IR = P3^2; //定义红外脉冲数据接口
sbit beep = P3^6; //蜂鸣器的位置
sbit P2_0 = P2^0; //数码管位选接口
sbit P2_1 = P2^1;
sbit P2_2 = P2^2;
sbit P2_3 = P2^3;
sbit S1=P2^5; //限位开关1
sbit S2=P2^6; //限位开关2
#define D_A1 {A1=1;A2=0;} //电机正转
#define D_A2 {A1=0;A2=1;} //电机反转
#define D_AOFF {A1=1;A2=1;} //电机停
uint W=0; //定义速度等级
uchar A=0; //方向标记 0,1
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e};
uchar IRtime; //检测红外高电平持续时间(脉宽)
uchar IRcord[4]; //此数组用于储存分离出来的4个字节的数据(用户码2个字节+键值码2个字节)
uchar IRdata[33]; //此数组用于储存红外的33位数据(第一位为引导码用户码16+键值码16)
bit IRpro_ok, IRok; //第一个用于红外接收4个字节完毕。IRok用为检测脉宽完毕
void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 112; y > 0 ; y--);
}
void time0() interrupt 1 //定义定时器0
{
IRtime++; //检测脉宽,1次为278us
}
void int0() interrupt 0 //定义外部中断0
{
static uchar num; // 声明静态变量
static bit startflag; //开始储存脉宽标志位
if(startflag) //开始接收脉宽检测
{
if( (IRtime < 53) && (IRtime >= 32) )
num= 0;
IRdata[num] = IRtime;
IRtime = 0;
num++;
if(num== 33)
{
IRok = 1;
num= 0;
}
}
else
{
IRtime = 0;
startflag = 1;
}
}
void IRcordpro()
{
uchar i, j, k, cord, value;
cord
k = 1;
for(i = 0; i < 4; i++)
{
for(j = 0; j < 8; j++)
{
cord = IRdata[k];
if(cord > 5)
value = value | 0x80;
if(j < 7)
{
value = value >> 1;
}
k++;
}
IRcord = value;
value = 0;
}
IRpro_ok = 1;
}
void init_pwm()
{
CCON = 0;
CL = 0;
CH = 0;
CMOD = 0X00;
CCAPM1 =0x42;
CCAP1H=0x00;
CCAP1L=0x00;
CR=1;
}
void pwm1_set (uchar a)
{
CCAP1L= a;
CCAP1H= a;
}
/**********************************************************************
数码管显示
**********************************************************************/
void disp(void)
{
P2_0 = 1;P2_1 = 1;P2_2 = 1;P2_3 = 0;
P0=table[W%10]; //显示占空比个位
delay(1);
P2_0 = 1;P2_1 = 1;P2_2 = 1;P2_3 = 1;
P2_0 = 1;P2_1 = 0;P2_2 = 1;P2_3 = 1;
P0=table[W/100]; //显示占空比十位
delay(1);
P2_0 = 1;P2_1 = 1;P2_2 = 1;P2_3 = 1;
P2_0 = 1;P2_1 = 1;P2_2 = 0;P2_3 = 1;
P0=table[W/10%10]; //显示占空比百位
delay(1);
P2_0 = 1;P2_1 = 1;P2_2 = 1;P2_3 = 1;
P2_0 = 0;P2_1 = 1;P2_2 = 1;P2_3 = 1;
P0=table[A]; //显示方向
delay(1);
P2_0 = 1;P2_1 = 1;P2_2 = 1;P2_3 = 1;
}
void san()
{
uchar i;
while(1)
{
for(i=0;i<2;i++)
{
if(S1==0)
D_A1;
if(S2==0)
D_A2;
}
if(i==2)
{
i=0;
}
D_AOFF;
beep = 0; delay(100); beep = 1;
}
}
void qi()
{
uchar i;
while(1)
{
for(i=0;i<6;i++)
{
if(S1==0)
D_A1;
if(S2==0)
D_A2;
}
if(i==6)
{
i=0;
}
D_AOFF;
beep = 0; delay(100); beep = 1;
}
}
void main()
{
init_pwm();
EA = 1;
TMOD |= 0x02;
TH0 = 0x00;
TL0 = 0x00;
ET0 = 1;
TR0 = 1;
IT0 = 1;
EX0 = 1;
disp();
pwm1_set (1);
W = 220;
while(1)
{
if(IRok)
{
IRcordpro();
IRok = 0;
if(IRpro_ok)
{
switch(IRcord[2])
{
case 0x45: //按键1
beep = 0; delay(15); beep = 1;
san();
break;
case 0x46: //按键2
beep = 0; delay(15); beep = 1;
qi();
break;
case 0x47: //按键3
beep = 0; delay(15); beep = 1;
D_AOFF;
break;
case 0x5a: //按键 左 占空比控制 速度增加
beep = 0; delay(15); beep = 1;
W+=5;
pwm1_set(W);
if(W > 255)
{
W=255;
}
break;
case 0x08: //按键 右 占空比控制 速度减小
beep = 0; delay(15); beep = 1;
W-=5;
pwm1_set(W);
if(W < 200)
{
W=200;
}
break;
}
IRpro_ok = 0;
}
}
}
}
|
|