关于PIC16F877A串口发送任意字符串的问题
PIC16F877A串口发送,查询方式,就为了调出这个费了我一天时间,原来是串口芯片电压问题,现总结如下:
1、注意232串口芯片供电电压,有5V和3.3V的
2、注意TXD、RXD接线,单片机的TXD接232芯片的R2OUT,单片机的RXD接232芯片的T2IN
3、注意ESP8266的UTXD接MCU的RX,URXD接MCU的TX
4、注意ESP8266的UTXD接232的T2IN,URXD接232的R2OUT
5、串口波特率设置成9600
6、注意连接线的可靠性,如果用线连的话一定要检查线和插座是否稳定连接
7、系统连线如下图所示
//以下是串口发送程序
#include《pic.h》
#define uchar unsigned char
#define uint unsigned int
__CONFIG(0x3B32);
void delay2ms(uint x)
{
uint a,b;
for(a=x; a》0; a--)
for(b=152; b》0; b--);
}
void UART_SendByte(unsigned char dat)
{
TXREG=dat;
while(TRMT==0);
}
void serial_init()
{
TRISC=0xbf;//设置RX为输入,TX为输出
TXSTA=0x24;
RCSTA=0x80;
SPBRG=0x33;//本人使用的是8MHz晶振,9600=8000000/(16*(X+1))-》X=51-》X=0x33
GIE=1;
PEIE=1;
RCIE=1;
}
void main()
{
serial_init();
while(1)
{
UART_SendByte(0x31);
UART_SendByte(0x32);
UART_SendByte(0x33);
delay2ms(500);
}
}
//以下是MCU发送AT命名给ESP8266的程序
#include《pic.h》
#define uchar unsigned char
#define uint unsigned int
#define LEDRD1
__CONFIG(0x3B32);
#define LED_OPEN() (LED=1)
#define LED_CLOSE() (LED=0)
#defineCPU_FOSC8000000
#defineBAUD9600
unsigned char* LYMS="AT+CWMODE=3\r";
unsigned char* SZLY="AT+CWSAP=\"ESP8277_CYT\"\,\"1234567890\"\,11\,3\r";
unsigned char* RST="AT+RST\r";
unsigned char* LCAP="AT+CWLAP\r";
unsigned char* SZDLJ="AT+CIPMUX=1\r";
unsigned char* KQFU="AT+CIPSERVER=1\,5000\r";
unsigned char* FSSJ="AT+CIFSR\r";
void delay2ms(uint x)
{
uint a,b;
for(a=x; a》0; a--)
for(b=152; b》0; b--);
}
void sys_init()
{
TRISD=0x00;//设置PORTD口为输出
}
void usart_init()
{
TRISC=0xbf;//设置RX为输入,TX为输出
TXSTA=0x24;
RCSTA=0x80;
SPBRG=0x33;//本人使用的是8MHz晶振,9600=8000000/(16*(X+1))-》X=51-》X=0x33
GIE=1;
PEIE=1;
RCIE=1;
}
void usart0_putchar(unsigned char data)
{
while (!TRMT);
TXREG = data;
}
void print(unsigned char* p_string)
{
while (*p_string)
{
if (*p_string != ‘\r’)
{
usart0_putchar(*p_string);
}
else
{
usart0_putchar(‘\r’);
usart0_putchar(‘\n’);
}
p_string++;
}
}
void send_command()
{
print(LYMS);delay2ms(500);delay2ms(500);
print(SZLY);delay2ms(500);delay2ms(500);delay2ms(500);delay2ms(500);delay2ms(500);
print(RST);delay2ms(500);delay2ms(500);delay2ms(500);delay2ms(500);delay2ms(500);
print(LCAP);delay2ms(500);delay2ms(500);delay2ms(500);delay2ms(500);delay2ms(500);
delay2ms(500);delay2ms(500);delay2ms(500);delay2ms(500);delay2ms(500);
print(SZDLJ);delay2ms(500);delay2ms(500);
print(KQFU);delay2ms(500);delay2ms(500);
print(FSSJ);delay2ms(500);delay2ms(500);
}
void main()
{
sys_init();
usart_init();
send_command();
while(1)
{
PORTD = 0xff;
delay2ms(500);
PORTD = 0x00;
delay2ms(500);
}
}
//以下是MCU发送AT命名给ESP8266的程序,并接收命令、解析并作出反应
#include《pic.h》
#define uchar unsigned char
#define uint unsigned int
unsigned char RX_Buffer[32];
unsigned char RX_CNT=0;
#define LED1RD1
#define LED2RD2
#define LED3RD3
__CONFIG(0x3B32);
#define LED1_OPEN() (LED1=1)
#define LED1_CLOSE() (LED1=0)
#define LED2_OPEN() (LED2=1)
#define LED2_CLOSE() (
PIC16F877A 相关文章:
- LT3751如何使高压电容器充电变得简单(08-12)
- 三路输出LED驱动器可驱动共阳极LED串(08-17)
- 浪涌抑制器IC简化了危险环境中电子设备的本质安全势垒设计(08-19)
- 严酷的汽车环境要求高性能电源转换(08-17)
- 适用于工业能源采集的技术 (08-10)
- 单片式电池充电器简化太阳能供电设计(08-20)