|
單片機(jī)源程序如下:
- #include<reg52.h> //包含頭文件,一般情況不需要改動(dòng),頭文件包含特殊功能寄存器的定義
- #define uchar unsigned char
- /*********************************************************************************/
- sbit IR=P3^2; //紅外接口標(biāo)志
- uchar i;
- unsigned char irtime; //紅外用全局變量
- bit irpro_ok,irok;
- unsigned char IRcord[4];
- unsigned char irdata[33];
- /*********************************************************************************/
- sbit A1=P1^0; //定義步進(jìn)電機(jī)連接端口 P1^0-P1^3
- sbit B1=P1^1;
- sbit C1=P1^2;
- sbit D1=P1^3;
- #define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通電,其他相斷電
- #define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通電,其他相斷電
- #define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通電,其他相斷電
- #define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通電,其他相斷電
- #define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部斷電
- unsigned int o;
- unsigned char Speed;
- /*------------------------------------------------
- uS延時(shí)函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
- unsigned char 是定義無符號(hào)字符變量,其值的范圍是
- 0~255 這里使用晶振12M,精確延時(shí)請使用匯編,大致延時(shí)
- 長度如下 T=tx2+5 uS
- ------------------------------------------------*/
- void DelayUs2x(unsigned char t)
- {
- while(--t);
- }
- /*------------------------------------------------
- mS延時(shí)函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
- unsigned char 是定義無符號(hào)字符變量,其值的范圍是
- 0~255 這里使用晶振12M,精確延時(shí)請使用匯編
- ------------------------------------------------*/
- void DelayMs(unsigned char t)
- {
-
- while(t--)
- {
- //大致延時(shí)1mS
- DelayUs2x(245);
- DelayUs2x(245);
- }
- }
- /*********************************************************************************/
- void Ir_work(void);
- void Ircordpro(void);
- void tim0_isr (void) interrupt 1 using 1
- {
- irtime++; //用于計(jì)數(shù)2個(gè)下降沿之間的時(shí)間
- }
- void EX0_ISR (void) interrupt 0 //外部中斷0服務(wù)函數(shù)
- {
- static unsigned char i; //接收紅外信號(hào)處理
- static bit startflag; //是否開始處理標(biāo)志位
- if(startflag)
- {
- if(irtime<63&&irtime>=33)//引導(dǎo)碼 TC9012的頭碼,9ms+4.5ms
- i=0;
- irdata[i]=irtime;//存儲(chǔ)每個(gè)電平的持續(xù)時(shí)間,用于以后判斷是0還是1
- irtime=0;
- i++;
- if(i==33)
- {
- irok=1;
- i=0;
- }
- }
- else
- {
- irtime=0;
- startflag=1;
- }
- }
- void delay(uchar z)
- {
- uchar x,y;
- for(x=z;x>0;x--)
- for(y=120;y>0;y--);
- }
- void TIM0init(void)//定時(shí)器0初始化
- {
- TMOD=0x02;//定時(shí)器0工作方式2,TH0是重裝值,TL0是初值
- TH0=0x00; //重載值
- TL0=0x00; //初始化值
- ET0=1; //開中斷
- TR0=1;
- }
- void EX0init(void)
- {
- IT0 = 1; //指定外部中斷0下降沿觸發(fā),INT0 (P3.2)
- EX0 = 1; //使能外部中斷
- EA = 1; //開總中斷
- }
- void Ir_work(void)//紅外鍵值散轉(zhuǎn)程序
- {
- switch(IRcord[2])//判斷第三個(gè)數(shù)碼值
- {
- case 0x44:
- Speed=2; //數(shù)字越小,轉(zhuǎn)速越大,力矩越小
- o=256;//旋轉(zhuǎn)一周時(shí)間為512,這里改成紅外按住才轉(zhuǎn)動(dòng),所以是100
- Coil_OFF //步進(jìn)電機(jī)參數(shù)
- while(o--) //正向
- {
- Coil_AB1 //遇到Coil_AB1 用{A1=1;B1=1;C1=0;D1=0;}代替
- DelayMs(Speed); //改變這個(gè)參數(shù)可以調(diào)整電機(jī)轉(zhuǎn)速 ,
- Coil_BC1
- DelayMs(Speed);
- Coil_CD1
- DelayMs(Speed);
- Coil_DA1
- DelayMs(Speed);
- }
- break;//電源 顯示相應(yīng)的按鍵值
- case 0x40:
- Speed=2; //數(shù)字越小,轉(zhuǎn)速越大,力矩越小
- o=256;//旋轉(zhuǎn)一周時(shí)間為512,這里改成紅外按住才轉(zhuǎn)動(dòng),所以是100
- Coil_OFF //步進(jìn)電機(jī)參數(shù)
- while(o--)//反向
- {
- Coil_DA1 //遇到Coil_AB1 用{A1=1;B1=1;C1=0;D1=0;}代替
- DelayMs(Speed); //改變這個(gè)參數(shù)可以調(diào)整電機(jī)轉(zhuǎn)速 ,
- Coil_CD1
- DelayMs(Speed);
- Coil_BC1
- DelayMs(Speed);
- Coil_AB1
- DelayMs(Speed);
- }
- break;//電源 顯示相應(yīng)的按鍵值
- case 0x07:
- Speed=2; //數(shù)字越小,轉(zhuǎn)速越大,力矩越小
- o=20;//旋轉(zhuǎn)一周時(shí)間為512,這里改成紅外按住才轉(zhuǎn)動(dòng),所以是100
- Coil_OFF //步進(jìn)電機(jī)參數(shù)
- while(o--) //正向
- {
- Coil_AB1 //遇到Coil_AB1 用{A1=1;B1=1;C1=0;D1=0;}代替
- DelayMs(Speed); //改變這個(gè)參數(shù)可以調(diào)整電機(jī)轉(zhuǎn)速 ,
- Coil_BC1
- DelayMs(Speed);
- Coil_CD1
- DelayMs(Speed);
- Coil_DA1
- DelayMs(Speed);
- }
- break;//電源 顯示相應(yīng)的按鍵值
- case 0x15:
- Speed=2; //數(shù)字越小,轉(zhuǎn)速越大,力矩越小
- o=20;//旋轉(zhuǎn)一周時(shí)間為512,這里改成紅外按住才轉(zhuǎn)動(dòng),所以是100
- Coil_OFF //步進(jìn)電機(jī)參數(shù)
- while(o--)//反向
- {
- Coil_DA1 //遇到Coil_AB1 用{A1=1;B1=1;C1=0;D1=0;}代替
- DelayMs(Speed); //改變這個(gè)參數(shù)可以調(diào)整電機(jī)轉(zhuǎn)速 ,
- Coil_CD1
- DelayMs(Speed);
- Coil_BC1
- DelayMs(Speed);
- Coil_AB1
- DelayMs(Speed);
- }
- break;//電源 顯示相應(yīng)的按鍵值
- default:break;
- }
- irpro_ok=0;//處理完成標(biāo)志
- }
- void Ircordpro(void)//紅外碼值處理函數(shù)
- {
- unsigned char i, j, k,cord,value;
- k=1;
- for(i=0;i<4;i++) //處理4個(gè)字節(jié)
- {
- for(j=1;j<=8;j++) //處理1個(gè)字節(jié)8位
- {
- cord=irdata[k];
- if(cord>7)//大于某值為1,這個(gè)和晶振有絕對關(guān)系,這里使用12M計(jì)算,此值可以有一定誤差
- value=value|0x80;
- if(j<8)
- {
- value>>=1;
- }
- k++;
- }
- IRcord[i]=value;
- value=0;
- }
- irpro_ok=1;//處理完畢標(biāo)志位置1
- }
- void main(void)
- {
- EX0init(); //初始化外部中斷
- TIM0init();//初始化定時(shí)器
- while(1)//主循環(huán)
- {
- if(irok) //如果接收好了進(jìn)行紅外處理
- {
- Ircordpro();
- irok=0;
- }
- if(irpro_ok) //如果處理好后進(jìn)行工作處理,如按對應(yīng)的按鍵后顯示對應(yīng)的數(shù)字等
- {
- Ir_work();
- }
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
51紅外控制步進(jìn)電機(jī).zip
(29.21 KB, 下載次數(shù): 101)
2018-11-13 06:57 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|