AVR串口通信程序RS232头文件

发布者:廿由人最新更新时间:2016-10-19 来源: eefocus关键字:AVR  串口通信  RS232  头文件 手机看文章 扫描二维码
随时随地手机看文章
下面是ATMEGA128的头文件

/************************这是串口0******************************/
/*串口0的初始化*/
void Uart0_init(void)
{  
   UCSR0B = 0x00; //禁止发送和接收
   UCSR0A = 0x02; //倍速异步模式USX0=1
   UBRR0L=(Crystal/8/Baud0-1)%256; //根据数据手册的计算法
   UBRR0H=(Crystal/8/Baud0-1)/256; //如果不是倍速则(Crystal/16/Baud0-1)
   UCSR0B=(1<    UCSR0C=(1<    DDRE|=BIT(1);  //设置发送口为输出
}

/*串口0单字符发送,查询方式*/
void Uart0_sendbyte(uchar i) 
{
 while (!(UCSR0A & (1<  UDR0 = i;    /* 要发送的数据*/
}

/*串口0字符串发送*/
void Uart0_sendstring(uchar *p)
{
    while(*p)
      {
         Uart0_sendbyte(*p);
   p++;
      }
}

/*串口0接收中断*/
#pragma interrupt_handler Uart0_rx:19
void Uart0_rx(void)
{
    UCSR0B&=~BIT(RXCIE0);//先关接收中断
 R_dat0=UDR0;         //用变量接收串口1收到的数据
 Flag0=1;      
 UCSR0B|=BIT(RXCIE0);//重开接收中断
}

/***************************这是串口1******************************/
/*串口1的初始化*/
void Uart1_init(void)
{  
   UCSR1B = 0x00; //禁止发送和接收
   UCSR1A = 0x02; //倍速异步模式USX0=1
   UBRR1L=(Crystal/8/Baud1-1)%256; //根据数据手册的计算法
   UBRR1H=(Crystal/8/Baud1-1)/256; //如果不是倍速则(Crystal/16/Baud1-1)
   UCSR1B=(1<    UCSR1C=(1<    DDRD|=BIT(3);  //设置发送口为输出
}

/*串口0单字符发送,查询方式*/
void Uart1_sendbyte(uchar i) 
{
 while (!(UCSR1A & (1<  UDR1 = i;    /* 要发送的数据*/
}

/*串口1字符串发送*/
void Uart1_sendstring(uchar *p)
{
    while(*p)
      {
         Uart1_sendbyte(*p);
   p++;
      }
}

/*串口1接收中断*/
#pragma interrupt_handler Uart1_rx:31
void Uart1_rx(void)
{
    UCSR1B&=~BIT(RXCIE1);//先关接收中断
 R_dat1=UDR1;         //用变量接收串口1收到的数据
 Flag1=1;      
 UCSR1B|=BIT(RXCIE1);//重开接收中断
}

 

以下是主机部份

#include
#include
#define uchar unsigned char
#define uint unsigned int

#include "delay.h"
#include "lcd.h"

void port_init(void);
//SPI initialize
// clock rate: 1843199hz
void spi_init(void)
{
 SPCR = 0x74; //setup SPI
 SPSR = 0x00; //setup SPI
  DDRB=0X07;
  PORTB|=0X08;
}

//call this routine to initialize all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts

 port_init();
 spi_init();

 SEI(); //re-enable interrupts
}

uchar SPI_Transmit(char cData)
{
/* 启动数据传输 */
SPDR = cData;
/* 等待传输结束 */
while(!(SPSR & (1< return SPDR;
}

uchar SPI_Receive(void)
{
/* 等待接收结束 */
while(!(SPSR & (1< ;
/* 返回数据 */
return SPDR;
}

void main()
{  
   unsigned char pa,i;
    init_devices();
 LCD1602_initial();
 LCD1602_sendbyte(iDat,1+0x30 );
  // while(1)
 //{
 for(i=0;i<2;i++)
 {
     LCD1602_gotoXY(1, 2);
     //SPI_Transmit(0x01); 
  //pa=SPI_Receive();
  LCD1602_sendbyte(iDat,SPI_Transmit(0x01)+0x30 );
  }//delayms(1000);
 //}
}

 

以下是从机部份

#include
#include
#define uchar unsigned char
#define uint unsigned int

#include "delay.h"
#include "lcd.h"

void port_init(void);
//SPI initialize
// clock rate: 1843199hz
void spi_init(void)
{
 SPCR = 0x64; //setup SPI
 SPSR = 0x00; //setup SPI
  DDRB=0X08;
 PORTB|=0X07;
}

//call this routine to initialize all peripherals
void init_devices(void)
{
 CLI(); //disable all interrupts

 port_init();
 spi_init();

 SEI(); //re-enable interrupts
}

void SPI_Transmit(char cData)
{
/* 启动数据传输 */
SPDR = cData;
/* 等待传输结束 */
while(!(SPSR & (1< }

uchar SPI_Receive(void)
{
/* 等待接收结束 */
while(!(SPSR & (1< /* 返回数据 */
return SPDR;
}

void main()
{  unsigned char pp,i;
    init_devices();
 LCD1602_initial();
 LCD1602_sendbyte(iDat,2+0x30 );
 //while(1)
 //{
   for(i=0;i<2;i++)
   {
     LCD1602_gotoXY(1, 2);
  pp=SPI_Receive(); 
  SPI_Transmit(0x03);
  LCD1602_sendbyte(iDat,pp+0x30 );
   } 
  //delayms(1001);
 //}
}
}

用于测量三个脉冲的时间差·~~~

原理是分别读取每个脉冲来时定时器内的计算值

uint rise_time1,rise_time2,rise_time3;
uchar rise_flag;
uchar over_flow;
uint piancha1,piancha2;
uchar table1[5];
uchar table2[5];
#pragma interrupt_handler timer0_ovf_isr:17
void timer0_ovf_isr(void)
{
   over_flow++;
}


#pragma interrupt_handler timer1_capt_isr:12
void timer1_capt_isr(void)
{  
   static uchar cishu;
   cishu++;
   if(cishu==1)
   rise_time1=ICR1;
   
   else if(cishu==2)
   rise_time2=ICR1;
   
   else if(cishu==3)
  { rise_time3=ICR1;  rise_flag=1;}
 //timer 1 input capture event, read (int)value in ICR1 using;
 // value=ICR1L;            //Read low byte first (important)
 // value|=(int)ICR1H << 8; //Read high byte and shift into top byte
}

void main()
{
   uchar i;
   TCCR1B=0X42;
   TIMSK=0X24;
   rise_flag=0;
   LCD1602_initial();
   LCD1602_gotoXY(1,2);
   LCD1602_sendbyte(iDat,'a');
     SEI();
   TIMSK|=BIT(4);
   while(1)
   {
      if(rise_flag==1)
     {
    piancha1=(rise_time2-rise_time1);
    piancha2=(rise_time3-rise_time2);
    table1[0]=piancha1/10000;
    table1[1]=piancha1%10000/1000;
    table1[2]=piancha1%1000/100;
    table1[3]=piancha1%100/10;
    table1[4]=piancha1%10;
    table2[0]=piancha2/10000;
    table2[1]=piancha2%10000/1000;
    table2[2]=piancha2%1000/100;
    table2[3]=piancha2%100/10;
    table2[4]=piancha2%10;
     LCD1602_gotoXY(2,1);
    for(i=0;i<4;i++)
    {
    LCD1602_sendbyte(iDat,table1[i]+0x30);
    }
    for(i=0;i<4;i++)
    {
    LCD1602_sendbyte(iDat,table2[i]+0x30);
    }
  }
   }
}

关键字:AVR  串口通信  RS232  头文件 引用地址:AVR串口通信程序RS232头文件

上一篇:AVR(ATMEGA_I2C,WTI功能)外部EEPROM_AT24C64读写
下一篇:用单片机(AVR)比较准确地读出PS2鼠标位移(X,Y轴位移)

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

基于AVR单片机的船载中小型信息监控终端的设计方案
目前,随着信息产业的迅猛发展,各类船舶亟需配备更多质优价廉的中小型信息监控终端,用于监控气象状况、获取导航信息以便保证航行安全。以ARM、MIPS等领衔的32位处理器在信息监控终端应用中,显示出极大优势,但是一般以32位处理器构建的嵌入式系统往往需要配置外部FLASH和SDRAM,这样就使得开发和维护整个系统的成本较高,本设计采用高性能低功耗的AVR单片机和LCD液晶模块来设计信息监控终端,具有价格低廉、性能稳定、显示清晰、人机界面良好等优点,能够满足船舶对中小型信息监控终端的需求。 1 总体设计 信息监控终端主要由显示控制板、键盘、通信接口和液晶显示模块构成,具有数据收发、数据显示、人机交互和屏幕亮度调整等功能,其组
[单片机]
基于<font color='red'>AVR</font>单片机的船载中小型信息监控终端的设计方案
HT66F50的应用
今年有些意外,还得研究研究HT66F50。PDF里面已经讲解了它强大的功能,这里我就不讲了。(个人觉得我这种条件下使用,芯片上没有集成串口通信,有点遗憾。) 下面我简单介绍一下我在使用的过程中遇到的一些和46F49E/46RU232之间的区别: 一、使用过程的区别: 1.从新开发环境IDE-3000中集成的头文件来看,66F50只给出了相应寄存器的入口地址申明,而并没有像其他两款芯片的头文件一样给出每一个I/O的申明,这使得在使用过程中很是不方便(个人觉得)。因此不得不在使用之前,自己将对应的I/O在头文件申明一遍。 2.66F50引脚的重置功能更加强大。--这也导致在使用过程中对相应寄存器的设置变得更加复杂,不过习惯和熟悉了
[单片机]
AVR的INT外部中断和PCINT中断之区别与使用
INT外部中断是几乎所有通用单片机,嵌入机中都会带有的,早期的51系列和arm系列也都有,然而大多数因为设计原因,多只有带两个INT,最近别人提到了一个“所有端口都可以外部中断”这样的说法,因为表示存疑,因此找了些资料,也就找到了avr328p自带的PCINT引脚功能 INT外部中断和AVR和PCINT具体区别如下: 差别1. INT限制在了两个端口上面,而PCINT则是所有接口都具备。 差别2. INT具有上沿,下沿,低电平,高电平触发这几种模式,而PCINT只有测量电平的变化这一个模式。 差别3. INT可以了解具体是哪个口触发的,而PCINT不行。 差别4. PCINT不会直接跳转入指定的程序,用
[单片机]
<font color='red'>AVR</font>的INT外部中断和PCINT中断之区别与使用
AVR单片机IC卡程序
AVR单片机IC卡程序 #include io8535v.h #include macros.h #define uchar unsigned char #define uint unsigned int //**********定义全局变量*******************// //查表0 1 2 3 4 5 6 7 8 9 E F P OFF uchar table ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x79,0x71,0x73,0x00}; uchar I CC ode ;//定义IC卡复位时读出的4字节代码; uc
[单片机]
<font color='red'>AVR</font>单片机IC卡程序
集UART与RS232于一体的MAX3110E原理及应用
1 概述 MAX3110E内部集成了全功能UART和内置电泵电容以及土15kV ESD保护的RS-232收发器。其中,UART部分采用兼容SPITM/QSPITM/MICROWIRETM的串行接口,因而可节省线路板空间和微控制器的μC)I/0引脚。由于RS-232部分使用了特有的低压差输出级,从而使双接收/发送接口能够在高速通信、正常电源下提供真正的RS-232特性,而功耗仅600μA。由于UART和RS-232两部分电路共用电源和地,所以,它们既可联合使用也可独立使用。 通过MAX3110E可实现/μC的同步串行数据接口到异步串行通信口(RS-232)的转换,它可直接与PC机的串行口(COM)相连。MAX3110E具有尺寸小
[嵌入式]
IAR AVR环境设置和Proteus联调介绍
IAR据说是效率最高的编译器,但是设置起来还真的不是那么顺手,在经过一番折腾后,终于有了头绪。 首先,当然是建立一个新的工程,Project Creat new project,出现以下对话框,选择Empty project,确定。 然后输入工程名,选择保存的路径,确定。此时,我们需要添加C文件,new file保存为文件名.c格式,然后在右边的工程中添加,完成后如下图所示 这样建好以后呢,还需要设置下,右键点击工程lesson1,选择options选项 在CPU设置里选择MCU型号,这里我们用的是ATmega16,选择 因为要使用proteus进行代码级仿真,还需要在linker
[单片机]
单片机头文件的作用
刚刚在看52单片机和GPS通信程序的时候,看到了一个函数,absacc.h,貌似从来没有遇到过,百度了一下,结合自己的理解,整理如下: http://blog.sina.com.cn/s/blog_4f8cdc9e0100g1qp.html 《51单片机keilC中头文件absacc.h作用》 http://apps.hi.baidu.com/share/detail/716779 《absacc.h库介绍》 http://blog.sina.com.cn/s/blog_5f0187c50100e0nt.html 《#include absacc.h 的作用(转)》 就看这几个基本够了,应该能明白这个文件是什么了: 在程序
[单片机]
爱特梅尔的AVR微控制器集成射频发送器功能
爱特梅尔公司(Atmel® Corporation)宣布推出首个ATA874x单芯片UHF ASK/FSK RF发送器系列。这一全新AVR®产品线具有业界领先的射频 (RF) 性能,并可在免授权的ISM频带(868 到 928 MHz、433 MHz和 315 MHz) 运作。ATA874x系列瞄准工业和消费领域的多元化专有无线应用,如计量、报警系统和家居控制应用设备等。 爱特梅尔是智能计量和家居自动化市场的知名厂商,一直提供出色的无线IEEE 802.15.4 和 ZigBee®产品;如今更采取更多的举措,以满足专有无线市场领域各种多元化的需求。 ATA874x系列器件包含一个低功率AVR CPU和一个高效
[网络通信]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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