串行通信UART及PROTEUS仿真设计

发布者:innovator7最新更新时间:2010-06-29 关键字:C51  atmega64  串行通信  Proteus 手机看文章 扫描二维码
随时随地手机看文章
    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仿真如下图:

串行通信UART及PROTEUS仿真 - 漠然22 - 漠然22

    仿真结果如下图所示:

串行通信UART及PROTEUS仿真 - 漠然22 - 漠然22

    其中要注意的是:

    因为我在仿真中只能选择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<20;i++)
  {
   P1=byBuff;
   uart_send(Tx[i]);
  }
  }
 }


}

    atmega64的程序:

    两个文件,一个是将函数模块化,别一个是主函数,调用(- -!最近习惯将程序模块化。。。)

//------------------uart.c---------------------

//----这里将通信函数模块化------------

#include

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 & (1<;
/* Copy ninth bit to TXB8 */
UCSR0B &= ~(1<//if ( data & 0x0100 )
//UCSR0B |= (1</* Put data into buffer, sends the data */
UDR0 = data;
}

unsigned char uart0_Receive( void )
{
/* 等待接收数据*/
while ( !(UCSR0A & (1<;
/* 从缓冲器中获取并返回数据*/
return UDR0;
}

//--------------main.c-----------

//--------------------------------

#include
#include "spi.h"
#define commun_symbol 0x31

//-----------send a commun_symbol-----
//-----------receive a commun_symbol--
//      <--no,continue receive||||||yes-->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,任务完成了,改天实验一下!

关键字:C51  atmega64  串行通信  Proteus 引用地址:串行通信UART及PROTEUS仿真设计

上一篇:用单片机AT89S52实现DTMF信号译码
下一篇:MCF51QE128快速GPIO的外部总线接口设计

推荐阅读最新更新时间:2024-03-16 12:29

24c02的c51驱动
#include AT89X51.H //#include stdio.h //#include absacc.h #include intrins.h #define uchar unsigned char #define uint unsigned int sbit led=P1^0; sbit led2=P1^1; sbit SCL=P3^5; //24c02 SCL sbit SDA=P3^4; //24c02 SDA //sbit DOG=P1^7; //狗 uchar x24c02_read(uchar address); //从24c02的地址address中读取一个字节数据 void x24c02_
[单片机]
24c02的<font color='red'>c51</font>驱动
单片机C语言C51的输入输出
在C51语言中,它本身不提供输入和输出语句,输入和输出操作是由函数来实现的。在C51的标准函数库中提供了一个名为“stdio.h”的一般I/O函数库,它当中定义了C51中的输入和输出函数。当对输入和输出函数使用时,须先用预处理命令“#include stdio.h ”将该函数库包含到文件中。 在C51的一般I/O函数库中定义的I/O函数都是通过串行接口实现,在使用I/O函数之前,应先对51单片机的串行接口进行初始化。选择串口工作于方式2(8位自动重载方式),波特率由定时器/计数器1溢出率决定。例如,设系统时钟为12MHZ,波特率为2400,则初始化程序如下: SCON=0x52; TMOD=0X20; TH1=0
[单片机]
单片机C语言<font color='red'>C51</font>的输入输出
串行通信波特率的一种自动检测方法
  串行通信是终端和主机之间的主要通信方式,通信波特率一般选择1800、4800、9600和 19200等。终端的类型有很多种,其通信速率也有很多种选择。主机怎样确定终端的通信速率呢?本文给出了一种简单、易行的方法:设定主机的接收波特率(以9600波特为例),终端发送一个特定的字符(以回车符为例),主机根据接收到的字符信息就可以确定终端的通信波特率。本文对这种方法予以详述。 1 基本方法   回车符的ASCII值为0x0D。串行通信时附加一个起始位和终止位,位的传输顺序一般是 先传低位再传高位。此时回车符的二进制表示方式为: 图1 回车符的位序列   串行通信中一个二进制位的传输时间(记为T)取决于通信的波特率,9600
[单片机]
<font color='red'>串行通信</font>波特率的一种自动检测方法
proteus 1602液晶程序
proteus 中1602液晶是LM016L #include iom16v.h #include macros.h #include stdio.h #define uchar unsigned char #define uint unsigned int #pragma data:code const uchar table = I LOVE CHINA ; const uchar table1 = MADE BY LYQ ; void delay(uint ms) { uint i,j; for(i=0;i ms;i++) for(j=0;j 1141;j++); } void write_com(ucha
[单片机]
<font color='red'>proteus</font> 1602液晶程序
51单片机驱动超声波测距模块C51程序
#include reg52.h #define uchar unsigned char #define uint unsigned int #define ulong unsigned long //******************* 函数声明************************** void init_Total(); //总初始化 void init_T0(); //初始化定时器T0 void init_T1(); //初始化定时器T1 void init_inter0();//初始化外部中断1 void send_T(); void delay(uint z);//延时一段时间 void delay_
[单片机]
c51与汇编语言的接口
1.c51与汇编语言的模块内接口 有时候,需要使用 汇编语言 来编写程序,比如对硬件进行操作或在一些对时钟要求很严格的场合,但又不希望用汇编语言来编写全部程序或调用汇编语言编写的函数,那么可以通 过预编译指令 asm',在C代码中插入汇编代码。 方法是用#pragma语句。具体结构是: #pragma asm 汇编行 #pragma endasm 这种方法是通过#pragma asm和#pragma endasm告诉c51编译器,中间行不用编译为汇编行。例如: 2.c51与汇编语言的模块间接口 C51模块与汇编语言模块的接口较简单,分别用C5l与A51对源文件进行编译,然后用L51连接obj文件即可。模块
[单片机]
C51单片机中断函数的定义及应用
C51函数声明对ANSI C作了扩展,具体包括: 1.中断函数声明: 中断声明方法如下: void serial_ISR () interrupt 4 [using 1] { /* ISR */ } 为提高代码的容错能力,在没用到的中断入口处生成iret语句,定义没用到的中断。 /* define not used interrupt, so generate “IRET” in their entrance */ void extern0_ISR() interrupt 0{}/* not used */ void timer0_ISR () interrupt 1{}/* not used */ void extern1_IS
[单片机]
RS-232串行通信消除干扰噪声的设计方法分析
1 通信线路的绝缘设计方法    RS-232 的大噪声(干扰)容限可使接口可靠工作,避免对由外部加到导线上的噪声引起的数 据错误。在一个充满了电子噪声的连接环境中,绝缘可以防止噪声在连接电路之间的耦合。 绝缘通过将一个电路分成一个个独立的块来进行工作。这些块使用光和磁耦合来传送能量和数据,而过滤掉大部分的噪声。   绝缘可以隔开地线、数据连接,或者把两者都隔开。地线绝缘使得一个电路对电源震荡和在被附近电路共用的地线中的噪声有免疫能力。在长的连接中,地线绝缘还使得连接对从一端到另一端的接地电位差异有免疫能力。绝缘数据连接避免了噪声在连接和它所连接到的电路之间的耦合。   大多数的电路连接使用直接的办法,例如焊
[工业控制]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved