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

📄 tiaohaoledeatera_1302.c

📁 该程序为niosII环境下的1302编程可以直接应用
💻 C
字号:
#include "altera_avalon_timer_regs.h"
#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"
#include "sys/alt_irq.h"
#include <stdio.h>
#include <string.h>
#include <io.h> 
#include <unistd.h> 
#include <ledzm.h>
#include <zxxleddriver.h> 
#include "altera_avalon_uart_regs.h"
#define uchar unsigned char 
#define uint  unsigned int 
#define set_ds1302_rst()  IOWR_ALTERA_AVALON_PIO_DATA(DS_1302_CE_BASE,1)
#define clr_ds1302_rst()  IOWR_ALTERA_AVALON_PIO_DATA(DS_1302_CE_BASE,0)
#define set_ds1302_io_ddr()  IOWR_ALTERA_AVALON_PIO_DIRECTION(DS_1302_IO_BASE,1)
#define set_ds1302_io()  IOWR_ALTERA_AVALON_PIO_DATA(DS_1302_IO_BASE,1)
#define clr_ds1302_io()  IOWR_ALTERA_AVALON_PIO_DATA(DS_1302_IO_BASE,0)
#define clr_ds1302_io_ddr() IOWR_ALTERA_AVALON_PIO_DIRECTION(DS_1302_IO_BASE,0)
#define in_ds1302_io() IORD_ALTERA_AVALON_PIO_DATA(DS_1302_IO_BASE)
#define set_ds1302_sclk() IOWR_ALTERA_AVALON_PIO_DATA(DS_1302_CLK_BASE,1)
#define clr_ds1302_sclk() IOWR_ALTERA_AVALON_PIO_DATA(DS_1302_CLK_BASE,0)
#define ds1302_sec_reg 0x80 //???,?????????
#define ds1302_min_reg 0x82 
#define ds1302_hr_reg 0x84 
#define ds1302_date_reg 0x86 
#define ds1302_month_reg 0x88 
#define ds1302_day_reg 0x8a 
#define ds1302_year_reg 0x8c 
#define ds1302_control_reg 0x8e 
#define ds1302_charger_reg 0x90 
#define ds1302_clkburst_reg 0xbe 

unsigned char year,month,day,week,hour,minute,second;

volatile int done_status1;
unsigned char disram[hang][lie];
unsigned char disram1[hang][lie];
unsigned char disram2[hang][lie];
unsigned char disram3[hang][lie];
unsigned char disram4[hang][lie];
unsigned char disram5[hang][lie];
unsigned char disram6[hang][lie];

unsigned char disramv[hang][lie];
unsigned char rambuffer[hang][lie];
unsigned char buffer_r[hang][lie];
unsigned char buffer_g[hang][lie];
unsigned char misdisram[16][128];
unsigned char hzbuffer8[16][128];
unsigned char hzbuffer82[16][128];
unsigned char hzbuffer83[16][128];
unsigned char uart_byte1,uart_byte;
unsigned char dataram[2];
unsigned char stringram[100],RxBufH[4];
 int ge,shi,shifen,baifen;
int rxhead = 0;
int rxtail = 0;
int bytenums = 0;
int frameindex=0;
volatile int done_status2,uartnum;
unsigned int bytelengh,startrec;
unsigned char ch,p,sum;
static void handle_uart_interrupt(void* context,alt_u32 id)
{
    //unsigned char m1;
    int node1=0;
   IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0x3);
    volatile int* irq_capture_ptr = (volatile int*) context;
    *irq_capture_ptr=(IORD_ALTERA_AVALON_UART_STATUS(UART_485_BASE) & 0x80);
    uart_byte=IORD_ALTERA_AVALON_UART_RXDATA(UART_485_BASE);   
    IOWR_ALTERA_AVALON_UART_STATUS(UART_485_BASE,0);
  
  
  
 
     ch  = uart_byte;
       
   
     RxBufH[3]=RxBufH[2];
        RxBufH[2]=RxBufH[1];
           RxBufH[1]=RxBufH[0];  
            RxBufH[0]=ch;
     
     if(RxBufH[3]=='@' &&  RxBufH[2]==':' && RxBufH[1]=='>' && RxBufH[0]=='>' )                        
     {      
           p=4;         //  指针复位
           sum=0;  //校验和复位
           stringram[0]='@';
           stringram[1]=':';
           stringram[2]='>';
           stringram[3]='>';
       
     }
     
    else    
     {
          
        stringram[p]=ch;           
      
      if(p>=12)//数据开始 
      {
          sum=sum+ch;     
      }     
    
      if(p==27)//&& sum==stringram[6])  //接收数据正确,准备写到FlashData上
      {  node1=(stringram[4]-48)*10+(stringram[5]-48);    
         if(node1==91)
           {startrec=1;}
      }
     
       p++; if(p>=100)p=0;//接受缓冲区指针
     
     }              
  IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0x0);
}

static void init_uart_irq()
{
 void* irq_capture_ptr = (void*) &done_status1;
 IOWR_ALTERA_AVALON_UART_CONTROL(UART_485_BASE,0x80);
 IOWR_ALTERA_AVALON_UART_STATUS(UART_485_BASE,0);
 alt_irq_register(UART_485_IRQ,irq_capture_ptr,handle_uart_interrupt);
 
}
static void handle_timer_interrupt(void* context,alt_u32 id)
{
 int i,j;
 volatile int* irq_capture_ptr = (volatile int*) context;
 * irq_capture_ptr=IORD_ALTERA_AVALON_TIMER_STATUS(HIGH_RES_TIMER_BASE);
 
 
  IOWR_ALTERA_AVALON_TIMER_STATUS(HIGH_RES_TIMER_BASE,0);
}
static void init_timer_irq()
{
 void* irq_capture_ptr = (void*) &done_status2;
 IOWR_ALTERA_AVALON_TIMER_PERIODL(HIGH_RES_TIMER_BASE, 0x4120);
 IOWR_ALTERA_AVALON_TIMER_PERIODH(HIGH_RES_TIMER_BASE, 0xd);
 IOWR_ALTERA_AVALON_TIMER_CONTROL(HIGH_RES_TIMER_BASE, 0x7);
 IOWR_ALTERA_AVALON_TIMER_STATUS(HIGH_RES_TIMER_BASE,0);
 alt_irq_register(HIGH_RES_TIMER_IRQ,irq_capture_ptr,handle_timer_interrupt);
}

static void reset_ds18b20(void)//?????????????
{
       IOWR_ALTERA_AVALON_PIO_DIRECTION(CHUAN_BASE,1);
      IOWR_ALTERA_AVALON_PIO_DATA(CHUAN_BASE,0);//?????
         usleep(2500);//??
      IOWR_ALTERA_AVALON_PIO_DATA(CHUAN_BASE,1);//?????
         usleep(150);
}
    
     
//ds18????????
static unsigned char ds18_read(void)
 {
     unsigned char i,byte,temp;
       byte=0x00;temp=0x00;
       IOWR_ALTERA_AVALON_PIO_DIRECTION(CHUAN_BASE,1);
   for(i=0;i<8;i++)
       {
         // IOWR_ALTERA_AVALON_PIO_DIRECTION(CHUAN_BASE,1);
          IOWR_ALTERA_AVALON_PIO_DATA(CHUAN_BASE,0);//?????
        //  usleep(1);
             i=i;
           
          IOWR_ALTERA_AVALON_PIO_DATA(CHUAN_BASE,1);//?????
           //     usleep(2);
             
           // usleep(4);
          IOWR_ALTERA_AVALON_PIO_DIRECTION(CHUAN_BASE,0);
          temp=IORD_ALTERA_AVALON_PIO_DATA(CHUAN_BASE);//??   
          IOWR_ALTERA_AVALON_PIO_DIRECTION(CHUAN_BASE,1);
                 temp=(temp&1);
         if(temp!=0)
            byte|=0x80;
         if(i<7)
            byte=byte>>1;
         //  usleep(1);
         // i=i;
       }
    return byte;
 }

//?rom????????????

static void ds18_write(uchar cmd)
{

   uchar i,j;
    IOWR_ALTERA_AVALON_PIO_DIRECTION(CHUAN_BASE,1);
   for(j=0;j<=7;j++)
      {
        i=cmd&0x01;
       
    if(i==0x01)
      {
        IOWR_ALTERA_AVALON_PIO_DATA(CHUAN_BASE,0);//?????
            //  usleep(20);
           // i=i;i=i;
            usleep(2);
        IOWR_ALTERA_AVALON_PIO_DATA(CHUAN_BASE,1);//?????  
              usleep(40);
       }
     else
       {
           IOWR_ALTERA_AVALON_PIO_DATA(CHUAN_BASE,0);//?????
                  usleep(45);
           IOWR_ALTERA_AVALON_PIO_DATA(CHUAN_BASE,1);//??gao??
                  asm("nop");asm("nop");
              // i=i; i=i; i=i;
      }
      
    cmd=cmd>>1;
   // j=j;
    
       }
}

static void delay_us(unsigned int n)//10us????
{
   unsigned int i,j;
    for(i=0;i<n;i++)
    {
        ;
         }
}

static void delay_ms(unsigned int n)//10us????
{
   unsigned int i,j;
    for(i=0;i<n;i++)
    {
        
      for(j=0;j<1000;j++){;}
    }
}

/*void neirong1(int n)//??????????
{
   uint ge,shi,bai,qian;
   ge=n%10;//?n?????
   shi=n/10%10;//??
   bai=n/100%10;//??
   qian=n/1000;//?? 
   pata[0]=table[ge];//??????????
   pata[1]=table[shi];
   pata[2]=table[bai];
   pata[3]=table[qian];
}

void convert_dianya(float adc)
 {
     float temp;//??????
     float xiaoshu;//??
     int zhenshu,t1;//t?????????????
    // temp=adc*5.03/1024.0;//?????
     temp=adc;
     zhenshu=(int)temp;//?????
     xiaoshu=temp-zhenshu;
     t1=xiaoshu*100;//????????
     pata[3]=table[zhenshu/10];
     pata[2]=table1[zhenshu%10];
     pata[1]=table[t1/10];
     pata[0]=table[t1%10];
 } 
 
void convert_riqi(uchar fen,uchar miao) 
 {
    uchar fen1,miao1;
  uchar t1,t2,t3,t4;
  fen1=fen;miao1=miao;
  t1=(fen1>>4)&0x07;
  t2=(miao1>>4);//&0x07;
  t3=(fen&0x0f);
  t4=(miao&0x0f);
  pata[3]=table[t1];
  pata[2]=table1[t3];
  pata[1]=table[t2];
  pata[0]=table[t4];
 }
*/


static void ds1302_write(unsigned char reg,unsigned char data) 
{ 
  unsigned char i=0; 
   set_ds1302_io_ddr(); 
   clr_ds1302_rst(); //??????
   asm("nop");
   clr_ds1302_sclk(); 
    asm("nop");
    usleep(1);
   set_ds1302_rst(); //????
    usleep(1);
 for(i=8;i>0;i--)    //?????
{ 
   if(reg&0x01) 
      set_ds1302_io(); 
   else
      clr_ds1302_io(); 
    usleep(1);
  
   set_ds1302_sclk(); //?????????
   usleep(1);
   clr_ds1302_sclk();  
   usleep(1);
   reg>>=1; 
} 
    usleep(1);
  for(i=8;i>0;i--) //????
{ 
   if(data&0x01) 
      set_ds1302_io(); 
   else 
      clr_ds1302_io(); 
        usleep(1);
     set_ds1302_sclk(); 
        usleep(1);
     clr_ds1302_sclk();
         usleep(1);
     data>>=1; 
} 
    usleep(1);
   clr_ds1302_rst(); 
  
     usleep(1);
} 

unsigned char ds1302_read(unsigned char reg) 
{ 
   unsigned char data=0; 
    unsigned char i=0; 
     unsigned char j=0;
    reg+=1;//??? 
    set_ds1302_io_ddr(); 
    usleep(1);
    clr_ds1302_rst(); 
   asm("nop");
   usleep(1);
    clr_ds1302_sclk(); 
   usleep(1);
    set_ds1302_rst(); 
    usleep(1);
for(i=8;i>0;i--) 
{ 

if(reg&0x01) 
    set_ds1302_io(); 
else 
   clr_ds1302_io(); 
   usleep(1);
set_ds1302_sclk(); 
   usleep(1);
if(i>1)
 {
  clr_ds1302_sclk(); //?????????????????????
    usleep(1);
 }
else
  usleep(1);
reg>>=1; 
} 
   clr_ds1302_io_ddr(); 
   usleep(4);
for(i=8;i>0;i--) 
{ 
data>>=1; 
 asm("nop");//usleep(1);
clr_ds1302_sclk(); ////it'ok now!!!!???????????
 asm("nop");asm("nop");asm("nop");//usleep(1);////???????pinc??
 j=in_ds1302_io();
if(j) 
     data|=0x80; 
  usleep(1);
   
set_ds1302_sclk(); 
  usleep(1);
} 
clr_ds1302_rst(); 
  usleep(1);
return(data); 
} 



void ds1302_read_time(void) 
{ 
year=ds1302_read(ds1302_year_reg); //? 
month=ds1302_read(ds1302_month_reg);//? 
day=ds1302_read(ds1302_date_reg); //? 
week=ds1302_read(ds1302_day_reg); //? 
hour=ds1302_read(ds1302_hr_reg); //? 
minute=ds1302_read(ds1302_min_reg); //? 
second=ds1302_read(ds1302_sec_reg); //? 
} 
void ds1302_write_time(void) 
{ 
ds1302_write(ds1302_control_reg,0x00); //????? 
ds1302_write(ds1302_sec_reg,0x80); //?? 
ds1302_write(ds1302_charger_reg,0xf0); //????? 
ds1302_write(ds1302_year_reg,year); //? 
ds1302_write(ds1302_month_reg,month); //? 
ds1302_write(ds1302_date_reg,day); //? 
ds1302_write(ds1302_day_reg,week); //? 
ds1302_write(ds1302_hr_reg,hour); //? 
ds1302_write(ds1302_min_reg,minute); //? 
ds1302_write(ds1302_sec_reg,second); //? 
//ds1302_write(ds1302_sec_reg,0x00);
ds1302_write(ds1302_control_reg,0x80); //????? 
} 


uchar check_ds1302(void) 
{ 
   ds1302_write(ds1302_control_reg,0x80); 
   if(ds1302_read(ds1302_control_reg)==0x80) 
       return 1; 
   else
       return 0; 
} 

void init_time(uchar year1,uchar month1,uchar day1,uchar week1,uchar hour1,uchar minute1,uchar second1)
 {
  // uchar year,month,day,week,hour,minute,second;
   year=year1;
   month=month1;
   day=day1;
   week=week1;
   hour=hour1;
   minute=minute1;
   second=second1;
 }

/*static void convert_dianya(float adc)//????
 {
     float temp;//??????
     float xiaoshu;//??
     int zhenshu,t1;//t?????????????
     temp=adc;
     zhenshu=(int)temp;//?????
     xiaoshu=temp-zhenshu;
     t1=xiaoshu*100;//????????
     shi=zhenshu/10;
     ge=zhenshu%10;
     shifen=t1/10;
     baifen=t1%10;
 } */
  
int main() 
{
    int i,j,k;
    uchar t;//t??????????
    unsigned char bufferzm[16][128]={0};
    unsigned char sysbuffer[hang][lie]={0};
    unsigned int judge=0;
    unsigned char ds18[9]={0,0,0,0,0,0,0,0,0};
    unsigned int ds18_temp=0;//?????
    clr_ds1302_rst(); //????????
    delay_ms(300);
    init_time(0x07,0x07,0x21,0x05,0x05,0x33,0x00);//?????
    ds1302_write_time();
    for(i=0;i<64;i++)//??????
     for(j=0;j<128;j++)
        {
            sysbuffer[i][j]=0x01;
        }
        
  while(1)
  {
      
       
      /*   reset_ds18b20();
         ds18_write(0xcc);//????
         ds18_write(0x44);// ????     
         usleep(800000);//????
         reset_ds18b20();
         ds18_write(0xcc);
       
         ds18_write(0xbe);//???????
         for(i=0;i<9;i++)
          { 
             ds18[i]=ds18_read(); 
             // i=i;//  usleep(1);
           } 
           ds18_temp=ds18[5];
       //  ds18_temp=ds18_temp&0x00ff;
       //  ds18_temp=(ds18_temp<<8)+ds18[0];  
         t=ds18_temp*0.0625;
         convert_dianya(t);  */
         t=ds1302_read(ds1302_min_reg);
        
         for(i=0;i<10;i++)
            {
              display_ascx(0,0,bufferzm,t+48);//?48????????
              display_ascx(0,16,bufferzm,t+48);
              display_ascx(0,32,bufferzm,t+48);
              display_ascx(0,48,bufferzm,t+48);
              writebuffer( 16,16,16,128,bufferzm,sysbuffer);
              disledping(sysbuffer);
            }
         usleep(1600);
   }
 
   
    

}


  

⌨️ 快捷键说明

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