📄 co_遥控电机r.c
字号:
#include <AT89X52.h>
#define uint unsigned int
static unsigned char data IRCode[3],IRCON,IRCON2;
bit DT=0;
bit flag,flag_p; /////////// 0 对应串口 1 遥控
uint num_1=0,k=0,i=0,j,num=0,voicer=1,w,sign,jisuan=0,numi,wp,wn,pp, count = 0;
step_index,speedlevel,
spcount,
stop_flag =0;
uint step_num;
uint led[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uint vote[8]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09};
sbit led0=P2^0;
sbit led1=P2^1;
sbit led2=P2^2;
sbit led3=P2^3;
void ledwork(void);
void gorun();
bit turn;
float sum,tempn,nump,ppnum;
void voice()
{
P3_7=0;
for(j=0;j<2000;j++);
P3_7=1;
}
void main(void)
{ step_num=3600; /*1200步*/
count = 0;
step_index = 0;
spcount = 0;
stop_flag = 0;
k=10;
P1_0 = 0;
P1_1 = 0;
P1_2 = 0;
P1_3 =0;
P3_7=1;
TMOD= 0x11; //////T1 , T0 16位模式
IT0=0;
EA=1;
EX0=1;
DT=0; ///////标志
flag=0; /////////////////串口控制
PT0=1;
ET1=1;
TH1=0xff; /*设置初始值,每隔4ms一次中断*/
TL1=0x05;
TR1=1;
k=10;
turn = 1;
P3_7=1;
speedlevel =1;
do
{
if(DT)
{
for(j=0; j<8000; j++); //这里起到按键值正确后会有一个延时,防止重复按键
DT = 0;
}
EX0 = 1;
if(voicer==1)
{voice();
if(k==13)turn=!turn;
step_num=3600;
voicer=0;}
}
while(1);
}
//定时器0定时中断,遥控用
void Timer0(void) interrupt 1 using 1
{
if(flag) //////////遥控控制
{
TH0=0xFD;
TL0=0x1E; //设定时值为800us
if(IRCON<3)
{
if(IRCON2<8) //每中断一次读一次遥控接收头的状态,每二次为遥控编码中的一个位
{
IRCON2++;
IRCode[IRCON]=IRCode[IRCON]<<1; //每读一次放入变量中的二进制的一个位,每次左移一位
IRCode[IRCON]=IRCode[IRCON]|P3_2; //每八次填满一个字节,一个字节存放遥控编码4个位
}
else
{
IRCON++; //填满一个字节,指向下一个变量
IRCON2=0; //计数清零
}
}
else
{
flag=0; ////////////串口控制
/////////////////////////暂时不允许int0中断
if((IRCode[1]!=0xFF)&&(IRCode[2]!=0xFF))
{
if(IRCode[1]==0x55)
{
switch(IRCode[2])
{
case 0xAB: //1-8键控制
k=1;
break;
case 0xAC:
k=2;
break;
case 0xAD:
k=3;
break;
case 0xB2:
k=4;
break;
case 0xB3:
k=5;
break;
case 0xB4:
k=6;
break;
case 0xB5:
k=7;
break;
case 0xCA:
k=8;
break;
case 0xCB:
k=9;
break;
case 0xAA:
k=0; ////////////// 改变参数显示的类型
break;
case 0x2A:
k=11; //////music+++++++++++++++++ // 人工的触发
break;
case 0x2B:
k=12; //////music------------------
break;
case 0x52:
k=13; //////对比+++++++
break;
case 0x53:
k=14; //////对比--------
break;
case 0x32:
k=15; //////色彩+++++++
break;
case 0x33:
k=16; //////色彩-------
break;
case 0x2C:
k=17; //////亮度+++++
break;
case 0x2D:
k=18; //////亮度-------
break;
case 0xD2: //按关闭电源键
P0 = 0xFF;
k=10;
break;
}
voicer=1;
}
}
}
}
}
void Int0(void) interrupt 0 using 0
{
EX0=0; //外部中断0关闭
DT=1;
flag=1; ////////遥控控制
TH0=0xFD;
TL0=0x1E; //设定时值为800us
for(IRCON=0; IRCON<3; IRCON++)
IRCode[IRCON] = 0;
IRCON = 0;
IRCON2 = 0; //计数清零
ET0=1; /////// T0中断
TR0 = 1; //再启动///////////记数
}
void ledwork(void) /*数码管工作函数*/
{
num=k;
if(num>=0&&num<10)
w=1;
else if(num>9&&num<100)
{w=2;i=i%2;}
else if(num>100&&num<1000)
{w=3;i=i%3;}
else if(num>=1000)
{w=4;i=i%4;}
if(i==0) {P0=led[num%10];led1=1;led2=1;led3=1;led0=0;}
else if(i==1&&w>1) {P0=led[num/10%10]; led0=1;led2=1;led3=1;led1=0;}
else if(i==2&&w>2) {P0=led[num/100%10]; led1=1;led2=1;led3=1;led2=0;}
else if(i==3&&w>3) {P0=led[num/1000%10];led0=1;led1=1;led2=1;led3=0;}
}
//定时器1定时中断,驱动电机用
void timer1(void) interrupt 3
{
TH1=0xFF;
TL1=0x55; //设定时每隔0.5ms中断一次
count++;
spcount--;
if(spcount<=0&&k<13)
{spcount =k*speedlevel;
gorun(); }
i++;
i=i%w;
ledwork();
}
void gorun()
{
if(stop_flag==1)
{
P1=0x00;
return;
}
P1=vote[step_index]; //给脉冲以驱动电机
if (turn==0)
{
step_index++;
if (step_index>7)
step_index=0;
}
else
{
step_index--;
if (step_index<0)
step_index=7;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -