/***测试直流电机的速度 读P1.0 P1.1ADpast***/ /***STC15W404AS 板L331 CODE2251 2021 1 5显示0----102*/ /***STC ADC_CONTR寄存器 按键速度改变调节电位器***/ /***bit 7 ADC POWER 启动AD=0***********/ /***bit 6 SPEED1**(1 1) 90个时钟***(1 0)180个时钟*****/ /***bit 5 SPEED0**(0 1)360个时钟***(0 0)540个时钟*****/ /***bit 4 ADC FLAG*=1 转换完成标志位后,软件清零*********/ /***bit 3 ADC START*=1开始转换,结束后转0**************/ /***bit 2 CHS2**000 001 010 011***P1.0**********/ /***bit 1 CHS1**100 101 110 111***P1.7**********/ /***bit 0 CHS0************SOP16 封装 ***/ /*P1.1 P1.0 P3.7 P3.6 P3.3 P3.2 P3.1 P3.0*******/ /*P1.2 P1.3 P1.4 P1.5 P5.4 VCC P5.5 GND********/ #include <REG52.H> #include <intrins.h> #include <string.h> #include "stdio.h" #include <stdlib.h> #define uint unsigned int #define uchar unsigned char sfr P1ASF=0x9D; //P1口第二功能控制寄存器 uint ADvalue_x,ADvalue_y; //存放AD转换返回结果 #define ADC_SPEEDLL 0x00 //540个时钟 uint aa=0; /****RUN FLAG****/ sbit INTPUT1=P5^4; sbit INTPUT2=P5^5; sbit INTPUT3=P1^4; sbit INTPUT4=P1^5; sbit OUT1=P3^2; sbit OUT2=P3^3; sbit P_WM1=P3^6; // sbit P_WM2=P3^7; // uint SPEED; //速度 uint ZERO=0; // uint Ad_data; uchar i; ///循环总变量i bit Receive_Flag; bit Read_Flag; ///定时器计数读AD标志 bit MOTORRUN; &nbp; uchar kcounter,kstatus; //按键计数标志 按键状态标志 uint a[10]; //定义数组a 存储串口数据串 /*---------------延时子程序----------------*/ void delay1 (uint ms) { uint i,j; for(i=0;i<ms;i++) for(j=0;j<2000;j++) ; } /*---------------延时子程序----------------*/ void delay (uint ms) { uint i,j; for(i=0;i<ms;i++) for(j=0;j<10;j++) ; } /*************关所有输出*******************************/ void reset_io() { P_WM1=1; P_WM2=1; INTPUT1=1; // INTPUT2=1; // } /****************按键计数器状态寄存器归零*************/ void RstKey() { kcounter=0; //按键计数器归零 kstatus=0; //状态寄存器归零 } /*****************按键低电平检测函数*****************/ void LowVoltKey(void) //按键计数器状态标志加一 { kcounter++; kstatus++; delay(5); //延时 } /*****************按键高电平检测函数*****************/ void HighVoltKey(void) //按键计数器加一 状态标志归零 { kcounter++; //按键计数器加一 kstatus=0; //按键状态标志归零 delay(5); //延时 } /*****************************************/ unsigned int ADC_P10() // { uint i; uchar status=0; //AD转换结束标志 uint AD_Dat=0; //10位AD转换值 ADC_CONTR|=0X80; //打开ADC转换电源,第一次使用时要打开内部电源 for(i=0;i<10000;i++) //等待电源稳定1ms P1ASF|=0X00; //0000 0000 ADC_CONTR=0XE0; //1110 0000 通道P1.0 for(i=0;i<1000;i++) //如果多通道测量,更换通道后延时200us ADC_CONTR|=0X08; //启动AD转换 0000 1000ADC_START while(status==0) //等待AD转换结束 { status=ADC_CONTR&0X10; //判断ADC_FLAG是否等于1, } ADC_CONTR&=0XE7; //将ADC_FLAG清零 AD_Dat=(ADC_RES<<2)|(ADC_RESL&0X03); // return AD_Dat; // } /*****************************************/ unsigned int ADC_P11() // { uint i; uchar status=0; //AD转换结束标志 uint AD_Dat=0; //10位AD转换值 ADC_CONTR|=0X80; //打开ADC转换电源,第一次使用时要打开内部电源 for(i=0;i<10000;i++) //等待电源稳定1ms P1ASF|=0X02; //0000 0010 ADC_CONTR=0XE1; //1110 0001 BIT 7电源 6 5速度90个时钟 001 P1.1 for(i=0;i<1000;i++) //如果多通道测量,更换通道后延时200us ADC_CONTR|=0X08; //启动AD转换 while(status==0) //等待AD转换结束 { status=ADC_CONTR&0X10; //判断ADC_FLAG是否等于1, } ADC_CONTR&=0XE7; //将ADC_FLAG清零 AD_Dat=(ADC_RES<<2)|(ADC_RESL&0X03); // return AD_Dat; // } /*****************/ void MOTFORWARD() { MOTORRUN=1; printf("n0.val=%d\xff\xff\xff",SPEED); //电机速度 while(MOTORRUN) //电机循环标志,串口停机中断 { if(!INTPUT3) //功能键 { for(;kcounter<5;) //按键循环5次 { if(!INTPUT3) //按键低电平 { LowVoltKey(); } else if(~!INTPUT3) //按键高电平 { HighVoltKey(); } } if(kstatus>=4) /*按键状态标志大于等于3为有效值*/ { /*循环检测 */ ADvalue_x=ADC_P10()/10; // printf("n0.val=%d\xff\xff\xff",ADvalue_x); //电机速度 SPEED=ADvalue_x; } } P_WM1=0; delay(SPEED); P_WM1=1; delay(102-SPEED); } printf("n0.val=%d\xff\xff\xff",ZERO); //电机速度 } /*****************/ void MOTBACK() { MOTORRUN=1; printf("n0.val=%d\xff\xff\xff",SPEED); //电机速度 while(MOTORRUN) //电机循环标志,串口停机中断 { if(!INTPUT4) //功能键 { for(;kcounter<5;) //按键循环5次 { if(!INTPUT4) //按键低电平 { LowVoltKey(); } else if(~!INTPUT4) //按键高电平 { HighVoltKey(); } } if(kstatus>=4) /*按键状态标志大于等于3为有效值*/ { /*循环检测 */ ADvalue_y=ADC_P11()/10; // printf("n1.val=%d\xff\xff\xff",ADvalue_y); //电机速度 SPEED=ADvalue_y; } } P_WM2=0; delay(SPEED); P_WM2=1; delay(102-SPEED); } printf("n0.val=%d\xff\xff\xff",ZERO); //电机速度 } /*------------初始化串口---------------------*/ void InitUart() { SCON=0X50; //8位数据,可变波特率 AUXR|=0x01; //串口1选择定时器2为波特率发生器 AUXR|=0X04; //定时器2时钟为Fosc,即1T T2L=0XE0; //设置定时器处置 110592》9600 T2H=0XFE; //设置定时器处置 110592》9600 AUXR|=0X10; //启动定时器2 TI=1; ES=1; // EA=1; } /**************定时中断*************************/ void timer0() interrupt 1 { TH0=0X53; TL0=0X32; aa++; if(aa>=300) { ADvalue_y=ADC_P11()/10; // ADvalue_x=ADC_P10()/10; // OUT1=~OUT1; aa=0; Read_Flag=1; //计数器计数300,读AD一次 } } /*×--------UART 中断服务程序-------------------**/ /**×**把接收到的数据存进数组a[i]**i开机初始化****/ /***×*接收到触摸屏结束码Receive_Flag标志位置1****/ /****×主程序检测到标志码=1判断指令功能***********/ void Uart() interrupt 4 using 1 { if(RI) { if(SBUF==0XFA) //触摸屏结束码 { Receive_Flag=1; //接收数据标志置一 RI=0; // i=0; //数组计数器归零 } else { a[i]=SBUF; //数组下标位置的数据等于SBUF RI=0; // i++; } } if(Receive_Flag==1) //设备停止 退出循环 { if(a[0]==0XE0) // { if(a[1]==0X04) //关电机输出 { MOTORRUN=0; //电机输出 Receive_Flag=1; //接收数据标志置一 i=0; //串口计数器归零 } } } } /*************************************************/ void main( ) /*主程序开始*/ { reset_io(); AUXR=0X80; //STC系列的1T 设置 TMOD=0X01; P_SW1=0x00; //RXD/P3.0, TXD/P3.1 TH0=0X53; TL0=0X32; ET0=1; TR0=1; Receive_Flag=0; InitUart(); //初始化串口 printf("0XFF,0XFF,0XFF"); i=0; //数据接收计数器等于0 MOTORRUN=0; Read_Flag=0; //读AD标志置零 while(1) //INTPUT1 { delay1(10); /***************开机键检测*************/ RstKey(); //按键复位 if(!INTPUT1) //功能键 { for(;kcounter<5;) //按键循环5次 { if(!INTPUT1) //按键低电平 { LowVoltKey(); } else if(~!INTPUT1) //按键高电平 { HighVoltKey(); } } if(kstatus>=4) /*按键状态标志大于等于3为有效值*/ { /*循环检测 */ TR0=0; SPEED=ADvalue_x; MOTFORWARD(); //前进 } } /**************************************/ RstKey(); //按键复位 if(!INTPUT2) //功能键 { for(;kcounter<5;) //按键循环5次 { if(!INTPUT2) //按键低电平 { LowVoltKey(); } else if(~!INTPUT2) //按键高电平 { HighVoltKey(); } } if(kstatus>=4) /*按键状态标志大于等于3为有效值*/ { /*循环检测 */ TR0=0; SPEED=ADvalue_y; MOTBACK(); //后退 } } /**************************************/ if(Read_Flag==1) //定时器AD值刷新标志 { ADvalue_x=ADC_P10()/10; // printf("n0.val=%d\xff\xff\xff",ADvalue_y); //电机速度 ADvalue_y=ADC_P11()/10; // printf("n1.val=%d\xff\xff\xff",ADvalue_x); //电机速度 Read_Flag=0; //读AD标志置零 } } } //L331 CODE 2251 2021 2 7