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

📄 1302.c

📁 实时时钟1302准确度高
💻 C
字号:

#include <iom16v.h>
#include <macros.h>
//#define ds1302_rst PC0 
//#define ds1302_io PC1
//#define ds1302_sclk PC6 
#define set_ds1302_rst_ddr() DDRC|=0x01
#define set_ds1302_rst() PORTC|=0x01
#define clr_ds1302_rst() PORTC&=~0x01 
#define set_ds1302_io_ddr() DDRC|=0x80 
#define set_ds1302_io() PORTC|=0x80 
#define clr_ds1302_io() PORTC&=~0x80 
#define clr_ds1302_io_ddr() DDRC&=~0x80 
#define in_ds1302_io() PINC&0x80 
#define set_ds1302_sclk_ddr() DDRC|=0x40
#define set_ds1302_sclk() PORTC|=0x40
#define clr_ds1302_sclk() PORTC&=~0x40 
#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 
#define uchar unsigned char
#define uint  unsigned int
#define clk0 PORTB|=0x02//时钟宏定义port2接clk
#define clk1 PORTB&=~0x02
#define data1 PORTB|=0x01//数字宏定义port1接data
#define data0 PORTB&=~0x01

uchar table[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};//数字编码
uchar table1[10]={0x02,0x9e,0x24,0x0c,0x98,0x48,0x40,0x1e,0x00,0x08};//带点编码
uchar pata[4]={0,0,0,0};//显存
uchar year,month,day,week,hour,minute,second;

void delay(uint n)//10us延时函数
{
    uint i,j;
    for(i=0;i<n;i++)
    {
        ;
      //for(j=0;j<1000;j++){;}
    }
}

void delay_ms(uint n)//10us延时函数
{
    uint 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 display(uchar p[]) //数字显示程序...不含显示小数点且不累集
{
 uint i,j;
 for(j=0;j<4;j++)
     {for(i=0;i<8;i++)//八位全部显示完毕
	  {
		  if(p[j]&0x01)
		    data1;
		  else
		    data0;
	        clk0;//产生时钟脉冲
		    clk1;
		p[j]=p[j]>>1;//右移以便取下一位
	  }
     }
}

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];
 }	

void port_init(void)
{
 PORTA = 0x00;
 DDRA  = 0x00;
 PORTB = 0x00;
 DDRB  = 0x00;
 PORTC = 0x00; //m103 output only
 DDRC  = 0x00;
 PORTD = 0x00;
 DDRD  = 0x00;
}



void ds1302_write(uchar reg,uchar data) 
{ 
   uchar i=0; 
   set_ds1302_io_ddr(); //输出
  // asm("nop");
  // asm("nop");
   clr_ds1302_rst(); //为邻近之操作
  // asm("nop");
   //asm("nop");
   clr_ds1302_sclk(); 
   asm("nop");
   asm("nop");
   set_ds1302_rst(); //唯一允许
   asm("nop");
   asm("nop");
 for(i=8;i>0;i--)    //先写寄存器
{ 
   if(reg&0x01) 
      set_ds1302_io(); 
   else
      clr_ds1302_io(); 
    asm("nop");
     asm("nop");
  
   set_ds1302_sclk(); //时钟下降元输入数据
   asm("nop");
   asm("nop");
   clr_ds1302_sclk();  
   asm("nop");
   asm("nop");
   reg>>=1; 
} 
   asm("nop");
  // asm("nop");
  for(i=8;i>0;i--) //再写数据
{ 
   if(data&0x01) 
      set_ds1302_io(); 
   else 
      clr_ds1302_io(); 
     asm("nop");
     asm("nop");
     set_ds1302_sclk(); 
   asm("nop");
   asm("nop");
     clr_ds1302_sclk();
    asm("nop");
    asm("nop");
     data>>=1; 
} 
    asm("nop");
   clr_ds1302_rst(); 
    asm("nop");
    asm("nop");
  // clr_ds1302_io_ddr(); //调用写完毕,转入读
  // asm("nop");
  // asm("nop");
} 
uchar ds1302_read(uchar reg) 
{ 
    uchar data=0; 
    uchar i=0; 
    reg+=1;//读标志 
    set_ds1302_io_ddr(); 
    asm("nop");
    asm("nop");
    clr_ds1302_rst(); 
    asm("nop");
    asm("nop");
    clr_ds1302_sclk(); 
    asm("nop");
    asm("nop");
    set_ds1302_rst(); 
    asm("nop");
    asm("nop");
for(i=8;i>0;i--) 
{ 

if(reg&0x01) 
    set_ds1302_io(); 
else 
   clr_ds1302_io(); 
   asm("nop");
   asm("nop");
set_ds1302_sclk(); 
   asm("nop");
   asm("nop");
if(i>1)
 {
  clr_ds1302_sclk(); //这个循环确保第八个周期的下降元开始正确读书
   asm("nop");
   asm("nop");
 }
else
   asm("nop");
   asm("nop");
reg>>=1; 
} 
   clr_ds1302_io_ddr(); 
   asm("nop");
   asm("nop");
   
 
for(i=8;i>0;i--) 
{ 
data>>=1; 
asm("nop");
clr_ds1302_sclk(); ////it'ok now!!!!,是始终下降延给出数据
asm("nop");//必须延时以便于pinc读入
if(in_ds1302_io()) 
     data|=0x80; 
   asm("nop");
   asm("nop");
   
set_ds1302_sclk(); 
   asm("nop");
   asm("nop");
} 
clr_ds1302_rst(); 
   asm("nop");
   asm("nop");
return(data); 
} 

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

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); //打开写保护 
} 

void init_time(void)
 {
  // uchar year,month,day,week,hour,minute,second;
   year=0x07;
   month=0x07;
   day=0x20;
   week=0x01;
   hour=0x11;
   minute=0x44;
   second=0x00;
 }
void main(void)
{
   
 //  uchar riqi[7]={0,0,0,0,0,0,0};//存放日期值
   uchar t;//t验证是否为写保护,1无,0有
   port_init();
   set_ds1302_io_ddr(); 
   clr_ds1302_rst(); 
   delay_ms(300);
   DDRC=0xff;
   DDRB=0xff;
   PORTB=0x00;
  
   init_time();
   ds1302_write_time();
   while(1)
   {
     // minute=ds1302_read(ds1302_year_reg); //分 
      second=ds1302_read(ds1302_sec_reg); //秒 
	 // convert_riqi(0x00,minute);
	
      neirong1(second);
	 // neirong1(minute);
	  display(pata);
	  delay(100);
   }
}	       

⌨️ 快捷键说明

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