出自於 http://www.wifi-robots.com/thread-367-1-1.html 原作者liuviking WIFI Robot 站長
完整Sources Code 下載
目標移植WIFI Robto 販售單片機程式改為Arduino +MSP 430 通用code ,讓下位單晶片可用Arduino 或MSP430 替代.
這樣客戶端WIFI 遙控程式則可套用現成
Windows 板 http://www.wifi-robots.com/thread-1790-1-1.html
Android 板 http://www.wifi-robots.com/thread-1180-1-1.html
API http://www.wifi-robots.com/thread-938-1-1.html
完整VB6 Code http://www.wifi-robots.com/thread-1816-1-1.html
進度
move Forward 'A1');
turn Left(){A2
moveBack(){ A3
turn right a4
/* 版权声明: WIFI机器人网·机器人创意工作室版权所有 www.wifi-robots.com 您可以任意修改本程序,并应用于自行研发的智能小车机器人及其他电子产品上,但是禁止用于向他人牟取暴利。 By WIFI机器人网·机器人创意工作室 */ #ifndef _STC_NEW_8051_H_ #define _STC_NEW_8051_H_ //-------------------------------------------------------------------------------- //新一代 1T 8051系列 单片机内核特殊功能寄存器 C51 Core SFRs // 7 6 5 4 3 2 1 0 Reset Value sfr ACC = 0xE0; //Accumulator 0000,0000 sfr B = 0xF0; //B Register 0000,0000 sfr PSW = 0xD0; //Program Status Word CY AC F0 RS1 RS0 OV F1 P 0000,0000 //----------------------------------- sbit CY = PSW^7; sbit AC = PSW^6; sbit F0 = PSW^5; sbit RS1 = PSW^4; sbit RS0 = PSW^3; sbit OV = PSW^2; sbit P = PSW^0; //----------------------------------- sfr SP = 0x81; //Stack Pointer 0000,0111 sfr DPL = 0x82; //Data Pointer Low Byte 0000,0000 sfr DPH = 0x83; //Data Pointer High Byte 0000,0000 //-------------------------------------------------------------------------------- //新一代 1T 8051系列 单片机系统管理特殊功能寄存器 // 7 6 5 4 3 2 1 0 Reset Value sfr PCON = 0x87; //Power Control SMOD SMOD0 LVDF POF GF1 GF0 PD IDL 0001,0000 // 7 6 5 4 3 2 1 0 Reset Value sfr AUXR = 0x8E; //Auxiliary Register T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS 0000,0000 //----------------------------------- sfr AUXR1 = 0xA2; //Auxiliary Register 1 - PCA_P4 SPI_P4 S2_P4 GF2 ADRJ - DPS 0000,0000 /* PCA_P4: 0, 缺省PCA 在P1 口 1,PCA/PWM 从P1 口切换到P4 口: ECI 从P1.2 切换到P4.1 口, PCA0/PWM0 从P1.3 切换到P4.2 口 PCA1/PWM1 从P1.4 切换到P4.3 口 SPI_P4: 0, 缺省SPI 在P1 口 1,SPI 从P1 口切换到P4 口: SPICLK 从P1.7 切换到P4.3 口 MISO 从P1.6 切换到P4.2 口 MOSI 从P1.5 切换到P4.1 口 SS 从P1.4 切换到P4.0 口 S2_P4: 0, 缺省UART2 在P1 口 1,UART2 从P1 口切换到P4 口: TxD2 从P1.3 切换到P4.3 口 RxD2 从P1.2 切换到P4.2 口 GF2: 通用标志位 ADRJ: 0, 10 位A/D 转换结果的高8 位放在ADC_RES 寄存器, 低2 位放在ADC_RESL 寄存器 1,10 位A/D 转换结果的最高2 位放在ADC_RES 寄存器的低2 位, 低8 位放在ADC_RESL 寄存器 DPS: 0, 使用缺省数据指针DPTR0 1,使用另一个数据指针DPTR1 */ //----------------------------------- sfr WAKE_CLKO = 0x8F; //附加的 SFR WAK1_CLKO /* 7 6 5 4 3 2 1 0 Reset Value PCAWAKEUP RXD_PIN_IE T1_PIN_IE T0_PIN_IE LVD_WAKE _ T1CLKO T0CLKO 0000,0000B b7 - PCAWAKEUP : PCA 中断可唤醒 powerdown。 b6 - RXD_PIN_IE : 当 P3.0(RXD) 下降沿置位 RI 时可唤醒 powerdown(必须打开相应中断)。 b5 - T1_PIN_IE : 当 T1 脚下降沿置位 T1 中断标志时可唤醒 powerdown(必须打开相应中断)。 b4 - T0_PIN_IE : 当 T0 脚下降沿置位 T0 中断标志时可唤醒 powerdown(必须打开相应中断)。 b3 - LVD_WAKE : 当 CMPIN 脚低电平置位 LVD 中断标志时可唤醒 powerdown(必须打开相应中断)。 b2 - b1 - T1CLKO : 允许 T1CKO(P3.5) 脚输出 T1 溢出脉冲,Fck1 = 1/2 T1 溢出率 b0 - T0CLKO : 允许 T0CKO(P3.4) 脚输出 T0 溢出脉冲,Fck0 = 1/2 T1 溢出率 */ //----------------------------------- sfr CLK_DIV = 0x97; //Clock Divder - - - - - CLKS2 CLKS1 CLKS0 xxxx,x000 //----------------------------------- sfr BUS_SPEED = 0xA1; //Stretch register - - ALES1 ALES0 - RWS2 RWS1 RWS0 xx10,x011 /* ALES1 and ALES0: 00 : The P0 address setup time and hold time to ALE negative edge is one clock cycle 01 : The P0 address setup time and hold time to ALE negative edge is two clock cycles. 10 : The P0 address setup time and hold time to ALE negative edge is three clock cycles. (default) 11 : The P0 address setup time and hold time to ALE negative edge is four clock cycles. RWS2,RWS1,RWS0: 000 : The MOVX read/write pulse is 1 clock cycle. 001 : The MOVX read/write pulse is 2 clock cycles. 010 : The MOVX read/write pulse is 3 clock cycles. 011 : The MOVX read/write pulse is 4 clock cycles. (default) 100 : The MOVX read/write pulse is 5 clock cycles. 101 : The MOVX read/write pulse is 6 clock cycles. 110 : The MOVX read/write pulse is 7 clock cycles. 111 : The MOVX read/write pulse is 8 clock cycles. */ //-------------------------------------------------------------------------------- //新一代 1T 8051系列 单片机中断特殊功能寄存器 //有的中断控制、中断标志位散布在其它特殊功能寄存器中,这些位在位地址中定义 //其中有的位无位寻址能力,请参阅 新一代 1T 8051系列 单片机中文指南 // 7 6 5 4 3 2 1 0 Reset Value sfr IE = 0xA8; //中断控制寄存器 EA ELVD EADC ES ET1 EX1 ET0 EX0 0x00,0000 //----------------------- sbit EA = IE^7; sbit ELVD = IE^6; //低压监测中断允许位 sbit EADC = IE^5; //ADC 中断允许位 sbit ES = IE^4; sbit ET1 = IE^3; sbit EX1 = IE^2; sbit ET0 = IE^1; sbit EX0 = IE^0; //----------------------- sfr IE2 = 0xAF; //Auxiliary Interrupt - - - - - - ESPI ES2 0000,0000B //----------------------- // 7 6 5 4 3 2 1 0 Reset Value sfr IP = 0xB8; //中断优先级低位 PPCA PLVD PADC PS PT1 PX1 PT0 PX0 0000,0000 //-------- sbit PPCA = IP^7; //PCA 模块中断优先级 sbit PLVD = IP^6; //低压监测中断优先级 sbit PADC = IP^5; //ADC 中断优先级 sbit PS = IP^4; sbit PT1 = IP^3; sbit PX1 = IP^2; sbit PT0 = IP^1; sbit PX0 = IP^0; //----------------------- // 7 6 5 4 3 2 1 0 Reset Value sfr IPH = 0xB7; //中断优先级高位 PPCAH PLVDH PADCH PSH PT1H PX1H PT0H PX0H 0000,0000 sfr IP2 = 0xB5; // - - - - - - PSPI PS2 xxxx,xx00 sfr IPH2 = 0xB6; // - - - - - - PSPIH PS2H xxxx,xx00 //----------------------- //新一代 1T 8051系列 单片机I/O 口特殊功能寄存器 // 7 6 5 4 3 2 1 0 Reset Value sfr P0 = 0x80; //8 bitPort0 P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0 1111,1111 sfr P0M0 = 0x94; // 0000,0000 sfr P0M1 = 0x93; // 0000,0000 sfr P1 = 0x90; //8 bitPort1 P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0 1111,1111 sfr P1M0 = 0x92; // 0000,0000 sfr P1M1 = 0x91; // 0000,0000 sfr P1ASF = 0x9D; //P1 analog special function sfr P2 = 0xA0; //8 bitPort2 P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.0 1111,1111 sfr P2M0 = 0x96; // 0000,0000 sfr P2M1 = 0x95; // 0000,0000 sfr P3 = 0xB0; //8 bitPort3 P3.7 P3.6 P3.5 P3.4 P3.3 P3.2 P3.1 P3.0 1111,1111 sfr P3M0 = 0xB2; // 0000,0000 sfr P3M1 = 0xB1; // 0000,0000 sfr P4 = 0xC0; //8 bitPort4 P4.7 P4.6 P4.5 P4.4 P4.3 P4.2 P4.1 P4.0 1111,1111 sfr P4M0 = 0xB4; // 0000,0000 sfr P4M1 = 0xB3; // 0000,0000 // 7 6 5 4 3 2 1 0 Reset Value sfr P4SW = 0xBB; //Port-4 switch - LVD_P4.6 ALE_P4.5 NA_P4.4 - - - - x000,xxxx sfr P5 = 0xC8; //8 bitPort5 - - - - P5.3 P5.2 P5.1 P5.0 xxxx,1111 sfr P5M0 = 0xCA; // 0000,0000 sfr P5M1 = 0xC9; // 0000,0000 //-------------------------------------------------------------------------------- //新一代 1T 8051系列 单片机定时器特殊功能寄存器 // 7 6 5 4 3 2 1 0 Reset Value sfr TCON = 0x88; //T0/T1 Control TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 0000,0000 //----------------------------------- sbit TF1 = TCON^7; sbit TR1 = TCON^6; sbit TF0 = TCON^5; sbit TR0 = TCON^4; sbit IE1 = TCON^3; sbit IT1 = TCON^2; sbit IE0 = TCON^1; sbit IT0 = TCON^0; //----------------------------------- sfr TMOD = 0x89; //T0/T1 Modes GATE1 C/T1 M1_1 M1_0 GATE0 C/T0 M0_1 M0_0 0000,0000 sfr TL0 = 0x8A; //T0 Low Byte 0000,0000 sfr TH0 = 0x8C; //T0 High Byte 0000,0000 sfr TL1 = 0x8B; //T1 Low Byte 0000,0000 sfr TH1 = 0x8D; //T1 High Byte 0000,0000 //-------------------------------------------------------------------------------- //新一代 1T 8051系列 单片机串行口特殊功能寄存器 // 7 6 5 4 3 2 1 0 Reset Value sfr SCON = 0x98; //Serial Control SM0/FE SM1 SM2 REN TB8 RB8 TI RI 0000,0000 //----------------------------------- sbit SM0 = SCON^7; //SM0/FE sbit SM1 = SCON^6; sbit SM2 = SCON^5; sbit REN = SCON^4; sbit TB8 = SCON^3; sbit RB8 = SCON^2; sbit TI = SCON^1; sbit RI = SCON^0; //----------------------------------- sfr SBUF = 0x99; //Serial Data Buffer xxxx,xxxx sfr SADEN = 0xB9; //Slave Address Mask 0000,0000 sfr SADDR = 0xA9; //Slave Address 0000,0000 //----------------------------------- // 7 6 5 4 3 2 1 0 Reset Value sfr S2CON = 0x9A; //S2 Control S2SM0 S2SM1 S2SM2 S2REN S2TB8 S2RB8 S2TI S2RI 00000000B sfr S2BUF = 0x9B; //S2 Serial Buffer xxxx,xxxx sfr BRT = 0x9C; //S2 Baud-Rate Timer 0000,0000 //-------------------------------------------------------------------------------- //新一代 1T 8051系列 单片机看门狗定时器特殊功能寄存器 sfr WDT_CONTR = 0xC1; //Watch-Dog-Timer Control register // 7 6 5 4 3 2 1 0 Reset Value // WDT_FLAG - EN_WDT CLR_WDT IDLE_WDT PS2 PS1 PS0 xx00,0000 //----------------------- //-------------------------------------------------------------------------------- //新一代 1T 8051系列 单片机PCA/PWM 特殊功能寄存器 // 7 6 5 4 3 2 1 0 Reset Value sfr CCON = 0xD8; //PCA 控制寄存器。 CF CR - - - - CCF1 CCF0 00xx,xx00 //----------------------- sbit CF = CCON^7; //PCA计数器溢出标志,由硬件或软件置位,必须由软件清0。 sbit CR = CCON^6; //1:允许 PCA 计数器计数, 必须由软件清0。 //- //- sbit CCF1 = CCON^1; //PCA 模块1 中断标志, 由硬件置位, 必须由软件清0。 sbit CCF0 = CCON^0; //PCA 模块0 中断标志, 由硬件置位, 必须由软件清0。 //----------------------- sfr CMOD = 0xD9; //PCA 工作模式寄存器。 CIDL - - - CPS2 CPS1 CPS0 ECF 0xxx,x000 /* CIDL: idle 状态时 PCA 计数器是否继续计数, 0: 继续计数, 1: 停止计数。 CPS2: PCA 计数器脉冲源选择位 2。 CPS1: PCA 计数器脉冲源选择位 1。 CPS0: PCA 计数器脉冲源选择位 0。 CPS2 CPS1 CPS0 0 0 0 系统时钟频率 fosc/12。 0 0 1 系统时钟频率 fosc/2。 0 1 0 Timer0 溢出。 0 1 1 由 ECI/P3.4 脚输入的外部时钟,最大 fosc/2。 1 0 0 系统时钟频率, Fosc/1 1 0 1 系统时钟频率/4,Fosc/4 1 1 0 系统时钟频率/6,Fosc/6 1 1 1 系统时钟频率/8,Fosc/8 ECF: PCA计数器溢出中断允许位, 1--允许 CF(CCON.7) 产生中断。 */ //----------------------- sfr CL = 0xE9; //PCA 计数器低位 0000,0000 sfr CH = 0xF9; //PCA 计数器高位 0000,0000 //----------------------- // 7 6 5 4 3 2 1 0 Reset Value sfr CCAPM0 = 0xDA; //PCA 模块0 PWM 寄存器 - ECOM0 CAPP0 CAPN0 MAT0 TOG0 PWM0 ECCF0 x000,0000 sfr CCAPM1 = 0xDB; //PCA 模块1 PWM 寄存器 - ECOM1 CAPP1 CAPN1 MAT1 TOG1 PWM1 ECCF1 x000,0000 //ECOMn = 1:允许比较功能。 //CAPPn = 1:允许上升沿触发捕捉功能。 //CAPNn = 1:允许下降沿触发捕捉功能。 //MATn = 1:当匹配情况发生时, 允许 CCON 中的 CCFn 置位。 //TOGn = 1:当匹配情况发生时, CEXn 将翻转。 //PWMn = 1:将 CEXn 设置为 PWM 输出。 //ECCFn = 1:允许 CCON 中的 CCFn 触发中断。 //ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn // 0 0 0 0 0 0 0 0x00 未启用任何功能。 // x 1 0 0 0 0 x 0x21 16位CEXn上升沿触发捕捉功能。 // x 0 1 0 0 0 x 0x11 16位CEXn下降沿触发捕捉功能。 // x 1 1 0 0 0 x 0x31 16位CEXn边沿(上、下沿)触发捕捉功能。 // 1 0 0 1 0 0 x 0x49 16位软件定时器。 // 1 0 0 1 1 0 x 0x4d 16位高速脉冲输出。 // 1 0 0 0 0 1 0 0x42 8位 PWM。 //ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn // 0 0 0 0 0 0 0 0x00 无此操作 // 1 0 0 0 0 1 0 0x42 普通8位PWM, 无中断 // 1 1 0 0 0 1 1 0x63 PWM输出由低变高可产生中断 // 1 0 1 0 0 1 1 0x53 PWM输出由高变低可产生中断 // 1 1 1 0 0 1 1 0x73 PWM输出由低变高或由高变低都可产生中断 //----------------------- sfr CCAP0L = 0xEA; //PCA 模块 0 的捕捉/比较寄存器低 8 位。 0000,0000 sfr CCAP0H = 0xFA; //PCA 模块 0 的捕捉/比较寄存器高 8 位。 0000,0000 sfr CCAP1L = 0xEB; //PCA 模块 1 的捕捉/比较寄存器低 8 位。 0000,0000 sfr CCAP1H = 0xFB; //PCA 模块 1 的捕捉/比较寄存器高 8 位。 0000,0000 //----------------------- // 7 6 5 4 3 2 1 0 Reset Value sfr PCA_PWM0 = 0xF2; //PCA 模块0 PWM 寄存器。 - - - - - - EPC0H EPC0L xxxx,xx00 sfr PCA_PWM1 = 0xF3; //PCA 模块1 PWM 寄存器。 - - - - - - EPC1H EPC1L xxxx,xx00 //PCA_PWMn: 7 6 5 4 3 2 1 0 // - - - - - - EPCnH EPCnL //B7-B2: 保留 //B1(EPCnH): 在 PWM 模式下,与 CCAPnH 组成 9 位数。 //B0(EPCnL): 在 PWM 模式下,与 CCAPnL 组成 9 位数。 //-------------------------------------------------------------------------------- //新一代 1T 8051系列 单片机 ADC 特殊功能寄存器 // 7 6 5 4 3 2 1 0 Reset Value sfr ADC_CONTR = 0xBC; //A/D 转换控制寄存器 ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 0000,0000 sfr ADC_RES = 0xBD; //A/D 转换结果高8位 ADCV.9 ADCV.8 ADCV.7 ADCV.6 ADCV.5 ADCV.4 ADCV.3 ADCV.2 0000,0000 sfr ADC_RESL = 0xBE; //A/D 转换结果低2位 ADCV.1 ADCV.0 0000,0000 //-------------------------------------------------------------------------------- //新一代 1T 8051系列 单片机 SPI 特殊功能寄存器 // 7 6 5 4 3 2 1 0 Reset Value sfr SPCTL = 0xCE; //SPI Control Register SSIG SPEN DORD MSTR CPOL CPHA SPR1 SPR0 0000,0100 sfr SPSTAT = 0xCD; //SPI Status Register SPIF WCOL - - - - - - 00xx,xxxx sfr SPDAT = 0xCF; //SPI Data Register 0000,0000 //-------------------------------------------------------------------------------- //新一代 1T 8051系列 单片机 IAP/ISP 特殊功能寄存器 sfr IAP_DATA = 0xC2; sfr IAP_ADDRH = 0xC3; sfr IAP_ADDRL = 0xC4; // 7 6 5 4 3 2 1 0 Reset Value sfr IAP_CMD = 0xC5; //IAP Mode Table 0 - - - - - MS1 MS0 0xxx,xx00 sfr IAP_TRIG = 0xC6; sfr IAP_CONTR = 0xC7; //IAP Control Register IAPEN SWBS SWRST CFAIL - WT2 WT1 WT0 0000,x000 //-------------------------------------------------------------------------------- #endif
串口通訊程式/* /******************************************************************** 协议规定: 包头 类型位 数据位 结束位 0XFF 1 1 0XFF 各命令说明: 类型位 数据位 功能 0X00 0X01 前进 0X00 0X02 后退 0X00 0X03 左转 0X00 0X04 右转 0X00 0X00 停止 0X01 0X01 舵机上 0X01 0X02 舵机下 0X02 0X01 车灯亮 0X02 0X02 车灯灭 0X03 雷达数据 发送雷达数据 ***********************************************************************/ 版权声明: WIFI机器人网·机器人创意工作室版权所有 www.wifi-robots.com 您可以任意修改本程序,并应用于自行研发的智能小车机器人及其他电子产品上,但是禁止用于向他人牟取暴利。 By WIFI机器人网·机器人创意工作室 */ #include "uart.h" #include <stdio.h> #include "motor.h" #include "steer.h" extern uint16 se_timer[5]; uint8 buffer[3]; uint8 rec_flag=0; //等于0等待接受 等于1正在接受 void UART_init(void) { PCON |= 0x80; //使能波特率倍速位SMOD SCON = 0x50; //8位数据,可变波特率 BRT = RELOAD_COUNT; //设定独立波特率发生器重装值 AUXR |= 0x04; //独立波特率发生器时钟为Fosc,即1T AUXR |= 0x01; //串口1选择独立波特率发生器为波特率发生器 AUXR |= 0x10; //启动独立波特率发生器 ES = 1; //允许串口中断 EA = 1; //开总中断 TI = 1; } void UART_send_byte(uint8 byte) { ES = 0; //关串口中断 TI = 0; //清零串口发送完成中断请求标志 SBUF = byte; while(TI ==0); //等待发送完成 TI = 1; //清零串口发送完成中断请求标志 ES = 1; //允许串口中断 } void UART_send(uint8 *Buffer, uint8 Length) { while(Length != 0) { UART_send_byte(*Buffer); Buffer++; Length--; } } void Communication_Decode(void) { if(buffer[0]==0x00) { switch(buffer[1]) { case 0x01:MOTOR_GO_FORWARD; return; case 0x02:MOTOR_GO_BACK; return; case 0x03:MOTOR_GO_LEFT; return; case 0x04:MOTOR_GO_RIGHT; return; case 0x00:MOTOR_GO_STOP; return; default: return; } } else if(buffer[0]==0x01) { if(buffer[2]>180) return; switch(buffer[1]) { case 0x01:se_timer[0]=buffer[2]; return; case 0x02:se_timer[1]=buffer[2]; return; case 0x03:se_timer[2]=buffer[2]; return; case 0x04:se_timer[3]=buffer[2]; return; case 0x05:se_timer[4]=buffer[2]; return; default : return; } } else { return; } } void UART_Interrupt_Receive(void) interrupt 4 { static uint8 i; if(RI==1) { RI = 0; if(rec_flag==0) { if(SBUF==0xff) { rec_flag=1; i=0; } } else { if(SBUF==0xff) { rec_flag=0; if(i==3) { Communication_Decode(); } i=0; } else { buffer[i]=SBUF; i++; } } } else { TI = 0; } }
Images 0 | ||
---|---|---|
No images to display in the gallery. |