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

📄 shizhong.c

📁 ds1302时钟芯片的用法,希望能给大家提供帮助!
💻 C
字号:
#include<reg52.h> //1脚电源,4脚地,8脚备用电源,2 3脚晶震,5脚复位,6脚i/0口,7脚时钟//
#define uchar unsigned char
#define uint unsigned int
void wrbyte(uchar byte);//写入1字节//
uchar readbyte(void);//读1字节//
void w1302(uchar addr,uchar da);//写1字节地址和写1字节数据//
uchar r1302(uchar addr);//读去1302某地址的数据//
void get1302(uchar curtime[]);//读取1302当前的时间//
void set1302(uchar *p);//写入1302设置时间//
void dis_scan(uchar buff[]);//数码管的扫描//
void ini_ds1302(void);//初始化1302//
void delay(uint k);//延时//
void scan_key(void);//键盘扫描//
void shanshuo(uchar mov_temp);//数码管闪烁//
uchar code seg7[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar timebuf[7]={0x03,0x38,0x10,0x03,0x04,0x02,0x07};//默认时间//
uchar led[16];//led 要显示的数字缓冲器//
sbit T_IO=P3^7;
sbit T_CLK=P3^6;
sbit T_RST=P3^5;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit P30=P3^0;//调时和调整//
sbit P31=P3^1;//led移动的闪烁//
sbit P32=P3^2;//加//
sbit P33=P3^3;//减//
uchar mov,cout;//移动的位置//led闪烁的计数//
bit K1,K2,K3,K4;//按键的标志位//

void main()
{
 P3=0xff;
 ini_ds1302();//初始化1302//
 get1302(timebuf);//读取现在的时间//
 while(1)
 {
  scan_key();//键盘扫描//
  if(K1==0){dis_scan(timebuf);mov=6;get1302(timebuf);}
  else shanshuo(mov);
 }
 }


void scan_key(void)//键盘扫描//
{
 if(P30==0){delay(5);
           if(P30==0){K1=!K1;//k1=0时正常//k1=1调时//
		   if(K1==0){w1302(0x8e,0x00);//wp=0允许写操作//
		             set1302(timebuf);//写入1302设置的时间//
					 w1302(0x8e,0x80);//WP=1,写保护//禁止写操作//
					 }
			  }
             while(P30==0);//等待暗键K1的释放//
			}
 if(K1==1)
 {if(P31==0&&K2==0){delay(5);if(P31==0)K2=1;}
  if(P32==0&&K3==0){delay(5);if(P32==0)K3=1;}
  if(P33==0&&K4==0){delay(5);if(P33==0)K4=1;}
 }

if(K2==1&&P31==1){K2=0;if(mov==0)mov=7;mov--;}//led闪烁的移动//
if(K3==1&&P32==1){K3=0;//调时加//
if((timebuf[mov]&0x0f)==9)timebuf[mov]+=6;
timebuf[mov]++;
if(timebuf[5]>0x07)timebuf[5]=0;//星期//
if(timebuf[4]>0x12)timebuf[4]=0;//月//
if(timebuf[3]>0x31)timebuf[3]=0;//日//
if(timebuf[2]>0x23)timebuf[2]=0;//时//
if(timebuf[1]>0x59)timebuf[1]=0;//分//
if(timebuf[0]>0x59)timebuf[0]=0;//秒//
}

if(K4==1&P33==1){K4=0;//调时减//
if((timebuf[mov]&0x0f==0))timebuf[mov]-=6;
timebuf[mov]--;
if(timebuf[5]==0)timebuf[5]=0x7+1;//星期//
if(timebuf[4]==0)timebuf[4]=0x12+1;//月//
if(timebuf[3]==0)timebuf[3]=0x31+1;//日//
if(timebuf[2]==0)timebuf[2]=0x12+1;//时//
if(timebuf[1]==0)timebuf[1]=0x59+1;//分//
if(timebuf[0]==0)timebuf[0]=0x59+1;//秒//
}
}


void shanshuo(uchar mov_temp)//数码管闪烁//
{
 uchar i;
 for(i=0;i<7;i++)
 {
  led[i*2]=timebuf[i]&0x0f;//取低四位/
  led[i*2+1]=(timebuf[i]&0xf0)>>4;//高四位//
  }
P2=0xff;
cout++;
if(cout<10){led[2*mov_temp]=10;led[2*mov_temp+1]=10;}//闪烁
if(cout>20)cout=0;//闪烁频率
for(i=0;i<14;i++)//14位扫描//
{
 P1=seg7[led[i]];
 P2++;
 delay(1);
 P1=0xff;
 }
 }

void dis_scan(uchar buff[])//数码管扫描//
{
 uchar i;
 for(i=0;i<7;i++)
 {
  led[i*2]=buff[i]&0x0f;
  led[i*2+1]=(buff[i]&0xf0)>>4;
  }
P2=0xff;
for(i=0;i<14;i++)
{
 P1=seg7[led[i]];
 P2++;
 delay(1);
 P1=0xff;
 }
 }

void delay(uint k)
{
 uint i,j;
 for(i=0;i<k;i++)
 {
  for(j=0;j<121;j++);
 }
 }


void wrbyte(uchar byte)//写入1字节//
{
 uchar i;
 ACC=byte;
 for(i=8;i>0;i--)
 {
  T_IO=ACC0;
  T_CLK=1;
  T_CLK=0;
  ACC=ACC>>1;
 }
 }


 uchar readbyte(void)//读1字节//
 {
  uchar i;
  for(i=8;i>0;i--)  {
   ACC=ACC>>1;
   ACC7=T_IO;
   T_CLK=1;
   T_CLK=0;
  }
 return(ACC);
 }

void w1302(uchar addr,uchar da)//写1字节地址和写1字节数据//
{
 T_RST=0;
 T_CLK=0;
 T_RST=1;
 wrbyte(addr);
 wrbyte(da);
 T_CLK=1;
 T_RST=0;
 }


uchar r1302(uchar addr)//读取1302某地址的数据//
{
 uchar da;
 T_RST=0;
 T_CLK=0;
 T_RST=1;
 wrbyte(addr);//地址//
 da=readbyte();//读1 BYTE 数据//   
 T_CLK=1;   
 T_RST=0;
 return(da);
 }


void set1302(uchar *p)//写入1302设置的时间 
{
 uchar i;
 uchar addr=0x80;//设置时间的地址
 w1302(0x8e,0x00);//WP=0,允许写操作
 for(i=0;i<7;i++)
 {
  w1302(addr,*p);
  P2++;
  addr+=2;
 }
 w1302(0x8e,0x80);//WP=1,写保护//禁止写操作/
 }


void get1302(uchar curtime[])//读取1302当前时间
{
 uchar i;
 uchar addr=0x81;
 for(i=0;i<7;i++)
 {
  curtime[i]=r1302(addr);
  addr+=2;
 }
 }

void ini_ds1302(void)
{
 w1302(0x8e,0x00);
 w1302(0x90,0x00);
 T_CLK=0;
 T_RST=0;
 }

⌨️ 快捷键说明

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