?? 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 + -