搜索
bottom↓
回复: 1

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

[复制链接]

出0入0汤圆

发表于 2011-12-8 15:22:26 | 显示全部楼层 |阅读模式
#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);
           }          
        }       
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2011-12-8 15:25:10 | 显示全部楼层
上述程序成功通讯并返回,但存在的问题:当返回成功后,程序会跳出WHILE循环,又会点亮PC7.
实在是找不到原因,故向马老师请教
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 23:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表