打印

急求助:为什么我的程序进不了中断!!!!

[复制链接]
1909|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nemo109|  楼主 | 2008-9-8 10:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是我自己写了一个串口程序.用C8051F340,但是却进不了中断....各位大侠帮我看看是什么问题啊...另外.我DEBUG后,KEIL中Peripherals中下拉菜单中只有Reset CPU.这是什么问题啊...小弟在此谢谢各位大侠了!!!



#include <c8051f340.h>
#include <stdio.h>
#include <string.h>

unsigned int xdata SendBuffer[512];             //发送缓冲区
unsigned int xdata ReceiveBuffer[512];           //接收缓冲区
unsigned int Flag_NewMessage;                   //新消息标志位
unsigned int Frame_Lenth;                       //待发送数据长度
unsigned int Data_len, Data_LRC;                //数据长度和校验和计算结果
unsigned int Send_count = 0, Receive_count = 0; //初始化发送和接收计数器
unsigned char LRC_Data = 0;                     //校验和
unsigned char Star_flag = 0;                    //帧开始标志
unsigned char Data_flag = 0;                    //数据开始标志
unsigned char LRC_flag = 0;                     //校验和标志
unsigned char Uart_Spi = 0x50;                  //与存储部分通信接口
unsigned char B_Star = 0, B_End = 0;            //帧开始和结束



#define STX 0x02                       //帧开始标志
#define ETX 0x03                       //帧结束标志
#define DATA_OK 0x83                   //正确接收响应
#define DATA_ERROR 0x38                //接收出错响应
#define STR_flag 0x7E                  //开始握手标志
#define END_flag 0x7F                  //结束握手标志
#define CON_flag 0x7D                  //暂停结束标志
#define DATA_flag 0x7C                 //数据开始标志


void Uart_PackageSend(unsigned char MESSAGE_ID,unsigned int Lenth);


/***************************************************
函数名:Baud_Init()
功  能:设置UART0数据传输的波特率.
***************************************************/
void Baud_Init()
{
    TMOD = 0x20;                       //T1工作在方式2
    CKCON = 0x08;                      //T1使用系统时钟
    TCON = 0x40;                       //启动定时器T1
    TH1 = 0xCC;                        //设置T1的初始值
    TL1 = 0xCC;                        //波特率=115200
}


/**************************************************
函数名:Uart_Init()
功  能:完成串口硬件的初始化,使串口处于可收发状态.
**************************************************/
void Uart_Init()
{
    SCON0 = 0x50;                      //UART0工作在可变波特率8位数据传输模式,允许UART0接收,REN0=1
    IE = 0x90;                         //开启总中断,允许UART0中断
    PS0 = 1;                           //设置UART0中断为高优先级    
}

/************************************************************
函数名:Uart_ISR()
功  能:串口中断服务程序,完成一帧数据的接收和发送.在传送时,
       按数据长度Frame_Lenth将发送缓冲区的数据依次发出.在接
       收时完成一帧数据的接收并校验,在校验正确后置一标志以
       示有新消息,供其他接口查询.
*************************************************************/
void Uart_ISR() interrupt 4 
{
    int i=0;
    if (TI0)
    {
        TI0 = 0;
        if (Send_count < Frame_Lenth)
        {
            SBUF0 = SendBuffer[Send_count];
            Send_count++;                                         
        }
        else
            Send_count = 0; 


    }
    if (RI0)
    {
        RI0 = 0;
        B_Star = SBUF0;
        if (B_Star == STX)
        {
            Star_flag = 1;                 //置帧开始标志位
            goto end;
        }        
        while (Star_flag )
        {   
            switch (i)
            { 
                case 0 : Data_len = SBUF0;
                         Data_LRC = SBUF0;
                         Data_len <<= 8;
                         i++;
                         break;
                case 1 : Data_len |= SBUF0;
                         Data_LRC ^= SBUF0;
                         i++;
                         break;
                default: Data_flag = SBUF0;
             }
             if (Data_flag == DATA_flag)   //查询数据开始标志位
             {
                if (Receive_count < Data_len)
                {
                    ReceiveBuffer[Receive_count] = SBUF0;
                    Data_LRC ^= SBUF0;
                    Receive_count++;
                }
                else
                    Receive_count = 0;
                    B_End = SBUF0;
                    if (B_End == ETX)
                    {
                        LRC_flag = 1; 
                    }
                if (LRC_flag)
                {
                    LRC_Data = SBUF0;
                    if (Data_LRC == LRC_Data)
                    {
                        Star_flag = 0;                  //清帧开始标志
                        Uart_Spi = 0x35;                //传送完一帧数据,告诉SPI可以取数据
                        SBUF0 = DATA_OK;                //返回DATA_OK给上位机
                    }
                    else
                        SBUF0 = DATA_ERROR;             //返回DATA_ERROR给上位机
                }       
             }
        }
    end:;    
   
    }    
}


/**************************************************************
函数名:Uart_Scan()
功  能:查询新消息标志,如果有新消息完成消息的解析.
**************************************************************/
void Uart_Scan()
{
    if (SBUF0 == STR_flag)
    {
        Uart_PackageSend(STR_flag,1); //返回开始握手信号
        ET0 = 0 ;
    }
    if (SBUF0 == END_flag)
    {
        Uart_PackageSend(END_flag,1); //返回结束握手信号
        Uart_Spi = 0x30;              //所有数据传送完
        ET0 = 1;
    }
    if (Uart_Spi == 0x50)
    {
        Uart_PackageSend(CON_flag,1); //发送暂停结束信号   
    }
}


/**************************************************************
函数名:Uart_PackageSend(MESSAGE_ID)
参  数:消息标识
功  能:根据消息的标识,对消息的内容进行打包,并启动传送.
**************************************************************/
void Uart_PackageSend(unsigned char MESSAGE_ID,unsigned int Lenth)
{
    int i = 0, j = 0;
    unsigned int len;
    len = Lenth; 
    SendBuffer[0] = STX;
    len >>= 8;        
    SendBuffer[1] = len;
    Data_LRC = len;
    SendBuffer[2] = Lenth;
    Data_LRC ^= Lenth;
    for (i = 0; i < Lenth; i++)
    { 
        SendBuffer[i + 3] = MESSAGE_ID;
        Data_LRC ^= MESSAGE_ID; 
    }
    SendBuffer[Lenth + 3] = ETX; 
    SendBuffer[Lenth + 4] = Data_LRC; 
    Frame_Lenth = Lenth + 4;
    /*for (j = 0; j < Frame_Lenth; j++)
    {
        
        break;  
    } */
}   


/******************************
函数名:main()
功  能:主函数
******************************/
void main()
{
    Baud_Init();
    Uart_Init();
    Uart_Scan();
    TI0=1;
    while(1);   
}

相关帖子

沙发
夏虫| | 2008-9-9 16:51 | 只看该作者

没开总中断吧

使用特权

评论回复
板凳
lyjian| | 2008-9-9 17:14 | 只看该作者

没开uart中断

使用特权

评论回复
地板
nemo109|  楼主 | 2008-9-9 17:21 | 只看该作者

开总中断了

我找出原因了,嘻嘻~~~~讲出来各位大侠不在拿板砖扔我啊。
是我把340配置的程序用120片子来调。所以~~~~~~快闪~~~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

29

帖子

0

粉丝