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

📄 8.c

📁 最简单的例子
💻 C
字号:
#include <reg51.h>
#include <stdio.h>
sbit P00 = P0 ^ 0; 
 sbit P01 = P0 ^ 1; 
 sbit P02 = P0 ^ 2; 
 sbit P03 = P0 ^ 3; 
 //sbit ACC1=ACC^1;
 sbit P17 = P1 ^ 7; 
//#include <REGX51.H>
typedef unsigned char uchar;
typedef unsigned int  uint;
//定义DS1302引脚
//sbit    TIME_CLK=P1^4;
//sbit    TIME_IO =P1^5;
//sbit    TIME_RST=P1^6;
sbit   DS_CLK =   P1^1;            //定义DS1302 时钟输入端口
sbit   DS_DAT =   P1^0;            //定义DS1302 串行数据输入输出端口(双向)
sbit   DS_RST =   P1^2;            //定义DS1302 复位/片选端口
 void delay(int m)   //延时程序,延时m*0.5毫秒 
 { 
   unsigned int i; 
   unsigned int j; 
 
   for (i = 0; i < m; i++) 
   { 

     for (j = 0; j < 500; j++){} 
   } 
 } 
//uchar code led[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
//uchar code tab[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0XBF,0X7F};
int DATA_LED[11] = 
 { 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

void led(int n) 
     //数码管显示及数据处理程序 
 { 
   P2 = 0xFF; 
   P2 = DATA_LED[n % 10];  //个位 
   P00 = 0; 
   delay(1); 
   P00 = 1; 
  
   P2 = 0xFF; 
   P2 = DATA_LED[n / 10 % 10];  //十位 
   P01 = 0; 
   delay(1); 
   P01 = 1; 

   P2 = 0xFF; 
   P2 = DATA_LED[n / 100 % 10];   //百位 
   P02 = 0; 
   delay(1);
   P02 = 1; 
  
   P2 = 0xFF; 
   P2 = DATA_LED[n / 1000 % 10];   //千位 
   P03 = 0; 
   delay(1); 
   P03 = 1; 
 } 


uchar led_buf[8];               /*定义LED显示缓冲区*/
uchar DS1302Read(uchar address);
void  DS1302Write(uchar address,uchar number);
//extern void config();

//void stop_1302(void)     //停止1302时钟 
 //{
 // uchar i;
  //i = DS1302Read(0x80);
  //i |= 0x80;
 // DS1302Write(0x80,i);
 //}
                         //启动1302时钟  
 void start_1302(void)
 {
  uchar i;
  i = DS1302Read(0x80);
  i &= 0x7f;
  DS1302Write(0x80,i);
 }



/********************************************************
函数名称:DS1302单字节写函数
功能描述:读取某一地址的数据
全局变量:无
参数说明:address为地址变量;number为所送的数据
返回说明:返回指定地址的数据
设 计 人:ZHCE
版    本:1.0
说    明:
********************************************************/
uchar DS1302Read(uchar address)
{
  uchar i;
  DS_CLK=0;                                             //	复位各脚
  DS_DAT=0;
  DS_RST=0;
  DS_RST=1;                                             //	允许读写数据
  for (i=8;i>0;i--)                                     //	地址输入,8位
 {
    DS_CLK=0;                                         	//	上升沿数据输入
    DS_DAT=address&0x01;                               	//	送出一位数据
    address>>=1;                                       	//	右移一位
    DS_CLK=1;                                           //	上升沿
 }
  
  for (i=8;i>0;i--)                                    	//	数据读出
  {
   	DS_CLK=0;                                          	//	下降沿数据读出
    address>>=1;                                    	//	把数据右移
    if (DS_DAT)     
    address=address|0x80;      		//	读取数据
    DS_CLK=1;                                          
    DS_CLK=0;//
  }
                                                        
  DS_CLK=1;                                             //	时钟置高位
  DS_RST=0;                                             //	片选无效
  return(address);
}
/********************************************************
函数名称:DS1302单字节写函数
功能描述:读取某一地址的数据
全局变量:无
参数说明:address为地址变量;number为所送的数据
返回说明:返回指定地址的数据
设 计 人:ZHCE
版    本:1.0
说    明:
********************************************************/
void DS1302Write(uchar address,uchar number)
{
  uchar i;
  DS_CLK=0;
  DS_DAT=0;
  DS_RST=0;
  DS_RST=1;
  /*地址输入*/
  for (i=16;i>0;i--)
  {
    DS_CLK=0;
    if (i>8)
     {
       DS_DAT=address&0x01;
       address=address>>1;
     }
     else
     {
       DS_DAT=number&0x01;
       number>>=1;
     }
    DS_CLK=1;
  }

  DS_CLK=1;
  DS_RST=0;
}


void v_Set1302(uchar *pSecDa) 
{
uchar i;
uchar ucAddr = 0x80; 
DS1302Write(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
DS1302Write(0x82,0x59);
DS1302Write(0x84,0x10); //时
//for(i =7;i>0;i--)
//{ 
//DS1302Write(ucAddr,*pSecDa); /* 秒 分 时 日 月 星期 年 */

//pSecDa++;
//ucAddr +=2;
//}
DS1302Write(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
}




main()
{ uint s;                                       // 循环计数器
uint k; 
EA=1;
//v_Set1302(0x83); 
 
 






start_1302();
 if ((DS1302Read(0x83)==0x00)&(DS1302Read(0x81)==0x00))
{
  
 DS1302Write(0x8E,0x00);//取消写保护
 //dS1302Write(0x81,0x00);
 DS1302Write(0x82,0x32);
 DS1302Write(0x84,0x12);
 DS1302Write(0x86,0x21);
 DS1302Write(0x88,0x02);
 DS1302Write(0x8a,0x02);
 DS1302Write(0x8c,0x06);
 DS1302Write(0x80,0x00);
 DS1302Write(0x8E,0x80);//写保护
 }


//else{
//led(k);
//break;
//}
//}
  while(1)
  {

if (P17==0x00)
{
//EA=1;
DS1302Write(0x8E,0x00);//取消写保护
//led_buf[0]=DS1302Read(0x82);
DS1302Write(0x84,0x13);
k=led_buf[0]+1;
DS1302Write(0x82,k);

//led(k);
DS1302Write(0x8E,0x80);//写保

⌨️ 快捷键说明

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