|
本帖最后由 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=fixnone) ![](http://www.ourdev.cn/forum.php?mod=image&aid=13868&size=300x300&key=6e9600310b3d8e644f16ad128ca07427&nocache=yes&type=fixnone)
在仿真的时候用了马老师上面例程,可是烧录进去不行,可能仿真与实际是会有一些区别。。。
#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
#define mclk 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_STX 0xBB //数据包的头
#define UART_END_STX 0xEE //数据包的尾
unsigned char rx_buffer[5]; // USART Receiver buffer
unsigned char rx_counter=0;
void uart_rx(void)
{
UCSRB&=~BIT(RXCIE);
rx_buffer[rx_counter]=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[0]== UART_BEGIN_STX) i = 3;
else break;
case 3: // 检验校验字
if (rx_buffer[3]==(rx_buffer[1]^rx_buffer[2])) i = 4;
else break;
case 4: // 检验结束字符
rx_counter = 0;
if (rx_buffer[4] == UART_END_STX) Uart_Recvpack = 1;
break; // Uart_Recvpack=1,表示正确接收到一个数据包
default:
break;
}
}
if(Uart_Recvpack)
{
uchar j=0;
Uart_Recvpack=0;
switch (rx_buffer[1]) // 根据数据包内容点亮PORTC上的灯。
{
case 0xA0:
if(rx_buffer[2]==0x00)PORTC|=BIT(0);
else PORTC&=~BIT(0);
break;
case 0xA1:
if (rx_buffer[2]==0x00)PORTC|=BIT(1);
else PORTC&=~BIT(1);
break;
case 0xA2:
if(rx_buffer[2]==0x00)PORTC|=BIT(2);
else PORTC&=~BIT(2);
break;
case 0xA3:
if(rx_buffer[2]==0x00)PORTC|=BIT(3);
else PORTC&=~BIT(3);
break;
case 0xA4:
PORTA=rx_buffer[2];
break;
default:
break;
}
for(j=0;j<5;j++) //发送接收到的数据。
{
uart_sendB(rx_buffer[j]);
delay(5);
}
}
}
}
为什么图片到中间去了呢???? |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|