您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 51单片机步进电机正反转调速1602显示
51单片机步进电机正反转调速1602显示-C51源代码#includereg51.h//51芯片管脚定义头文件#includeintrins.h//内部包含延时函数_nop_();#defineucharunsignedchar#defineuintunsignedint#definedelayNOP();{_nop_();_nop_();_nop_();_nop_();};ucharcodeFFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};ucharcodeREV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};sbitK1=P3^2;//运行与停止sbitK2=P3^3;//设定圈数sbitK3=P3^4;//方向转换sbitK4=P3^5;//速率调整sbitBEEP=P3^6;//蜂鸣器sbitLCD_RS=P2^0;sbitLCD_RW=P2^1;sbitLCD_EN=P2^2;biton_off=0;//运行与停止标志bitdirection=1;//方向标志bitrate_dr=1;//速率标志bitsnum_dr=1;//圈数标志ucharcodecdis1[]={STEPPINGMOTOR};ucharcodecdis2[]={CONTROLPROCESS};ucharcodecdis3[]={STOP};ucharcodecdis4[]={NUM:RATE:};ucharcodecdis5[]={RUNNING};ucharm,v=0,q=0;uintnumber=0,number1=0;ucharsnum=10,snum1=10;//预设定圈数ucharrate=2;//预设定速率uchardata_temp,data_temP1,data_temp2;/********************************************************//*/*延时t毫秒/*11.0592MHz时钟,延时约1ms/*/********************************************************/voiddelay(uintt){uchark;while(t--){for(k=0;k125;k++){}}}/********************************************************/voiddelayB(ucharx)//x*0.14MS{uchari;while(x--){for(i=0;i13;i++){}}}/********************************************************/voidbeep(){ucharj;for(j=0;j100;j++){delayB(4);BEEP=!BEEP;//BEEP取反}BEEP=1;//关闭蜂鸣器delay(170);}/********************************************************//*/*检查LCD忙状态/*lcd_busy为1时,忙,等待。为0时,闲,可写指令与数据。/*/********************************************************/bitlcd_busy(){bitresult;LCD_RS=0;LCD_RW=1;LCD_EN=1;delayNOP();result=(bit)(P0&0x80);LCD_EN=0;return(result);}/********************************************************//*/*写指令数据到LCD/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。/*/********************************************************/voidlcd_wcmd(ucharcmd){while(lcd_busy());LCD_RS=0;LCD_RW=0;LCD_EN=0;_nop_();_nop_();P0=cmd;delayNOP();LCD_EN=1;delayNOP();LCD_EN=0;}/********************************************************//*/*写显示数据到LCD/*RS=H,RW=L,E=高脉冲,D0-D7=数据。/*/********************************************************/voidlcd_wdat(uchardat){while(lcd_busy());LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=dat;delayNOP();LCD_EN=1;delayNOP();LCD_EN=0;}/********************************************************//*/*LCD初始化设定/*/********************************************************/voidlcd_init(){delay(30);lcd_wcmd(0x38);//16*2显示,5*7点阵,8位数据delay(5);lcd_wcmd(0x38);delay(5);lcd_wcmd(0x38);delay(5);lcd_wcmd(0x0c);//显示开,关光标delay(5);lcd_wcmd(0x06);//移动光标delay(5);lcd_wcmd(0x01);//清除LCD的显示内容delay(5);}/********************************************************//*/*设定显示位置/*/********************************************************/voidlcd_pos(ucharpos){lcd_wcmd(pos|0x80);//数据指针=80+地址变量}/********************************************************//*/*LCD1602初始显示子程序/*/********************************************************/voidLCD_init_DIS(){delay(10);//延时lcd_init();//初始化LCDlcd_pos(0);//设置显示位置为第一行的第1个字符m=0;while(cdis1[m]!='\0'){//显示字符lcd_wdat(cdis1[m]);m++;}lcd_pos(0x40);//设置显示位置为第二行第1个字符m=0;while(cdis2[m]!='\0'){lcd_wdat(cdis2[m]);//显示字符m++;}delay(3000);//延时lcd_pos(0);//设置显示位置为第一行的第1个字符m=0;while(cdis3[m]!='\0'){//显示字符lcd_wdat(cdis3[m]);m++;}lcd_pos(0x40);//设置显示位置为第二行第1个字符m=0;while(cdis4[m]!='\0'){lcd_wdat(cdis4[m]);//显示字符m++;}for(m=0;m2;m++){lcd_pos(0x0c+m);//显示方向符号lcd_wdat(0x3e);}}/********************************************************//*/*数据转换子程序/*/********************************************************/voiddata_conv(){data_temP1=data_temp/10;//高位if(data_temP1==0){data_temP1=0x20;}//高位为0不显示else{data_temP1=data_temP1+0x30;}data_temp2=data_temp%10;//低位data_temp2=data_temp2+0x30;}/********************************************************//*/*数据显示子程序/*/********************************************************/voiddata_dis(){data_temp=snum;//显示圈数data_conv();lcd_pos(0x44);lcd_wdat(data_temP1);lcd_pos(0x45);lcd_wdat(data_temp2);data_temp=rate;//显示速率data_conv();lcd_pos(0x4d);lcd_wdat(data_temP1);lcd_pos(0x4e);lcd_wdat(data_temp2);}/********************************************************/*/*显示运行方向符号/*/********************************************************/voidmotor_DR(){if(direction==1)//正转方向标志{for(m=0;m2;m++){lcd_pos(0x0c+m);//显示方向符号lcd_wdat(0x3e);}}else{for(m=0;m2;m++)//反转方向标志{lcd_pos(0x0c+m);//显示方向符号lcd_wdat(0x3c);}}}/********************************************************/*/*显示运行状态/*/********************************************************/voidmotor_RUN(){if(on_off==1){TR0=1;lcd_pos(0);//设置显示位置为第一行的第1个字符m=0;while(cdis5[m]!='\0'){lcd_wdat(cdis5[m]);//RUNNINGm++;}motor_DR();//}else{TR0=0;P1=0x0f;lcd_pos(0);//设置显示位置为第一行的第1个字符m=0;while(cdis3[m]!='\0'){lcd_wdat(cdis3[m]);//STOPm++;}motor_DR();//snum=snum1;//number1=0;//清圈数计数器}}/**********************************************************主程序**********************************************************/main(){LCD_init_DIS();TMOD=0x01;//T0定时方式1TL0=0x33;TH0=0xf5;EA=1;ET0=1;P1=0x0f;while(1){if(K1==0){beep();while(K1==0);//等待键释放on_off=~on_off;motor_RUN();}//K1end/********************************************************/if(K2==0){beep();if(snum_dr==1){snum+
本文标题:51单片机步进电机正反转调速1602显示
链接地址:https://www.777doc.com/doc-5236592 .html