avr单片机双通信C程序

2019-11-16来源: 51hei关键字:avr  单片机  双通信

将下面2个程序分别烧录进2个单片机中.

单片机U1

//ICC-AVR application builder : 2013-6-14 10:17:58

// Target : M16

// Crystal: 8.0000Mhz

#include

#include

#define LED1_ON PORTD|=(1<

#define LED1_OFF PORTD&=~(1<

#define LED2_ON PORTD|=(1<

#define LED2_OFF PORTD&=~(1<

//共阳极数码管

unsigned char table[]={0XC0,0XF9,0XA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90,0X88,0X83,0XC6,0XA1,0X86,0X8e};

unsigned char count=0,count_h,count_l;

unsigned char a=0,cnt,cnt1;

unsigned char key,count_temp;

void port_init(void)

{

 PORTA = 0xFF;

 DDRA  = 0x00;

 PORTB = 0xFF;

 DDRB  = 0x00;

 PORTC = 0xFF; //m103 output only

 DDRC  = 0xFF;

 PORTD = 0xFF;

 DDRD  = 0x32;

}

//TIMER0 initialize - prescale:256

// WGM: Normal

// desired value: 0.005Sec

// actual value:  0.005Sec (0.2%)

void timer0_init(void)

{

 TCCR0 = 0x00; //stop

 TCNT0 = 0x64; //set count

 OCR0  = 0x9C;  //set compare

 TCCR0 = 0x04; //start timer

}

#pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF

void timer0_ovf_isr(void)

{

    a++;

 TCNT0 = 0x64; //reload counter value

}

//UART0 initialize

// desired baud rate: 9600

// actual: baud rate:9615 (0.2%)

void uart0_init(void)

{

 UCSRB = 0x00; //disable while setting baud rate

 UCSRA = 0x00;

 UCSRC = BIT(URSEL) | 0x06;

 UBRRL = 0x33; //set baud rate lo

 UBRRH = 0x00; //set baud rate hi

 UCSRB = 0x98;

}

#pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC

void uart0_rx_isr(void)

{

 //uart has received a character in UDR

    unsigned char udr0;

 udr0=UDR;

 count_temp=udr0;

}

//call this routine to initialize all peripherals

void init_devices(void)

{

 //stop errant interrupts until set up

 CLI(); //disable all interrupts

 port_init();

 timer0_init();

 uart0_init();

 MCUCR = 0x00;

 GICR  = 0x00;

 TIMSK = 0x01; //timer interrupt sources

 SEI(); //re-enable interrupts

 //all peripherals are now initialized

}

//发送数据uart0_TX

//函数功能:把要发送的数据data送到发送数据缓存器UDR中,然后发送出去

void uart0_TX(unsigned char data)

{

     while(!(UCSRA&(1<

  UDR=data;

}

//8M晶振频率下的延时一毫秒

void delay(unsigned int k)

{

    unsigned int m,n;

 for(m=0;m

 {

     for(n=0;n<1140;n++)

  {;}

 }

}

//数码管显示函数

void display(void)

{

    count_h=count/10;

 count_l=count%10;

 PORTC=table[count_h];

 LED1_ON;

 delay(1);//这个延时很重要,不加的话CUP运行过快将会导致LED数码管无法显示;

 LED1_OFF;

 PORTC=table[count_l];

 LED2_ON;

 delay(1);

 LED2_OFF;

}

//主函数

void main(void)

{

    init_devices();

 while(1)

 {

     key=PINB;

  uart0_TX(key);

  display();

  switch(count_temp)

  {

      case 1: TIMSK = 0x01;break;

   case 2: TIMSK = 0x00;break;

   case 3: count=0X00;TIMSK = 0x01;break;

  }

  if(a==150)

  {

      a=0;

   if(count==59)

   { count=0; }

   else { count++; }

  }

 }

}


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

单片机U2


 //ICC-AVR application builder : 2013-6-14 10:31:18

// Target : M16

// Crystal: 8.0000Mhz

#include

#include

unsigned char led_dis;

unsigned char count_temp,cnt1,cnt=1;

void port_init(void)

{

 PORTA = 0x00;

 DDRA  = 0x00;

 PORTB = 0xFF;

 DDRB  = 0xFF;

 PORTC = 0x00; //m103 output only

 DDRC  = 0x00;

 PORTD = 0xFF;

 DDRD  = 0x02;

}

//UART0 initialize

// desired baud rate: 9600

// actual: baud rate:9615 (0.2%)

void uart0_init(void)

{

 UCSRB = 0x00; //disable while setting baud rate

 UCSRA = 0x00;

 UCSRC = BIT(URSEL) | 0x06;

 UBRRL = 0x33; //set baud rate lo

 UBRRH = 0x00; //set baud rate hi

 UCSRB = 0x98;

}

#pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC

void uart0_rx_isr(void)

{

 //uart has received a character in UDR

 unsigned char udr0;

   udr0=UDR;

   led_dis=udr0;

}

#pragma interrupt_handler int0_isr:iv_INT0

void int0_isr(void)

{

 //external interupt on INT0

    cnt++;

 if(cnt==1)

 {  

     count_temp=1;

    }

 else if(cnt==2)

 {

     count_temp=2;

  cnt=0;

 }

}

#pragma interrupt_handler int1_isr:iv_INT1

void int1_isr(void)

{

 //external interupt on INT1

     count_temp=3;

}

//call this routine to initialize all peripherals

void init_devices(void)

{

 //stop errant interrupts until set up

 CLI(); //disable all interrupts

 port_init();

 uart0_init();

 MCUCR = 0x0A;

 GICR  = 0xC0;

 TIMSK = 0x00; //timer interrupt sources

 SEI(); //re-enable interrupts

 //all peripherals are now initialized

}

//发送数据函数

void USART_TX(unsigned char data)

{

    while(!(UCSRA&(1<

 UDR=data;

}

//主函数

void main(void)

{

    init_devices();

 while(1)

 {

     cnt1=count_temp;

  USART_TX(cnt1);

  PORTB=led_dis;

 }

}


关键字:avr  单片机  双通信 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic480224.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:AVR单片机8路AD如何采样
下一篇:基于m128的LCD1602驱动(8线/4线)

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

AVR编程_如何通过软件复位AVR?
Question如何通过软件复位AVR?Answer如果你想通过软件复位AVR,你应该使用内部看门狗。简单的使能它和让它溢出。当看门狗触发后,程序计数器返回到0,清除所有的寄存器和其他正在执行的任务,这与将RESET脚拉低有同样的效果。你不应该处理: --用另一个AVR的引脚连接外部RESET引脚。在短暂的复位时间,AVR的引脚会三态失效,这会导致RESET无效。 --跳到程序地址0,跳到程序地址0,这不会清除全部的寄存器,所以你不会得到一个完整的“复位”。下列是每30mS复位一次AVR的例子代码(GCC):#include <avr/io.h>#include <avr/wdt.h>int main
发表于 2019-12-11
AVR(M48)的i2c程序,读写at24c02
//ICC-AVR application builder : 2007-12-5 17:34:01// Target : m48// Crystal: 1.0000Mhz#include <iom168v.h>#include <macros.h>#include <myfun.h>//#include <I2C.h>#define START 0x08#define ReSTART 0x10#define MT_SLA_ACK 0x18#define MT_DATA_ACK 0x28#define MR_SLA_ACK 0x40#define MR_DATA_ACK
发表于 2019-12-11
AVR ATMEGA8 串口USART
avr串口配置很简单,配置就几个寄存器就可以进收发;但有几点要搞明白的是:1、串口一但被配置成功IO功能自动被占用,这点与LPC或STM8/32不同(需要寄存配置);2、没有专门的串口开起或闭关功位(整个串口);3、读写控制寄存器C需要把URSEL位写成1,而读写UBRRH寄存器时须要URSEL写成0;   1: //晶振频率     2: #define F_CPU 6000000UL     3: //波特率     4: #define BAUD 9600  
发表于 2019-12-10
avr官方充电器
我主要做的是对LiIon电池进行充电,用到的主要是AVR的相位修正PWM和ADC,AVR--PWM分为三种:1.快速PWM模式--单斜边工作模式,计数器从BOTTOM到TOP,对于普通比较模式OCnx在TCNTn与OCRnx匹配时置位,在TOP时清零,PWM频率fpwm = fclk/(N(1+TOP)),N为分频系数。              2.相位修正PWM模式--双斜边工作模式, 计数器重复的从BOTTOM到TOP,然后又从TOP退到BOTTOM,一般工作模式下,往TOP计数时OCnx在TCNTn与OCRnx匹配时清零,往BOTTOM计数时置位,fpwm
发表于 2019-12-10
ubuntu下gcc-avr安装
ubuntu下研究arduino时发现,原来可以不用arduino IDE开发,linux下还有gcc-avr直接开发avr系列的控制器。于是,迫不及待的查看了下相关资料,总结一下安装gcc-avr的步骤。PS:感叹一下,现在ubuntu做得实在是太好用了,以前很费心的事情,现在都很简单了。1、更新下系统,并安装开发包。apt updateapt upgradeapt install build-essential2、安装gcc-avr的工具链。apt install gcc-avr avr-libc avrdude gdb-avr3、安装相关软件的帮助文档。apt install avrdude-doc gcc-doc
发表于 2019-12-10
打造最强Eclipse-嵌入式开发环境(AVR)
,所以当前MinGW是最好的选择,当然你也可以选择CodeBlocks、C-free等等以上安装都比较简单,在网上检索相关博客即可,需要注意的是要添加必要的系统环境变量。为此我使用批处理脚本做了一个插件,敬请期待我的其他博文。推荐其他相关博文:搭建Eclipse IDE AVR开发平台搭建AVR-C语言开发环境eclipse+winavreclipse 环境搭建_百度经验我将其分别安装在D:CODEMinGW   D:CODEeclipse-Luna目录下,这样便于管理我的Eclipse必备插件列表: AVR-Eclipse       辅助配置AVR项目  
发表于 2019-12-10
小广播
何立民专栏 单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved