ele2011 发表于 2011-12-8 15:22:26

马老师,M128 usart0口通讯问题求教

#include <iom128v.h>       
#include "mainboardtest.h"

#pragma interrupt_handler usart0_receive_int:19



unsigned char state;
unsigned char getright_state;



void delay_nNOP(unsigned int n)
{
        unsigned int i=0;
        for(i=0; i<n; i++)
        nop();
}
void delay_10us(void)
{
        NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
        NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
        NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
        NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
        NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
        NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
        NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
        NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
        NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
        NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
        NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
        NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
        NOP();NOP();NOP();NOP();NOP();
}
void delay_n10us(unsigned int n)
{
        unsigned int i=0;
        for(i=0; i<n; i++)
        delay_10us();
}
void delay_1ms(void)
{
        unsigned int i;
        for(i=0; i<100; i++)
        delay_10us();
}
void delay_nms(unsigned int n)
{
        unsigned int i=0;
        for(i=0; i<n; i++)
        delay_1ms();
}   
/*******************************************
定义IO口
******************************************/
void port_init(void)
{
DDRC= 0xff;   //PC输入,P3口按键输入
PORTC = 0x00;   //将PC输入口加上拉电阻
}


void USART0_Init()                           
{
    unsigned char middle;
    middle = SREG;                                    
    CLI(); //清除中断                                          
    UCSR0B |= (1<<RXCIE0); //接收结束中断使能                           
    UCSR0B |= (1<<TXCIE0); //发送结束中断使能                           
    UCSR0B |= (1<<RXEN0);//接收使能                        
    UCSR0B |= (1<<TXEN0);//发送使能                           
    UCSR0C &= ~(1<<UMSEL0);//USART 模式选择,0异步,1同步, 异步                        
    UCSR0C &= ~(1<<UCPOL0);//时钟极性,使用异步模式时,将这一位清零                        
    UCSR0C &= ~(1<<UPM01); //奇偶校验模式,                           
    UCSR0C &= ~(1<<UPM00); //奇偶校验模式,0,0 禁止
   
        UCSR0B &= ~(1<<UCSZ02); //字符长度                        
    UCSR0C |= (1<<UCSZ01)|(1<<UCSZ00);//字符长度011 8位
       
    UCSR0C |= (1<<USBS0); //停止位选择,0,一位停止位,1两位停止位                           
    UBRR0L = 103;         //波特率:9600pbs
    SREG = middle;                                    
    SEI();//开总中断                                          
}

void USART0_TxD(unsigned char data)
{
        //wait for empty transmit buffer
        while(!(UCSR0A&(1<<UDRE0)));
        //put data into buffer,sends the data
        UDR0=data;
}

unsigned char usart0_receive_bity()
{
    while (!(UCSR0A&(1<<RXC0)));                  
    return UDR0;                                 
}
/**********USART0**********/
void usart0_receive_int()
{
        unsigned char data,middle;
        middle = SREG;                                 
        CLI();                                             
        data = usart0_receive_bity();
    if(data == 0x01)
        {
          getright_state = 1;
        }
        if(data == 0x02)
        {
          getright_state = 2;
        }
        if(data == 0x03)
        {
          getright_state = 3;
        }
        if(data == 0x04)
        {
                getright_state = 4;
        }
        SREG = middle;                                    
        SEI();                                             
}
                              
void INIT_DEVICE(void)
{
        unsigned char cSREG;
        cSREG =SREG;
        CLI();
    port_init();
    USART0_Init();
    SREG = cSREG;
    SEI();       
}

void main()
{
        getright_state = 0;
    INIT_DEVICE();
    SREG = 0x80;
    SEI();
    //除串口的其他试验程序
        delay_nms(500);
        PORTC|=(1<<7);       //PC7输出高电平
        delay_nms(800);
        PORTC&=~(1<<7);
        //除串口的其他试验程序
    while(1)
    {
       delay_nms(800);
           if(getright_state == 1)
           {
                     
                          USART0_TxD(0x01);
           }          
       if(getright_state == 2)
           {   
                   
                          USART0_TxD(0x02);
           }       
           if(getright_state == 3)
           {   
                
                          USART0_TxD(0x03);
           }
           if(getright_state == 4)
           {   
                
                          USART0_TxD(0x04);
           }          
        }       
}

ele2011 发表于 2011-12-8 15:25:10

上述程序成功通讯并返回,但存在的问题:当返回成功后,程序会跳出WHILE循环,又会点亮PC7.
实在是找不到原因,故向马老师请教
页: [1]
查看完整版本: 马老师,M128 usart0口通讯问题求教