/***************************************************************************** /***************************************************************************** /***************************************************************************** /***************************************************************************** /***************************************************************************** /***************************************************************************** /***************************************************************************** 描述:本系统库初始化ARM7芯片,步骤如下 1:根据硬件连接,设定芯片各个管脚的功能(设定引脚连接模块) 2:设定GPIO的方向 3:初始化系统时钟,PWM(电机),模数转换,LCD显示等子模块 4:等待用户按动运行按钮,并跳转到用户主函数 *****************************************************************************/ #include "LPC2103.h" //M32头文件,使用核心为飞利浦ARM7的LPC2103 #include #include #include #include "MATH.H" //#include "MIIIRobot.h" //此函数即为用户主函数,在用户编辑状态中,此函数被显示为void main() extern void MainInstead(); /* //串口 p0.0 txd p0,1 rxd //输入输出 p0.2-p0.6, p0.9-p0.31 gpio //电机驱动 p0.7 pwm0 p0.8 pwm1 //模数转换 p0.10-p0.12,p0.22-p0.26(AD) */ //根据以上IO功能,定义管脚连接模块 #define set_PINSEL0 0x03F28005 #define set_PINSEL1 0x003FF000 /* p0.4,5,6,9,13,15,16,17,18,19,20,21,28,29,30,31作为输出 p0.28(os_c),p0.29(do_c) 作为输出 P0.9(LCD_RS),P0.30(LCD_E),P0.31(LCD_RW)作为输出 P0.6(DIR0),P0.5(DIR1)作为输出 */ //根据以上定义的IO方向,设定寄存器 #define set_IO0DIR 0xF7FFBE60//0xF833A270 #define set_IO0DIRINPUT 0xF7C01E60 //D0-D7作为输入 /*数据输出端口地址,详细请参考电路图*/ #define D0 0x00002000//P0.13 #define D1 0x00008000//P0.15 #define D2 0x00010000//P0.16 #define D3 0x00020000//P0.17 #define D4 0x00040000//P0.18 #define D5 0x00080000//P0.19 #define D6 0x00100000//P0.20 #define D7 0x00200000//P0.21 #define OS_C 0x10000000//P0.28 #define DO_C 0x20000000//P0.29 /*LCD*/ #define LCD_RS 0x00000200//P0.9 #define LCD_RW 0x80000000//P0.31 #define LCD_EN 0x40000000//P0.30 /*电机方向控制*/ #define DIR0 0x00000040//P0.6 #define DIR1 0x00000020//P0.5 /*运行按钮*/ #define RUN_BUTTON 0x00004000//P0.14 /*光电编码器*/ #define GD1 0x00000010 //p0.4(GD1) #define GD0 0x08000000 //p0.27(GD0) * /*bus总线上的数字输入端口*/ #define PA1 0x00000008 //p0.3(PA2/SCL0) * #define PA2 0x00000004 //p0.2(PA1/SDA0) * int ScreenNeedClear = 0;//指示屏幕是否需要刷新,当设个变量为0,屏幕不会刷新,为1屏幕每次将刷新 /*功能:空函数,不做任何事情 */ /*定义:void NOP() */ /*参数:NULL */ /*返回值:NULL */ void NOP(){} /*功能:延时函数,用在屏幕显示中 */ /*定义:void delay_ms(int ms) */ /*参数:int ms */ /*返回值:NULL */ void delay_ms(int ms) { int i=0; int nt=0; nt = ms*50; for(i=0;i>4)%2) IOSET =D4; else IOCLR=D4; if((data>>5)%2) IOSET =D5; else IOCLR=D5; if((data>>6)%2) IOSET =D6; else IOCLR=D6; if((data>>7)%2) IOSET =D7; else IOCLR=D7; IOSET = LCD_EN; //EN端产生一个由低电平变高电平,写LCD delay_ms(5); IOCLR= LCD_EN; //EN端产生一个由高电平变低电平,写LCD delay_ms(1); } /************************************************************ 屏幕显示 //功能:采用1602液晶采用4线接法,此函数向LCD模块写入一个8位的数据 //定义:void LCD_write_char(unsigned command,unsigned data) //参数:unsigned char data //返回值:NULL ************************************************************/ void LCD_write_char(unsigned command,unsigned data) { if (command == 0) IOCLR = LCD_RS; //RS=0 写地址 else IOSET = LCD_RS; //RS=1 写数据 LCD_write_DATA_PORT(data);//写高4位 LCD_write_DATA_PORT(data<<4);//写低4位 //delay_ms(25); } /************************************************************ 屏幕显示 //功能:清屏函数 //定义:void LCD_clear(void) //参数:NULL //返回值:NULL ************************************************************/ void LCD_clear(void) { LCD_write_char(0,0x01);//显示清屏 delay_ms(20); } /************************************************************ 屏幕显示 //功能:初始化液晶函数 //定义:void InitLCD(void) //参数:NULL //返回值:NULL ************************************************************/ void InitLCD(void) { NOP(); IOSET=DO_C;/*打开数据输出通道74hc573*/ IOCLR=LCD_EN;//EN设为低电平 IOCLR=LCD_RS;//RS设为低电平 IOCLR=D4;//数据口置低电平 IOCLR=D5;//数据口置低电平 IOCLR=D6;//数据口置低电平 IOCLR=D7;//数据口置低电平 delay_ms(100); LCD_write_char(0,0x33); //4bit test delay_ms(25); LCD_write_char(0,0x32); delay_ms(15); LCD_write_char(0,0x28); delay_ms(15); LCD_write_char(0,0x0C); //显示开 delay_ms(15); LCD_write_char(0,0x01); //显示清屏 delay_ms(15); LCD_write_char(0,0x06); //显示光标移动设置 delay_ms(20); LCD_clear(); } /************************************************************ 屏幕显示 //功能:往屏幕上Location的位置写入字符t(字符的ascii码为t) //定义:void PutChar(char t,int Location) //参数:char t,int Location //返回值:NULL ************************************************************/ void PutChar(char t,int Location) { int addr = 0; if(Location <= 15) { addr =128+Location; } else { addr = 176 + Location; } LCD_write_char(0,addr); delay_ms(25); IOCLR=LCD_RW; IOCLR=LCD_EN; LCD_write_char(1,t); delay_ms(25); } /************************************************************ 屏幕显示 //功能:往屏幕上写入字符串s //定义:void PutString(unsigned char *s) //参数:unsigned char *s字符串的指针 //返回值:NULL ************************************************************/ void PutString(unsigned char *s) { int i=0; int index=0; //LCD_clear(); for( i=0 ;i<=48;i++) { if(s[i] =='\n') { if (i<=15){i =15;} else{break;} index=index+1; } else if (s[i] == '\0') { break; } else { PutChar(s[index],i); index=index+1; } } } //====================================================== // 整型转换为字符串 //====================================================== void itoa(int data, char *buf, char radix)__arm { unsigned char static i, len; int DBUF, mod; DBUF=data; //转成二进制 if(radix==2) { for(len=0; ;len++) { DBUF=DBUF/2; if(DBUF==0) break; } DBUF=data; for(i=0; i<=len; i++) { *(buf+len-i)=DBUF%2+'0'; DBUF=DBUF/2; } } //转成10进制 if(radix==10) { for(len=0; ;len++) { DBUF=DBUF/10; if(DBUF==0) break; } DBUF=data; for(i=0; i<=len; i++) { *(buf+len-i)=DBUF%10+'0'; DBUF=DBUF/10; } } //转成16进制 if(radix==16) { for(len=0; ;len++) { DBUF=DBUF/10; if(DBUF==0) break; } DBUF=data; for(i=0; i<=len; i++) { mod=DBUF%16; if(mod<10) *(buf+len-i)=mod+'0'; else *(buf+len-i)=mod-10+'A'; DBUF=DBUF/16; } } } /************************************************************ 屏幕显示 //功能:printf函数的一个实现 //定义:int Printf(const char *fmt, ...)__arm //参数:const char *fmt, ... //返回值:NULL ************************************************************/ int Printf(const char *fmt, ...)__arm { const char *s; char *Buf; int d; float f; char tbuf[16], i=0; char ShowBuf[40]={' '}; va_list ap; va_start(ap, fmt); Buf=ShowBuf; while (*fmt) { for(i=0; i 100){speed = 100;} if (speed < -100){speed =-100;} if(channel == 1) { //设置方向 if(speed>0){IOSET = DIR0;} else if(speed<0){IOCLR = DIR0;} //设置速度 T2MR0 = T2MR2*abs(speed)/100+1; } else if(channel == 0) { //设置方向 if(speed>0){IOSET = DIR1;} else if(speed<0){IOCLR = DIR1;} //设置速度 T2MR1 = T2MR2*abs(speed)/100+1; } } /************************************************************** 电机 ***************************************************************/ /************************************************************** 模拟口 ***************************************************************/ /************************************************************ //功能:初始化AD转换 //定义:void InitAD() //参数:NULL //返回值:NULL ************************************************************/ void InitAD() { NOP(); /* 进行ADC模块设置 */ ADCR = (1 << 1) | // SEL=2,选择通道AD0.1 (99<<8 ) | // CLKDIV=Fpclk/(99+1),转换时钟为110592Hz (1 << 16) | // BURST=1,0:软件控制转换操作,1:自动转换 (0 << 17) | // CLKS=0, 使用11clock转换 (1 << 21) | // PDN=1,正常工作模式 (0 << 22) | // TEST1:0=00,正常工作模式 (0 << 24) | // START=0,0:BURST控制启动,1:直接启动ADC转换 (0 << 27); // 直接启动ADC转换时,此位无效 //--------------硬件扫描模式---------------- ADCR = ADCR & 0xFFFFFF00; ADCR = ADCR | 0xFF; //通道AD0.0-AD0.7同时选中 } /************************************************************ //功能:读取模拟转换结果 //定义:int AI(int Channel) //参数:int Channel //读取模拟口通道的输入。iCh为通道号0-7。返回0-1023 //返回值:返回0-1023 ************************************************************/ int AI(int Channel) { int Result=0; switch(Channel) { case 0: Result = (ADDR7 >> 6) & 0x3ff; break; case 1: Result = (ADDR6 >> 6) & 0x3ff; break; case 2: Result = (ADDR5 >> 6) & 0x3ff; break; case 3: Result = (ADDR4 >> 6) & 0x3ff; break; case 4: Result = (ADDR3 >> 6) & 0x3ff; break; case 5: Result = (ADDR2 >> 6) & 0x3ff; break; case 6: Result = (ADDR1 >> 6) & 0x3ff; break; case 7: Result = (ADDR0 >> 6) & 0x3ff; break; } return Result; } /************************************************************** 模拟口 ***************************************************************/ /*************************************************************** 数字输出 ****************************************************************/ /************************************************************ //功能:设定数字输出端口状态 //定义:void SetDO(int Channel,int State) //参数:int Channel,int State //设置DO数字输出,DO为通道号(0-3),state为状态,1为高电平,0为低电平 //返回值:NULL ************************************************************/ void SetDO(int Channel,int State) { IOSET=DO_C;//打开573芯片 switch(Channel) { case 0: if(State == 0){IOCLR=D3;/*DO0通道*/} else{IOSET=D3;/*DO0通道*/} break; case 1: if(State == 0){IOCLR=D2;/*DO1通道*/} else{IOSET=D2;/*DO1通道*/} break; case 2: if(State == 0){IOCLR=D1;/*DO2通道*/} else{IOSET=D1;/*DO2通道*/} break; case 3: if(State == 0){IOCLR=D0;/*DO3通道*/} else{IOSET=D0;/*DO3通道*/} break; } } /*************************************************************** 数字输出 ****************************************************************/ /*************************************************************** 按键 ****************************************************************/ /************************************************************ //功能:等到运行按钮的状态 //定义:int Get_Button() //参数:NULL //得到运行按钮的状态,返回0或1 //返回值:NULL ************************************************************/ int Get_Button() { if((IOPIN & RUN_BUTTON) == RUN_BUTTON) { delay_ms(10);//消除抖动 if((IOPIN & RUN_BUTTON) == RUN_BUTTON) { return 0; } } return 1; } /*************************************************************** 按键 ****************************************************************/ /***************************************************************** 红外线单发单收 *****************************************************************/ /************************************************************ //功能:启动红外测障,并且返回检测状态,此函数可使用任意可用的数字输出或者模拟输入口来检测 //定义:int ir_detect(int DO_out,int AI_in) //参数:int DO_out,int AI_in //DO_out为红外发射头接上的数字输出口,AI_in为红外接收头接上的模拟输入通道号 //返回值:0或1 ************************************************************/ int ir_detect(int DO_out,int AI_in) { int Time_ON = 1; int Time_OFF= 210; int i=0; int time = 0; int result = 0; int HAVE = 0; HAVE = 0; for(time=0;time<70;time++) //for(time=80;time>0;time++) { SetDO(DO_out,1); for(i=0;itime){break;} } } /****************************************************************** 系统时钟 ******************************************************************/ /******************************************************************** 喇叭 ********************************************************************/ //功能:喇叭以freq频率鸣叫dur时间 //定义:void tone(float freq, float dur) //参数:float freq, float dur //返回值:NULL void tone(float freq, float dur) { float t=seconds(); int Time_ON=(int)(17652400/(4*freq*1.05)); int i=0; while((seconds()-t)4.0) { t=seconds(); } else if((seconds()-t)>2.0) { Printf("Ability Storm 32Run+RST:Download"); } else if((seconds()-t)>0.0) { Printf("Ability Storm 32Run:Run Program "); } } ScreenNeedClear =1; MainInstead(); while(1){} }