久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5223|回復: 3
打印 上一主題 下一主題
收起左側

avr單片機雙通信C程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:1 發表于 2013-6-14 18:20 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
將下面2個程序分別燒錄進2個單片機中.
單片機U1
//ICC-AVR application builder : 2013-6-14 10:17:58
// Target : M16
// Crystal: 8.0000Mhz
#include <iom16v.h>
#include <macros.h>
#define LED1_ON PORTD|=(1<<PD4)
#define LED1_OFF PORTD&=~(1<<PD4)
#define LED2_ON PORTD|=(1<<PD5)
#define LED2_OFF PORTD&=~(1<<PD5)
//共陽極數碼管
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<<UDRE)));
  UDR=data;
}
//8M晶振頻率下的延時一毫秒
void delay(unsigned int k)
{
    unsigned int m,n;
 for(m=0;m<k;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 <iom16v.h>
#include <macros.h>
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<<UDRE)));
 UDR=data;
}
//主函數
void main(void)
{
    init_devices();
 while(1)
 {
     cnt1=count_temp;
  USART_TX(cnt1);
  PORTB=led_dis;
 }
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:84472 發表于 2015-7-27 17:20 | 只看該作者
大神:這個方案能做嗎?
硬件:
二套AVR電路板,每套電路板有一個AVR單片機,四位液晶顯示電路,一個蜂鳴報警電路,一個振動電路,二個遙控接收放大電路,一個電源指示電路,一個狀態指示燈電路,一個晶振電路,一個高電平復位電路,
編程要求:
二個遙控器交替按下,按下時間在0.3左右(0.25到0.35之間)A遙控器按下0.3左右停頓0.055秒左右B遙控器按下0.3左右停頓0.055秒左右,也就是說A遙控器不發送紅線信號到B遙控器發送紅外線信號的時間不能大于0.07秒(如0.071秒)蜂鳴器就報一下警,顯示器數字就加1。小于0.04秒振動器振動一下。
遙控器按下的時間0.3秒左右單片機不用管,單片機只控制A遙控器抬起到B遙控器按下的時間和B遙控器抬起到A遙控器按下的時間。
回復

使用道具 舉報

板凳
ID:84472 發表于 2015-7-27 17:24 | 只看該作者
476902250QQ.COM
回復

使用道具 舉報

地板
ID:84472 發表于 2015-8-11 20:51 | 只看該作者
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品欧美一区二区精品久久久 | 国产精品高潮呻吟久久久久 | 国产乱肥老妇国产一区二 | www国产成人免费观看视频,深夜成人网 | 国产精品日韩在线观看一区二区 | 国产一区二区三区久久久久久久久 | 亚洲欧美一区二区三区视频 | 国产目拍亚洲精品99久久精品 | 久久精品视频在线播放 | 精品国产乱码久久久久久a丨 | 精品国产一级片 | 欧美日韩国产一区二区三区 | 国产一区二区三区免费 | 日韩在线国产 | 综合久久久 | 日韩手机在线视频 | www成年人视频 | 中文字幕在线不卡播放 | 操操操操操 | 亚洲精品视频免费观看 | 国产专区免费 | 国产激情片在线观看 | 久久国产精品99久久久久久丝袜 | 亚洲精品一区中文字幕 | 亚洲欧美精品在线 | 国产农村妇女精品一区 | 久久久区 | 国产精品海角社区在线观看 | 人人干人人玩 | 91精品国产一区二区三区 | 九色在线 | 国产一级视频 | 国产高清视频一区 | 精品国产欧美 | 日本手机看片 | 国产一区二区在线观看视频 | 亚洲视频免费观看 | av网址在线 | 日韩在线精品视频 | 日韩h| 中文字幕一区二区三区乱码在线 |