灌水-------------------------u哦發(fā)哦 N年以前寫的步進(jìn)電機(jī)測(cè)試程序,可以供樓主可以參考參考 #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit CP=P1^4; //脈沖輸出 sbit DIR=P1^5; //方向控制 sbit enable=P1^6; //松電機(jī)或緊電機(jī) sbit key_dir=P3^3; //正反轉(zhuǎn)按鍵 sbit key_up=P3^4; //轉(zhuǎn)速增加按鍵 sbit key_down=P3^2; //轉(zhuǎn)速降低按鍵 sbit key_en=P2^7; //使能驅(qū)動(dòng)器按鍵 sbit lcd_rs=P3^7; //LCD1602 Port sbit lcden=P3^5; sbit lcd_rw=P3^6; uchar table1[]='SPEED:'; uchar table2[]='DIR:'; uchar table3[]='ENABLE '; uchar table4[]='DISABLE'; uchar table5[]='HAND '; uchar num=0,num1=0,speed=140,aa=0; uchar temp=12; void delay(uint x) { uint a,b; for(a=x;a>0;a--) for(b=10;b>0;b--); } void delay1(uint z) { uchar i,j; for(i=z;i>0;i--) for(j=110;j>0;j--); } void write_com(uchar com) //寫命令,RS=0 { P0=com; lcd_rs=0; lcden=0; delay(10); lcden=1; delay(10); lcden=0; } void write_data(uchar dat) //寫數(shù)據(jù),RS=1 { P0=dat; lcd_rs=1; lcden=0; delay(10); lcden=1; delay(10); lcden=0; } void init_LCD() { lcd_rw=0; write_com(0x38); //顯示模式設(shè)置:16×2顯示,5×7點(diǎn)陣,8位數(shù)據(jù)接口 delay(20); write_com(0x0c); //顯示模式設(shè)置 delay(20); write_com(0x06); //顯示模式設(shè)置:光標(biāo)右移,字符不移 delay(20); write_com(0x01); //清屏幕指令,將以前的顯示內(nèi)容清除 delay(20); } void keyscan() { if(key_dir==0) { delay1(5); if(key_dir==0) { while(!key_dir); delay1(10); while(!key_dir); num++; if(num==2) { num=0; } } } if(key_en==0) { delay1(5); if(key_en==0) { while(!key_en); delay1(10); while(!key_en); num1++; if(num1==3) { num1=0; } } } if((key_down==0)&&((num1==0)||(num1==1))) { delay1(5); if((key_down==0)&&((num1==0)||(num1==1))) { while(!key_down); delay1(10); while(!key_down); speed+=10; temp--; if(temp<=1) { temp=1; } if(speed>=240) { speed=240; } } } if((key_up==0)&&((num1==0)||(num1==1))) { delay1(5); if((key_up==0)&&((num1==0)||(num1==1))) { while(!key_up); delay1(10); while(!key_up); speed-=10; temp++; if(temp>=24) { temp=24; } if(speed<=20) { speed=20; } } } } void display(uchar date) { uchar shi,ge; shi=date/10; ge=date%10; write_com(0x80+0x07); write_data(0x30+shi); write_data(0x30+ge); } void main() { uchar ss; init_LCD(); DIR=1; enable=0; TMOD=0x01; //模式設(shè)置,00000001,可見采用的是定時(shí)器0,工作與模式1(M1=0,M0=1)。 TR0=1; //打開定時(shí)器 TH0=0Xff; //定時(shí)器設(shè)置,每隔100微秒發(fā)起一次中斷。 TL0=0Xda; ET0=1; //開定時(shí)器0中斷 EA=1; //開總中斷 while(1) { keyscan(); write_com(0x80); //設(shè)置所要顯示字符的位置為第一行第一列 ss=0; while(table1[ss]!='\0') //只要沒(méi)有寫到結(jié)束標(biāo)志,就繼續(xù)寫 { //這是寫字符的第一種方法,用while循環(huán)。 write_data(table1[ss]); ss++; } write_com(0x80+0x40); //設(shè)置第二行首字符顯示的位置,為第二行,第一列 ss=0; for(ss=0;ss<4;ss++) //總共要顯示13個(gè)字符,故循環(huán)十三次。 { //這是寫字符的第二種方法,用for循環(huán) write_data(table2[ss]); delay(10); } if(num==0) { DIR=0; write_com(0x80+0x40+0x05); write_data(0x30); } if(num==1) { DIR=1; write_com(0x80+0x40+0x05); write_data(0x31); } if(num1==0) { enable=0; TR0=1; write_com(0x80+0x40+0x09); ss=0; for(ss=0;ss<7;ss++) { write_data(table4[ss]); } } if(num1==1) { enable=1; write_com(0x80+0x40+0x09); ss=0; for(ss=0;ss<7;ss++) { write_data(table3[ss]); } } if(num1==2) { enable=1; TR0=0; write_com(0x80+0x40+0x09); ss=0; for(ss=0;ss<7;ss++) { write_data(table5[ss]); } if((key_up==0)&&(num1==2)) { delay1(5); if((key_up==0)&&(num1==2)) { TR0=1; DIR=1; write_com(0x80+0x40+0x05); write_data(0x31); while(!key_up); } else { TR0=0; } } if((key_down==0)&&(num1==2)) { delay1(5); if((key_down==0)&&(num1==2)) { TR0=1; DIR=0; write_com(0x80+0x40+0x05); write_data(0x30); while(!key_down); } else { TR0=0; } } } display(temp); } } void time0() interrupt 1 { TH0=0Xff; TL0=0xda; //b4 aa++; if(aa==speed) { CP=0; aa=0; } else { CP=1; } } |
|