DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 240|回复: 0
打印 上一主题 下一主题

串行通信UART及PROTEUS仿真设计

[复制链接]
跳转到指定楼层
楼主
发表于 2011-4-28 22:35:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C51跟atmega64的串行通信。相关理论知识这里就不多说,只提几个:
51的UART所用的几个寄存器
SCON:SM0 SM1 SM2 REN RB8 TX8 RI TI
PCON: SMOD -- -- -- --- ---PD IDLE
T2CON: TF2 EXF2 RCLK TCLK EXEN2 TR2 C/_T CP/_RL2
TH2,TL2
波特率为9600bps
avr:atmega64的USART的两个
所用到的寄存器
这里用的是uart0,所以初始化时应该设置相关的寄存器有:
UCSR0A: RXC TXC UDRE FE DOR UPE U2X MPCM
UCSR0C :-- UMSEL UPM1 UPM0 USBS UCSZ1 UCSZ0 UCPOL
UBRR0H、UBRR0L、
UCSR0B :RXCIE TXCIE UDRIE RXEN TXEN UCSZ2 RXB8 TXB8
别问我这些都是代表什么含义,不懂自己翻书去。。
proteus仿真如下图:





仿真结果如下图所示:





其中要注意的是:
因为我在仿真中只能选择atmega64的CKSEL Fuse中的8MHz,所以在AVR的程序中初始化波特率是按8MHz来计算的。所以仿真归仿真,注意实际中应用。
51单片机用定时器1来产生波特率时,看书据说模式2下,12MHz时最高只能到达4800bps。这里就只好用定时器2来。不过也挺好用的。。仿真时用的是8052核。。否则没反应不要怪我哦。。
最后把程序附上,里面有些变量声明了没有用到,当初只是实验。。
51的:
#include "reg52.h"
#define AA 0x61
#define commun_symbol 0x31
sbit LED=P2^0;
unsigned char Tx[]={"my name is seven!"};
void uart_init(void)
{
SCON = 0x50;
RCAP2H = 0xFF;
RCAP2L = 0xD9;
TH2 = 0xFF;
TL2 = 0xD9;
T2CON = 0x34;

}
void uart_send(unsigned char byData)
{
TI=0;
SBUF=byData;
while(TI==0);
TI=1;
}
unsigned char uart_receive(void)
{
RI=0;
while(RI==0);
RI=1;
return(SBUF);
}
void main()
{
unsigned char byBuff,i;
uart_init();
uart_send(commun_symbol);
while(1)
{


byBuff=uart_receive();
LED=1;
if(byBuff==0x31)
{
for(i=0;i
void uart0_init(void)
{
UCSR0B = 0x00; //disable while setting baud rate
UCSR0A = 0x00;
UCSR0C = 0x06;
UBRR0L = 0x33; //set baud rate lo
UBRR0H = 0x00; //set baud rate hi
UCSR0B = 0x18;
}

void uart0_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSR0A & (1ta & 0x0100 )
//UCSR0B |= (1ta into buffer, sends the data */
UDR0 = data;
}
unsigned char uart0_Receive( void )
{
/* 等待接收数据*/
while ( !(UCSR0A & (1
#include "spi.h"
#define commun_symbol 0x31
//-----------send a commun_symbol-----
//-----------receive a commun_symbol--
// receive the data and send
void main()
{
unsigned char bybuff;
DDRB=0xff;
PORTB=0xff;
uart0_init();
{

do
{
bybuff=uart0_Receive();
}
while (bybuff!=commun_symbol);//commun_symbol);
while(1)
{

uart0_Transmit(bybuff);
bybuff=uart0_Receive();
PORTB=(0xff|bybuff);
}
}
}
ok,任务完成了,改天实验一下!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2026-6-24 11:35 , 耗时 0.251104 秒, 18 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

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