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

📄 8025.c

📁 AVR ATMEGA128单片机对RX8025进行读写的模拟时序
💻 C
字号:
//ICC-AVR application builder : 2008-11-16 18:42:49
// Target : M128
// Crystal: 6.0000Mhz

#include <iom128v.h>
#include <macros.h>

int time1s=0;              //1s定时
unsigned char S1BZ=0;      //1s标志
//---------------------------------------------------------------------------
unsigned char TWIBUSY=0;  //TWI忙标志
unsigned char RTC_W_R=1;  //RTC_W_R=1表示读RX_8025,RTC_W_R=0表示写RX_8025
unsigned char TWI_BUF_W[11]={
   0x64,0xE0,0x20,0x20,0x40,0x57,0x23,0x04,0x31,0x05,0x08}; //实时时钟写缓冲区
/*{SLA+W,从寄存器E开始写,控制字1,控制字2,秒,分,时,星期,日,月,年}*/
unsigned char TWI_BUF_R[10]={0x64,0x00,0x65}; //实时时钟读缓冲区
unsigned char twi_cmd_counter=1; //twi 命令计数器
unsigned char twi_dat_counter=1; //twi 数据计数器
unsigned char twi_buf_ptr=0;     //实时时钟数据缓冲区指针
unsigned char twi_stp=1;         //twi步骤计数
unsigned char twi_buf_num=0;     //实时时钟缓冲区大小
unsigned char data_time[12]={1,2,3,4,5,6,7,8,9,0,2,3};        //日期时间显示缓冲区

void port_init(void)
{
 PORTA = 0xFF;      //端口A用于指示灯,输出,初始值全为1
 DDRA  = 0xFF;
 PORTB = 0xFF;     //PB0~PB3用于SPI,PB0为ATT7022B的片选信号;PB4用于指示灯
 DDRB  = 0xF7;     //PB5控制蜂鸣器,PB6作为AT45DB161D的片选,PB7控制2576 
 PORTC = 0x00;     //和液晶屏数据位相连接
 DDRC  = 0xFF;     //初始化为输出
 PORTD = 0xC0;     //PD0~1用于I2C,PD2~3用于GTM900,PD4~5悬空,
 DDRD  = 0xC0;     //PD6-CS1液晶屏左半屏片选,PD7-CS2液晶屏右半屏片选,初始化为输出
 PORTE = 0xFC;     //PE0~1用于MAX232,品;PE2~6用于键盘,初始化为输入
 DDRE  = 0x03;     //PE7-PFO 接MAX705(电源故障输出),初始化为输入
 PORTF = 0x08;     //PF0~2悬空,PF3接AT45DB161D RDY信号,输入
 DDRF  = 0xF7;     //PF4~7用于JTAG
 PORTG = 0x0F;     //PG0-RS,PG1-R/W.PG2-E,PG3-WDI(For MAX705,监视电压跟踪输入)
 DDRG  = 0x1F;     //PG0~3配置为输出,PG4悬空
}


//TIMER0 initialize - prescale:64
// WGM: Normal
// desired value: 1mSec
// actual value:  1.000mSec (0.0%)
void timer0_init(void)               //定时器0初始化
{
 TCCR0 = 0x00; //stop
 ASSR  = 0x00; //set async mode
 TCNT0 = 0x45; //set count
 OCR0  = 0xBB;
 TCCR0 = 0x03; //start timer
}

//定时器0中断服务程序
#pragma interrupt_handler timer0_ovf_isr:17
void timer0_ovf_isr(void)
{
 TCNT0 = 0x45; //reload counter value
 if(time1s<1000)
 {
 time1s++;
 }
 else
     {
        S1BZ=1;    //1秒标志用于实时时钟的读写
        time1s=0;     
     }
}
//******************************时间处理函数开始*******************************
void data_time_process(void)   //日期和时间数据的转换处理
{                          //把时间和日期的个位和十位分别转化成一个字节,方便显示
  int i,j=3,k=11,a,b;
  for(i=0;i<6;i++)
  {
    a=TWI_BUF_R[j];
    b=TWI_BUF_R[j];
    j++;
    if (j==6)
      { 
       j++;
      } 
    a&=0x0F;  //低位
    b=b>>4;   //高位
    data_time[k]=a;
    k--;
    data_time[k]=b;
    k--;
  }
}

void twi_twrite(void)   //实时时钟的写
{
 TWIBUSY=1;//忙标志置1
 RTC_W_R=0;//写RX_8025
 TWCR=0xA5;//启动twi 
 do
   {
   }
 while(TWIBUSY==1);
 return;
}

//实时时钟的读
void twi_tread(void)
{
 TWIBUSY=1;//忙标志置1
 RTC_W_R=1;//读RX_8025
 TWCR= 0xA5;//启动twi  
 do
   {
   }
 while(TWIBUSY==1);
 data_time_process();   //日期和时间数据的转换处理
 return;   
}

//*************************************
 
//TWI 初始化   比特率为16  1分频  传输频率为333.33KHZ
//TWCR控制字(TWINT TWEA TWSTA TWSTO    TWWC TWEN - TWIE) 
void twi_init(void)
{
 TWCR= 0X00; //禁止TWI
 TWBR= 0x10; //比特率发生器分频因子为16
 TWSR= 0x00; //set prescale预分频因子值为1
 TWAR= 0x00; //set slave address
 TWCR= 0x45; //使能TWI
}
//*******************************************
//实时时钟初始化:08年05月8号周4,00时43分0秒,使用24时制,
//实时时钟的连续写数据初始化(根据初始化时格式)
//用户要对twi_t_w[]填所要写入的数据,具体格式见初始化格式
//twi_js=2+n数据个数加控制字个数 
void rtc_w_ini(void)
          {
           RTC_W_R=0;//实时时钟

⌨️ 快捷键说明

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