zuceyige 发表于 2012-5-1 16:48:10

proteu仿真avr串口通讯测试。

本帖最后由 zuceyige 于 2012-5-1 16:51 编辑

本人是长时间的菜鸟。今天仿真了一个串口通迅的仿真,也花了好几小时的时间,原因是对串口不太熟。。。。请指点。

仿真使用proteus,虚拟串口使用virtual serial ports driver 6.9. 以及串口调试小助手,芯片:mega16。仿真过程的设置网上很多,没问题的。
实验目的:使用虚拟串口收发数据并通过串口小助手显示发送的数据。波特率9600,晶振11059200,8位数据,1位停止位,无校验。
http://www.ourdev.cn/forum.php?mod=image&aid=13863&size=300x300&key=66d0978545f9bc34d58a37be8485d264&nocache=yes&type=fixnonehttp://www.ourdev.cn/forum.php?mod=image&aid=13868&size=300x300&key=6e9600310b3d8e644f16ad128ca07427&nocache=yes&type=fixnone

在仿真的时候用了马老师上面例程,可是烧录进去不行,可能仿真与实际是会有一些区别。。。

#include <iom16v.h>
#include <macros.h>
#defineuchar unsigned char
#defineuintunsigned int

#definemclk   11059200
#pragma interrupt_handler uart_rx:12
uchar flag=0,Uart_Recvpack=0;
void delay(uint ms)
{
      uint i,j;
        for(i=0;i<ms;i++)
           {
           for(j=0;j<1141;j++);
       }
}

void uart_init(uint baud)
{
    UCSRB=0x00;
   UCSRA=0x00;                   //控制寄存器清零
   UCSRC=(1<<URSEL)|(0<<UPM0)|(3<<UCSZ0);                                                            
   baud=mclk/16/baud-1        ;   
   UBRRL=baud;                                                        
   UBRRH=baud>>8;                   
   UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);

   SREG=BIT(7);                      
   DDRD|=0X02;                      

}
void uart_sendB(uchar data)
{
   while(!(UCSRA&(BIT(UDRE)))) ;
   UDR=data;
   while(!(UCSRA&(BIT(TXC))));
   UCSRA|=BIT(TXC);
}

#define UART_BEGIN_STX0xBB   //数据包的头
#define UART_END_STX    0xEE   //数据包的尾
unsigned char rx_buffer;   // USART Receiver buffer
unsigned char rx_counter=0;
void uart_rx(void)
{
    UCSRB&=~BIT(RXCIE);
        rx_buffer=UDR;
        if(++rx_counter==5){rx_counter=0;flag=1;}
        UCSRB|=BIT(RXCIE);
}
void main(void)
{
    //uchar i=4;
        //uchar j='a';
        PORTC=0;
        DDRC=0XFF;
    uart_init(9600);
        while(1)
        {
       
           if(flag)
           {
                  uchar i=0;
             flag=0;
               switch (i)
                     {
                case 0:   // 检验起始字符
                  if (rx_buffer== UART_BEGIN_STX) i = 3;
                                        else break;
                case 3:   // 检验校验字
                  if (rx_buffer==(rx_buffer^rx_buffer)) i = 4;
                  else break;
                case 4:   // 检验结束字符
                  rx_counter = 0;
                  if (rx_buffer == UART_END_STX) Uart_Recvpack = 1;
                  break;   // Uart_Recvpack=1,表示正确接收到一个数据包
                                default:
                                  break;
                                }                                       
                }
               
               
          if(Uart_Recvpack)
                {
             uchar j=0;
               Uart_Recvpack=0;
               switch (rx_buffer)   // 根据数据包内容点亮PORTC上的灯。
            {
                case 0xA0:
                                       if(rx_buffer==0x00)PORTC|=BIT(0);
                                       else PORTC&=~BIT(0);
                  break;
                case 0xA1:
                  if (rx_buffer==0x00)PORTC|=BIT(1);
                                        else PORTC&=~BIT(1);      
                  break;
                                case 0xA2:
                                        if(rx_buffer==0x00)PORTC|=BIT(2);
                                        else PORTC&=~BIT(2);
                                        break;
                                case 0xA3:
                                        if(rx_buffer==0x00)PORTC|=BIT(3);
                                        else PORTC&=~BIT(3);
                                        break;
                                case 0xA4:
                                        PORTA=rx_buffer;
                                        break;                                       
                default:
                  break;
                 }
                  for(j=0;j<5;j++)         //发送接收到的数据。
                          {
                         uart_sendB(rx_buffer);
                          delay(5);
                    }
                }

        }
       
}

为什么图片到中间去了呢????
页: [1]
查看完整版本: proteu仿真avr串口通讯测试。