高手请进:关于增强型单片机lpc932与pc的通信

absolute   2007-5-24 12:18 楼主
麻烦高手看一下,我用的是增强型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;//使能中断
}

回复评论 (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;
其它还有什么地方出错我就不能保证了,自己看得也不是很清楚。
点赞  2008-6-21 12:20
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复