当前位置:编程学习 > C/C++ >>

单片机做的日历 c语言程序

答案:这是一个DS1302时钟程序,根据自己的硬件电路适当改改就可以做成日历了

 

/********************************************************************
*DS1302控制程序     2011.12.01   wqz
********************************************************************/
#include<reg52.h>
#include<intrins.h>
 
typedef unsigned uchar;

sbit sda=P2^1;    //DS1302
sbit clk=P2^0;
sbit ce=P2^2;
//sbit sda=P3^4;
//sbit clk=P3^6;
//sbit ce=P3^5;
//
//sbit _138_A=P2^2;   //138A,B,C口
//sbit _138_B=P2^3;
//sbit _138_C=P2^4;

sbit IO =P1^7;    //595控制信号
sbit RLK =P1^6;
sbit CLK =P1^5;

#define  my_delay5us()  _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();\
       _nop_();_nop_();_nop_();_nop_();_nop_();_nop_()
//#define  T0_init() TMOD=0x01;TH0=0xb8;TL0=0x00;TR0=1;ET0=1;EA=1

uchar cc[8];  //将要显示的时间由BCD码转换成要显示的数值存放在CC[]中
uchar bb[8];  //存放从DS1302中读取出来的数据
uchar aa[7]={0,30,18,20,12,6,11};  //初始时间
uchar code write_rtc[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};   //时间寄存器写地址
uchar code  tember[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //共阴数码管显示表

void my_delay1ms(int t);   //延时1ms函数
void write_1byte(uchar temp);  //写一字节数据
uchar read_1byte();     //读一字李数据
void write_addr_data(uchar Addr, uchar Data);  //先写地址再写数据
uchar writeadd_readdat(uchar ucAddr);     //先写地址再读数据
void write1_readM();        //连续读多个字节数据
void ds1302_init();         //DS1302初始化

/********************************************************************
*
* 主函数
********************************************************************/

void main()
{
 uchar i,j,dat;

 my_delay1ms(10);
 ds1302_init();    //给DS1302付初值   11年12月20日 周六 18-30-00
// T0_init();

 while(1)
 { 
  write1_readM();   //读DS1302中的数据

  cc[0]=bb[0]%16;
  cc[1]=bb[0]/16;
  cc[2]=10;
  cc[3]=bb[1]%16;
  cc[4]=bb[1]/16;
  cc[5]=10;
  cc[6]=bb[2]%16;
  cc[7]=bb[2]/16;

  for(j=0;j<8;j++)
  {
   dat=tember[cc[j]];
   RLK=0;
   my_delay5us();
   for(i=0;i<8;i++)
   {
    if(dat&0x80)IO=1;
    else IO=0;
    my_delay5us();
    CLK=1;
    my_delay5us();
    CLK=0;
    dat<<=1;
   }
   my_delay5us();
   RLK=1;
  }
  my_delay1ms(500);
 } 
}

/**********************************************************************/

void my_delay1ms(int t)  //延时
{
 uchar i,j;
 while(t--)
 {
  for(i=4;i>0;i--)
  for(j=50;j>0;j--);
 }
}

/**********************************************************************/

void write_1byte(uchar temp)  //写一字节数据
{
 uchar i;

 clk=0;
 my_delay5us();
  for (i=0;i<8;i++)      
  {
     if(temp&0x01)sda=1;
  else sda=0;    
     my_delay5us();    
     clk=1;
  my_delay5us();
  clk=0;
  temp>>=1;
    }
}

/**********************************************************************/

uchar read_1byte()     //读一字节数据
{
 uchar i,num;
 for (i=0;i<8;i++)   
  { 
  num>>=1; 
   if(sda)
   num|=0x80;
  my_delay5us();   
  clk=1;
  my_delay5us();  
   clk=0;
 }
 return num;
}

/**********************************************************************/

void write_addr_data(uchar Addr, uchar Data)  //先写地址再写数据
{
 ce = 0;
 my_delay5us();
 clk = 0;
 my_delay5us();
 ce = 1;
 my_delay5us();
 write_1byte(Addr); // 地址,命令
 write_1byte(Data); // 写1Byte数据
 my_delay5us();
 clk=1;
 my_delay5us();
 ce =0;
}

/**********************************************************************/

uchar writeadd_readdat(uchar ucAddr)    //先写地址再读数据
{
 uchar num1=0;

 ce = 0 ;
 my_delay5us();
 clk = 0;
 my_delay5us();
 ce = 1;
 my_delay5us();
 write_1byte(ucAddr); // 地址,命令
 num1 = read_1byte(); // 读1Byte数据
 my_delay5us();
 clk = 1;
 my_delay5us();
 ce =0;

 return(num1);
}

/**********************************************************************/

void write1_readM()      //连续读多个字节数据
{
 uchar i,Addr;

 Addr=0x81;
 for (i=0;i<7;i++)
 {
  bb[i] = writeadd_readdat( Addr);//*格式为: 秒 分 时 日 月 星期 年
  Addr += 2;
 }
}

/**********************************************************************/

void ds1302_init()    //初始时间  11年12月20日 周六 18-30-00
{
 uchar i,*p,tmp;

 for(i=0;i<7;i++)
 {                       /*如想设置DS1302的“秒”,设置时间为37秒,所以输入的是十*/
  tmp=aa[i]/10;     /*进制数37,对应的16进制是0x25,但是DS1302寄存器使用的是压*/
  aa[i]=aa[i]%10;     /*缩BCD码,所以应该写入BCD数值37才行,即0x37。所以需要将*/
  aa[i]=aa[i]+tmp*16; /*10进制的37转换为16进制表示的0x37*/
 } 
  write_addr_data(0x8E,0X00);
 
  p=write_rtc;            //传地址 
  for(i=0;i<7;i++)            //7次写入 秒分时日月周年
  {
   write_addr_data(*p,aa[i]);
    p++; 
 }

 write_addr_data(0x8E,0x80);
}

/**********************************************************************/

//void ET0_ser() interrupt 1
//{
//// uchar i;
//
// TH0=0x55;
// TL0=0x00;
//
//// P0=tember[cc[i]];
//// switch(i)
//// {
////  case 0 :  _138_A=1;_138_B=1;_138_C=1; break;
////  case 1 :  _138_A=0;_138_B=1;_138_C=1; break;
////  case 2 :  _138_A=1;_138_B=0;_138_C=1; break;
////  case 3 :  _138_A=0;_138_B=0;_138_C=1; break;
////  case 4 :  _138_A=1;_138_B=1;_138_C=0; break;
////  case 5 :  _138_A=0;_138_B=1;_138_C=0; break;
////  case 6 :  _138_A=1;_138_B=0;_138_C=0; break;
////  case 7 :  _138_A=0;_138_B=0;_138_C=0;

上一个:C语言是么司。?
下一个:C语言求高手 在线等 50分

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,