我的PIC16F877A本来是和触摸屏通信的,可总不成功
接到PC的串口调试发现,他接收的数据是错的,发送就更不像话,只要程序里有发送,哪怕就运行一次,他就发个没完的00(我检查了程序,确定发送一次)
而且每次上电,pc的串口都会收到一次00(16进制),以下是我的初始化代码段
#define BAUD 9600 //波特率
#define FOSC 12000000L //系统时钟12M/4
#define NINE 0 //1为9bit通讯,0为8bit通讯
#define SPBRG_V ((int)(FOSC/(BAUD*16UL)-1)) //设定一个值到SPBRG,以异步高速方式
//在异步高速模式下,Baud Rate=Fosc/(16*(X+1)),X即为SPBRG_V
void init_uart(void)//初始化通讯串口,异步8位高速,使能发送/接收,响应接收中断
{
SPBRG=SPBRG_V;
TXSTA=0x26; //异步高速8位
RCSTA=0x90;
TX_PIN=0;
RX_PIN=1;
//TXIE=1; //无论TXIE是否置位,TXIF都会在TXREG空的时候置位,在TXREG装入时清0,
//TXIE只是设置是否让cpu响应这个TXIF中断
//RCIF是一个只读位,当用户程序把RCREG寄存器中的数取走后,或者RCREG寄存器为空时,RCIF位被软件自动清0
RCIE=1;
CS_485;
IN_485;
//初始化tmr2
//预分频:输入信号只有达到256个电平后,计数器的值才会加1/减1。
//后分频:只有中断发生256次后,才会置中断标志位。
T2CON=0x7e; //16预分频,16后分频,开tmr2
TMR2=197; //16*16*(256-197)*(1/(12M/4)) 定时约5ms
TMR2IF=0;
TMR2IE=1;
restart=0;
rxbc=0;
p_uart=0;
delay5ms=0;
isadd=0;
}
void uart_putbyte(unsigned char byte)
{
TXREG=byte;
while(!TRMT);
}
上面的485是打算在程序里支持485的,电路上也加了485,但库了调232,我把485的线路断了,程序里暂没去掉,应该不影响吧
现在这个uart的问题搞了几天了一点进展都没有,搞得触摸屏的事又没做,真是烦
大侠们都我支个招啊
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
------------------------
#include <16f690.h>
#fuses INTRC,noWDT,MCLR,noPROTECT//,MCLR//,IOSC4 //ok,内部RESET NOWDT
#use delay(clock=8000000)
#use rs232(baud=9600, xmit=PIN_A5, rcv=PIN_A4)
#define led PIN_C3
char buf;
//////////////////////////////////////////////////////////////////////////////////
void main(){
char a;
printf(" Waiting for device ... ");//送到PC口显示
a=getc(); //从PC接收数据
while(1) {
}
;
}
一周热门 更多>