⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hardware.c

📁 RS232+485+USB+nRF2401,该程序主要是nRF2401在各种通讯接口的应用
💻 C
字号:
/*

  项目: 人员定位:读卡器
  文件: hardware.c
  日期: 2007.09.12
  作者: 邵子扬
  说明: 硬件接口函数,实现底层硬件的接口,并重新封装,以适应程序的移植

*/

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>

#include "typedef.h"
#include "cfg.h"


//IO端口初始化
//设置IO口方向寄存器和初始值
void io_init(void)
{
  DDRB = (1 << LED)|(1 <<Plus)|(1 << CS)|(1 << MOSI)|(1 << SCK);
  DDRD = (1 << CE)|(1 << RS485TXEn);
  PORTD = (1 << CE)|(1 << DR1);
}

void tmr0delay(uint16 delay)
{
  while(delay > 0)
  {
    wdt_reset();
    delay--;
    TIFR0 = (1 << OCF0B)|(1 << OCF0A)|(1 << TOV0);
    TCCR0A = 0;
    TCCR0B = (1 << CS02)|(1 << CS00); //1024分频,8M时 1024* 8 / 8000000 约1毫秒
    TCNT0 = -8;
    while(!(TIFR0 & (1 << TOV0)))
      __asm__ __volatile__ ("nop");
  }
}

//初始化定时器
//设置定时器0工作模式
void timer_init(void)
{
  //定时器0
  TCCR0A = 0;
  TCCR0B = (1 << CS02)|(1 << CS00);//1024分频

  //定时器1:CTC模式
  TCCR1A = 0;
  TCCR1B = 0;//(1 << WGM12)|(1 << CS12)|(1 << CS10);//1024分频+CTC
  TCCR1C = 0;
  OCR1A = 20000;
  TIFR1 = (1 << ICF1)|(1 << OCF1B)|(1 << OCF1A)|(1 << TOV1);
  //TIMSK1 = (1 << OCIE1A);//允许定时器1比较中断

  //定时器2做软件RTC
  OCR2A = 249;
  TCCR2A = (1 << WGM21);//CTC模式2
  //TCCR2B = (1 << CS22)|(1 << CS21)|(1 << CS20);//1024分频
  TCCR2B = (1 << CS22)|(1 << CS21);             //256分频
  TIFR2 = (1 << OCF2B)|(1 << OCF2A)|(1 << TOV2);//清除中断标志
  TIMSK2 = (1 << OCIE2A);//允许CTC中断
}

//设置SPI为主模式,以及设置SPI时钟频率
void spi_init(void)
{
  SPCR = (1 << SPE)|(1 << MSTR)|(1 << SPR0);
  SPSR = 0;//(1 << SPI2X);
}

//读写SPI
uint8 spi_wr(uint8 dat)
{
  SPSR &= ~(1 << SPIF);
  SPDR = dat;
  while((SPSR & (1 << SPIF)) == 0);
  return SPDR;
}

//初始化中断相关参数,允许中断
void isr_init(void)
{
  EICRA = (1 << ISC11)|(1 << ISC10)|(1 << ISC01)|(1 << ISC00);//中断1上升沿触发
  EIFR = (1 << INTF1)|(1 << INTF0);
  EIMSK = (1 << INT1);
  PCICR = 0;
  sei();  //开中断
}

void uart_init(void)
{
  UBRRHREG(COMPORTNo) = BAUDREG/256;
  UBRRLREG(COMPORTNo) = BAUDREG%256;
  UCSRAREG(COMPORTNo) = 0;
  UCSRBREG(COMPORTNo) = (1 << RXCIEBIT(COMPORTNo)) | (1 << TXCIEBIT(COMPORTNo)) | (1 << RXENBIT(COMPORTNo))|(1 << TXENBIT(COMPORTNo));
  UCSRCREG(COMPORTNo) = USEURSEL|(1 << UCSZBIT(COMPORTNo, 1))|(1 << UCSZBIT(COMPORTNo, 0));
}

void uart_write(uint8 dat)
{
  UDRREG(COMPORTNo) = dat;
  //while(!(UCSRAREG(COMPORTNo) & (1<<TXCBIT(COMPORTNo))));
  //UCSRAREG(COMPORTNo) |= (1 << TXCBIT(COMPORTNo));
}

uint8 uart_read(void)
{
  return UDRREG(COMPORTNo);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -