📄 tiaohaoledeatera_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 + -