麻烦高手看一下,我用的是增强型uart,pc发送一个“s”给单片机,单片机受到后会给pc发送一个response at 9600 baud 。不知程序是否有问题???
程序如下:
#include "reg932.h"
#define uchar unsigned char
uchar temp;
char text[]="response at 9600 baud ";
void UART_Init();
void sendtoPC(char* dat);
void sendtoPC(char* dat)
{
int j=0;
while(dat[j]) // send string
{
TI=0; // clear transmit interrupt flag
SBUF=dat[j]; // start sending one byte
while (!TI); // wait until sent
j++;
}
}
//接收中断服务程序,接受命令。若接受正确,则进行相应的控制操作//
void Rcv_ISR() interrupt 4 //当接收完一个字节,R1置1,进入Receive中断
{
EA=0;
while(!RI) //等待接收完时R1置位,当R1=0以及SM2=0或接到的停止位=1,数据才会被装入
// SBUF和RB8,
temp=SBUF; //保存所读取的数据
RI=0; //RI清零,以等待下次发送(接受中断标志位,在接受停止位的中间时刻由硬件置位)
SBUF=temp; //发送数据(回应数据)
while(!TI) //当T1为1时,发送完毕
TI=0; //TI清零,准备为下一次发送(T1为发送中断标志,必须通过软件清零)
EA=1;
}
//发送中断//
void Send_ISR() interrupt 13
{
EA=0; //中断允许
while(temp=='s')
sendtoPC(text); //添加自己所需要的代码
EA=1;//禁止中断
}
//主函数
void main()
{
UART_Init();
while(1);
}
//串口初始化
void UART_Init()
{
P1M1=0x00;
P1M2=0X00;//端口初始化,使输出口方式为准双向口
SCON=0x50;//使能接受,选择串口模式1(SCON是串行口控制和状态寄存器,sm0+sm1=01,ren=表示串行口允许接收位)
SSTAT=0xE0;//选择独立的Tx/Rx中断,设置双缓冲方式,中断独立,每发送一字节,产生一次中断
//SSTAT.7双缓冲模式,1,双缓冲使能。UART在模式0时必须禁止
//SSTAT.6发送产生中断的位置!0:在停止位的开始产生TX中断;1:在停止位的结束产生TX中断。
//SSTAT.1:各自独立的RX和TX中断。该位复位时
//
BRGR0=0XF0;//选择波特率为9600@7.373,Baudrate=CCLK[(BRGR1,BRGR0)+16]
BRGR1=0X20;
BRGCON=0X03;//使能BRG(打开串口波特率发生器,使用串口波特率发生器),启动UART的波特率发生器
ESR=1;//允许RX中断
EST=1;//允许TX中断
EA=1;//使能中断
}
LZ 你这个程序错的地方有很多,串口是我可能会通的,sendtoPC(char* dat) dat为指针型,就不能用dat这样的语句了,用*dat; dat++;就好了, 在函数Rcv_ISR()里,while(!RI)是不需要的,还有发送数据最好是不要在接收中断中发,“temp=SBUF; RI=0;”应该写成“RI=0;temp=SBUF;”在初始化函数中,对BRGR0和BRGR1进行读操作时应该先把BRGCON清零, 还有你的波特率初值也算错了,初值=7373000/9600-16=0x2f0,所以,BRGR0=0XF0;BRGR1=0X02;
其它还有什么地方出错我就不能保证了,自己看得也不是很清楚。