#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; } } } } } |