51单片机试验板-sch-pcb-4.0M.zip

源代码在线查看: 数码管显示时钟演示程序.c

软件大小: 1958 K
上传用户: a956303013
关键词: sch-pcb 4.0 zip 51单片机
下载地址: 免注册下载 普通下载 VIP

相关代码

				
				/*********************************************************************
				公司名称:
				模块名称:数码管显示时钟演示程序
				功    能:利用实时时钟         时钟芯片型号:DS1302 
				说    明:
				程序设计:朱雷        
				设计时间:2008.01.19       
				版 本 号: V1.0
				*********************************************************************/
				
				#include
				#include
				
				#define uchar unsigned char
				#define uint unsigned int
				
				sbit beep=P2^6;//
				sbit aa=P2^0;  //74hc138
				sbit bb=P2^1;
				sbit cc=P2^2;
				sbit LE1=P2^7;
				
				sbit k1=P3^4;
				sbit k2=P3^5;
				sbit k3=P3^6;
				sbit k4=P3^7;
				
				sbit ds1302_RST=P1^1;
				sbit ds1302_IO=P1^2;
				sbit ds1302_SCLK=P1^0;
				sbit ACC0=ACC^0;
				sbit ACC7=ACC^7;
				
				void init();
				void delay_50us(uint t);
				void display();
				
				uchar  read_Byte();
				void write_Byte(uchar tdata);
				void write_data_ds1302(uchar taddr,uchar tdata);
				uchar read_data_ds1302(uchar taddr);
				void set_ds1302(uchar *P1302);
				void get_ds1302() ;
				
				void init_ds1302();
				
				uchar code table[]={ 0x3f,0x06,0x5b,0x4f,0x66,
				                     0x6d,0x7d,0x07,0x7f,0x6f,0x40};
				uchar  initial_time[]={0x00,0x00,0x12};
				                     //  秒   分   时   日   月   周   年
				uchar  data   now_time[3];
				
				
				
				void main()
				{
				    init();
				    init_ds1302();
				    set_ds1302(initial_time);
				while(1)
				  {
				    get_ds1302();
				    display();
				  }
				}
				
				
				/******************************************************************** 
				*函 数 名:delay_50us(uchar )
				*功能描述:延时
				*函数说明:延时50us
				*调用函数:
				*全局变量:
				*输    入:
				*返    回:  
				*设    计:朱雷                 日    期:2008-01-19
				*修    改:                     日    期: 
				*版    本:
				***********************************************************************/
				
				void delay_50us(uint t)
				{
				  uchar j;
				  for(;t>0;t--)
				   for(j=19;j>0;j--);
				
				}
				
				
				/******************************************************************** 
				*函 数 名:delay_50us(uchar )
				*功能描述:延时
				*函数说明:延时50us
				*调用函数:
				*全局变量:
				*输    入:
				*返    回:  
				*设    计:朱雷                 日    期:2008-01-19
				*修    改:                     日    期: 
				*版    本:
				***********************************************************************/
				void init()
				{
				  P0=0xff;
				  P2=0xff;
				  P1=0xff;
				  
				}
				/*数码管显示模块部分*/
				
				/******************************************************************** 
				*函 数 名:display()
				*功能描述:数码管显示
				*函数说明:显示格式为:
				*调用函数:
				*全局变量:
				*输    入:
				*返    回: 
				*设    计:朱雷                 日    期:2008-01-19
				*修    改:                     日    期: 
				*版    本:
				***********************************************************************/
				void display()
				{
				  uchar i;  
				   LE1=1;//选通hc573
				 //分别依次选通数码管的位选端
				   aa=1;
				   bb=1;
				   cc=1;
				   i=now_time[0]%16;  //显示秒个
				   P0=table[i];
				delay_50us(20);
				
				   aa=0;
				   bb=1;
				   cc=1;             
				   i=now_time[0]/16;  //显示秒十
				   P0=table[i];     
				 delay_50us(20);
				
				   aa=1;
				   bb=0;
				   cc=1;
				   P0=table[10];//显示"-"
				 delay_50us(20); 
				
				
				   aa=0;
				   bb=0;
				   cc=1;
				   i=now_time[1]%16;  //显示分个
				   P0=table[i];
				delay_50us(20);
				
				
				   aa=1;
				   bb=1;
				   cc=0;
				  i=now_time[1]/16;   //显示分十
				   P0=table[i];
				delay_50us(20);
				
				   aa=0;
				   bb=1;
				   cc=0;
				   P0=table[10]; //显示"-"
				delay_50us(20);
				
				
				
				   aa=1;
				   bb=0;
				   cc=0;
				   i=now_time[2]%16;    //显示时个
				   P0=table[i];
				delay_50us(20);
				   aa=0;
				   bb=0;
				   cc=0;
				 i=now_time[2]/16;    //显示时十
				   P0=table[i];
				delay_50us(10);
				}
				
				
				
				
				
				
				/*ds1302模块部分*/
				
				/******************************************************************** 
				*函 数 名:read_Byte()
				*功能描述:实时时钟读一字节
				*函数说明:读DS13021Byte数据   下降沿输出一位数据
				*调用函数:
				*全局变量:
				*输    入:ds1302_SCLK=0;
				*返    回:ACC  
				*设    计:朱雷                 日    期:2008-01-19
				*修    改:                     日    期: 
				*版    本:
				***********************************************************************/
				
				uchar  read_Byte()
				{
				   uchar i;
				   for(i=8;i>0;i--)
				   {
				     ACC=ACC>>1;
				     ACC7=ds1302_IO;//由于ds1302读数据的时候,第一个数据读取在发一个Byte命令后,在第八位的下降沿
				     ds1302_SCLK=1;
				     ds1302_SCLK=0;//产生下降沿输出一位数据
				   }
				   return(ACC);
				}
				
				
				/******************************************************************** 
				*函 数 名:write_Byte()
				*功能描述:实时时钟写一字节
				*函数说明:往DS1302写入1Byte数据  上升沿输入数据
				*调用函数:
				*全局变量:
				*输    入:ds1302_SCLK=0;tdata
				*返    回: 
				*设    计:朱雷                 日    期:2008-01-19
				*修    改:                     日    期: 
				*版    本:
				***********************************************************************/
				void  write_Byte(uchar tdata)
				{
				   uchar i;
				   ACC=tdata;
				   for(i=8;i>0;i--)
				   {
				     ds1302_IO=ACC0;
				     ds1302_SCLK=1;
				     ds1302_SCLK=0;//产生上升沿输入数据
				     ACC=ACC>>1;
				   }
				
				}
				
				
				/******************************************************************** 
				*函 数 名:write_data_ds1302(uchar taddr,uchar tdata)
				*功能描述:实时时钟写数据
				*函数说明:先写地址,后写命令/数据
				*调用函数:write_Byte(uchar tdata)
				*全局变量:
				*输    入:taddr;tdata
				*返    回: 
				*设    计:朱雷                 日    期:2008-01-19
				*修    改:                     日    期: 
				*版    本:
				***********************************************************************/
				
				void write_data_ds1302(uchar taddr,uchar tdata)
				{
				   ds1302_RST=0;
				   ds1302_SCLK=0;
				   ds1302_RST=1;
				   write_Byte(taddr);
				   write_Byte(tdata); 
				   ds1302_RST=0;
				   ds1302_SCLK=1;
				}
				
				/******************************************************************** 
				*函 数 名:read_data_ds1302(uchar taddr,uchar tdata)
				*功能描述:读实时时钟地址里的数据
				*函数说明:先写地址,后读命令/数据
				*调用函数:write_Byte(uchar tdata);read_Byte()
				*全局变量:
				*输    入:taddr;
				*返    回:tdata 
				*设    计:朱雷                 日    期:2008-01-19
				*修    改:                     日    期: 
				*版    本:
				***********************************************************************/
				uchar read_data_ds1302(uchar taddr)
				{  
				   uchar tdata;
				    
				   ds1302_RST=0;
				   ds1302_SCLK=0;
				   ds1302_RST=1;
				   write_Byte(taddr);
				   tdata=read_Byte(); 
				   ds1302_RST=0;
				   ds1302_SCLK=1;
				   return(tdata);
				}
				
				
				/******************************************************************** 
				*函 数 名:set_ds1302()
				*功能描述:设置初始时间
				*函数说明:先写地址,后读命令/数据
				*调用函数:
				*全局变量:
				*输    入:taddr;
				*返    回:tdata 
				*设    计:朱雷                 日    期:2008-01-19
				*修    改:                     日    期: 
				*版    本:
				***********************************************************************/
				
				void set_ds1302(uchar *P1302)
				{
				    uchar i;
				    uchar taddr = 0x80; 
				    write_data_ds1302(0x8e,0x00);           /* 控制命令,WP=0,写操作*/
				    for(i =3; i>0; i--)
				    { 
				       write_data_ds1302(taddr,*P1302);    /* 秒 分 时 日 月 星期 年 */ 
				        P1302++;
				        taddr+=2;
				    }
				   write_data_ds1302(0x8e,0x80);           /* 控制命令,WP=1,写保护*/
				}
				
				/******************************************************************** 
				*函 数 名:get_ds1302()
				*功能描述:设置初始时间
				*函数说明:先写地址,后读命令/数据
				*调用函数:
				*全局变量:
				*输    入:now_time[];
				*返    回:
				*设    计:朱雷                 日    期:2008-01-19
				*修    改:                     日    期: 
				*版    本:
				***********************************************************************/
				
				void get_ds1302() 
				{
				    uchar k;
				    uchar taddr = 0x81;
				    for (k=0; k				    {
				        now_time[k] = read_data_ds1302(taddr);/*格式为: 秒 分 时 日 月 星期 年 */
				        taddr+= 2;
				    }
				}
				
				
				/******************************************************************** 
				*函 数 名:init_ds1302()
				*功能描述:初始化ds1302
				*函数说明:先写地址,后读命令/数据
				*调用函数:
				*全局变量:
				*输    入:
				*返    回:
				*设    计:朱雷                 日    期:2008-01-19
				*修    改:                     日    期: 
				*版    本:
				***********************************************************************/
				
				void init_ds1302()
				{
				    ds1302_RST=0;
				    ds1302_SCLK=0;
				    write_data_ds1302(0x8e,0x00);
				    write_data_ds1302(0x90,0xa5);//打开充电二级管  一个二级管串联一个2K电阻 
				}
							

相关资源