#include <STC12C5A60S2.H> #define uchar unsigned char #define uint unsigned int #define FOSC 12000000L //System frequenc #define BAUD 2400 //UART baudrate sbit dirx=P1^0; //方向 sbit stepx=P1^1; //脈沖 sbit diry=P1^2; //方向 sbit stepy=P1^3; //脈沖 sbit hongwai=P1^4; //紅外管 uint x=0; uint y=0; bit ruoguang=1; //弱光定位 uchar shuju[5];//頭,功能碼,顏色,附加參數,lrc uchar lrc(uchar *shu,chang) //lrc校驗 { uchar ii=0,ff=0; for(ii=0;ii<chang;ii++) { ff=ff+shu[ii]; } ff=~ff+1; return ff; } void yanshi(uint a) //短時間延時 { while(a--); } void yanshi2(uint a) //長時間延時 { uchar j=100; while(a--) { j=100; while(j--); } } void UartInit(void) //2400bps@12.000MHz { SCON = 0x50; //8-bit variable UART TMOD = 0x20; //Set Timer1 as 8-bit auto reload mode TH1 = TL1 = -(FOSC/12/32/BAUD); //Set auto-reload vaule TR1 = 1; //Timer1 start run ES = 0; //Enable UART interrupt EA = 0; //Open master interrupt switch } void go(bit l)//1為X,0為Y.每調用一次相應的軸走一個像素,對應步進電機走8個脈沖 { uchar i=0; if(l) { for(i=0;i<8;i++) {stepx=1;yanshi(1000);stepx=0;yanshi(1000);}//一個像素走8步 } else { for(i=0;i<8;i++) {stepy=1;yanshi(1000);stepy=0;yanshi(1000); } } } void zhixing() //對上位機發來的數據進行處理 { uint j=0; switch(shuju[1]) { case 1: //x軸減1 dirx=0;go(1); break; case 2: //x軸加1 dirx=1;go(1); break; case 3: //Y軸減1 diry=1;go(0); break; case 4: //Y軸加1 diry=0;go(0); break; case 5: //復位系統的x,y坐標,上位機和下位機都復位到0,0. x=0;y=0; break; case 6: //點燈亮燈 j=shuju[2]; j=j<<8; j=j|shuju[3]; hongwai=1; yanshi2(j); hongwai=0; break; case 7: //打開弱光定位,這個很實用哦 ruoguang=1; break; case 8: //關閉弱光定位,這個很實用哦 ruoguang=0; break; } shuju[0]=0; //每次執行完,清空接受數組 shuju[1]=0; shuju[2]=0; shuju[3]=0; shuju[4]=0; } void main() { uchar shu=0,jishu=0; hongwai=0; UartInit(); while(1) //大循環 { while(!RI) //在這個循環里,實現弱光定位 { //原理很簡單撒,就是在紅外管 if(ruoguang) //端口發出不同占空比的方波就行了。 { //單片機的大部分時間都是在這個循環里。 hongwai=1; yanshi(34); hongwai=0; yanshi(30); } } RI=0; shu = SBUF; //有數據過來就讀取 if(jishu==0) //判斷讀數計數器為零的時候 { //讀到的數是不是數據頭 if(shu==0xff) //只有第一個數是0xff才往下面讀哦! { shuju[0]=0xff; jishu++; } else { jishu=0; //要不是的話就重新讀。 } } else { shuju[jishu]=shu; //從第二個數開始就直接放在數組里 jishu++; //然后計數加1. if(jishu==5) //判斷是否讀完4個數 { jishu=0; //讀完后,清零 if(lrc(shuju,4)==shuju[4]) //驗證數據 { zhixing(); //執行命令 SBUF=99; //返回確認碼0x63,也就是99 while(!TI); TI=0; } } } } } |