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

📄 text1.lst

📁 6416led+ds1302+8951电子钟,完整源代码
💻 LST
字号:
C51 COMPILER V6.12  TEXT1                                                                  06/09/2000 21:38:35 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE TEXT1
OBJECT MODULE PLACED IN .\Text1.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\Text1.c DEBUG OBJECTEXTEND

stmt level    source

   1          /*****************************************************
   2                 16字LED点阵屏+DS1302电子钟 C 程序
   3          ******************************************************
   4          声明:
   5               本程序中DS1302读写部分是直接引用网上网友提供的共享程序,
   6          	 本程序供大家学习之用,用勿用于商业用途。尊重作者版权。
   7          	 
   8          	 编写:邓椿薪
   9          	 时间:2006年2月6日 晚
  10          	 邮箱:love2151@xinhuanet.com
  11          *******************************************************
  12          
  13           DS1302 接线图
  14          
  15                   Vcc2  CLK I/O  /RST 
  16                     
  17                      |   |   |   |
  18                     -------------------
  19                    | 8   7   6   5  |
  20                    |   DS1302       |
  21                    |                |
  22                    | 1   2   3   4  |
  23                     -------------------
  24                      |   |   |   |
  25                   VCC1           GND
  26          
  27          1 脚接+5V    2,3脚32768HZ晶振  4脚接地  5脚接S51的P02 6脚接S51的P01 7接S51的P00
  28          8脚接后备电源,可以接老计算机主板上的3.6V电池,也可以通过二级管隔离接一个大容量电解电容
  29          电压在2.5V以上即可维持
  30          
  31          
  32          595连级输出数据,138行驱动。*/
  33          
  34          
  35          
  36          #include <AT89x51.H>
  37          #define uchar unsigned char
  38          #define uint unsigned int
  39          
  40          uchar code hanzi[18][32];
  41          uchar code hanzi2[];
  42          uchar code timer[12][16];
  43          uchar code sw[];
  44          
  45          void xs_out();                     /*输出显示*/
  46          void out_rxd(unsigned char *d);    /*串口发送一行*/
  47          
  48          
  49          
  50          /******************************************/
  51          sbit resget=P1^3;			//时钟复位
  52          sbit key_moda=P1^0;			//模式转换
  53          sbit key_up=P1^1;			//时钟加
  54          sbit key_Down=P1^2;			//时钟减
  55          
C51 COMPILER V6.12  TEXT1                                                                  06/09/2000 21:38:35 PAGE 2   

  56          sbit T_CLK=P1^7;		//DS1302引脚连接
  57          sbit T_IO =P1^6;
  58          sbit T_RST=P1^5;
  59          
  60          sbit ACC0=ACC^0;       //1bit数据存储位
  61          sbit ACC7=ACC^7;
  62          
  63          uchar inittime[7]={0x00,0x10,0x22,0x13,0x01,0x05,0x06};	 //初始化后设置
  64          uchar yid,i,e,id,miao,fen,shi,nian,yue,ri,xinqi;  //时间变量
  65          uint zimuo,ss;
  66          uchar BUFF[10];			           // 缓存
  67          
  68          void   RTInputByte(uchar);         /* 输入 1Byte */
  69          uchar  RTOutputByte(void);         /* 输出 1Byte */
  70          void   W1302(uchar, uchar);        // 向DS1302写入一个字节
  71          uchar  R1302(uchar);               // 从DS1302读出一个字节
  72          void   Set1302(uchar *);           // 写DS1302时间
  73          void   du1302();                   // 读时间  
  74          void   DelayMs(void);              // 延时
  75          void   Set(uchar,uchar );          // 变量调整
  76          void   in_data();				   // 调整移动数据
  77          void   rxd_data();				   // 串口发送移动数据
  78          
  79          /*主函数*/
  80          void main()
  81          {
  82   1         yid=0;
  83   1         zimuo=0;
  84   1        SCON=0;             //初始化串口为工作方式0(同步通信方式,TxD输出同步脉冲)
  85   1         while(1)            //重复循环显示
  86   1         {
  87   2        	 while(yid<16)				       //数据移位。
  88   2           {
  89   3      	  for(e=0;e<8;e++)                  //移动速度
  90   3      	  {	
  91   4      	  if(resget==0)
  92   4      	  {DelayMs();
  93   5             if(resget==0)
  94   5      	   Set1302(inittime);           //初始化 
  95   5      	   W1302(0x8e,0x00);           /* 控制命令,WP=0,写操作?*/                 
  96   5      	   W1302(0x90,0xa5);           //打开充电二级管  一个二级管串联一个2K电阻 
  97   5      	  }  
  98   4      	 du1302();            //读取 秒 分 时 日 月 星期 年	  	
  99   4       	  if (key_moda==0)	           // 设置和选择项目键
 100   4             {DelayMs();
 101   5      	    if(key_moda==0)
 102   5      	     {
 103   6      	       id++;if(id==8) {id=0;yid=0;zimuo=0;}
 104   6      		   while(key_moda==0){ xs_out();}    
 105   6                }
 106   5      	   }
 107   4      	  
 108   4          
 109   4           if (key_up==0) //增加
 110   4            {
 111   5             DelayMs();
 112   5             if(key_up==0)
 113   5      	   {
 114   6      	   	while(key_up==0)
 115   6      		 {xs_out();}
 116   6      		 ss=0;
 117   6      		 Set(id,0);
C51 COMPILER V6.12  TEXT1                                                                  06/09/2000 21:38:35 PAGE 3   

 118   6      		}  
 119   5             }
 120   4         
 121   4         if (key_Down==0)  //减少
 122   4            {
 123   5             DelayMs();
 124   5             if(key_Down==0)
 125   5      	    {
 126   6      	     while(key_Down==0)
 127   6      		{xs_out();}
 128   6      		ss=0;
 129   6      		Set(id,1);
 130   6      		}         
 131   5            }
 132   4      	 xs_out();		        /******调用显示****/
 133   4      	}
 134   3         yid++;				//移动一步
 135   3         
 136   3        }
 137   2        yid=0;
 138   2        zimuo=zimuo+32;		//后移一个字,
 139   2        if(zimuo>=960)		//总数减2个字。
 140   2         zimuo=0;
 141   2        }
 142   1       }
 143          
 144          /************************************************/
 145          void xs_out()		   //串行输出显示
 146          {
 147   1         for(i=0;i<16;i++)
 148   1            { 
 149   2             
 150   2      	    ss++;					         //ss为闪烁延时计数器
 151   2      		if (ss==1500)					 //定义SS的大小决定调整时闪烁的快慢,小于750时为亮,大于750时为黑
 152   2      		   {ss=0;}
 153   2      	  if(id==0)							 //当ID为零时显示移动的汉字。在时间设置时ID不为零
 154   2      	    {								 //显示年。
 155   3               in_data();				  //调整移动数据
 156   3      	     rxd_data();				  //串口发送移动数据
 157   3              }
 158   2      	  else					   //id不为零时,显示年。只有在时钟设置时ID才不为零。
 159   2      	   {
 160   3      	     out_rxd(&timer[11][i]);	         //不显示
 161   3      	     if(id==1&&ss>750)			     //当ID为1和SS大于1000时年不显示。
 162   3      	      {
 163   4      	        out_rxd(&timer[11][i]);	     //不显示 
 164   4      			out_rxd(&timer[11][i]);	     //不显示
 165   4      		    out_rxd(&timer[11][i]);	     //不显示
 166   4      			out_rxd(&timer[11][i]);	     //不显示
 167   4      	       }
 168   3      		 else
 169   3      		  { out_rxd(&timer[2][i]);       //20年   
 170   4      	        out_rxd(&timer[0][i]);
 171   4                  out_rxd(&timer[nian/16][i]); //年   
 172   4      	        out_rxd(&timer[nian%16][i]);
 173   4      	       }
 174   3      		
 175   3      	    out_rxd(&timer[11][i]);	      //不显示
 176   3      
 177   3      	    out_rxd(&hanzi[0][i*2+1]);     //年字符  
 178   3      	    out_rxd(&hanzi[0][i*2]);
 179   3             }
C51 COMPILER V6.12  TEXT1                                                                  06/09/2000 21:38:35 PAGE 4   

 180   2      	   if(id==2&&ss>750)			  //当ID为2和SS大于1000时月不显示。
 181   2      	      {out_rxd(&timer[11][i]);	  //不显示 
 182   3      		   out_rxd(&timer[11][i]);}	  //不显示
 183   2      	   else
 184   2      	    {if(yue/16==0)
 185   3      	       out_rxd(&timer[11][i]);	  //当月十位为零时不显示
 186   3      	     else
 187   3      	      out_rxd(&timer[yue/16][i]);	
 188   3                out_rxd(&timer[yue%16][i]); //月
 189   3      	    }
 190   2      
 191   2      	   out_rxd(&hanzi[1][i*2+1]);     //月字符
 192   2      	   out_rxd(&hanzi[1][i*2]);
 193   2      
 194   2      	   if(id==3&&ss>750)			  //当ID为3和SS大于1000时日不显示。
 195   2      	      {out_rxd(&timer[11][i]);	  //不显示 
 196   3      		   out_rxd(&timer[11][i]);}	  //不显示
 197   2      	   else
 198   2      		 {out_rxd(&timer[ri/16][i]);	
 199   3                out_rxd(&timer[ri%16][i]);}  //日
 200   2      		 							
 201   2      	   out_rxd(&hanzi[17][i*2+1]);     //日字符
 202   2      	   out_rxd(&hanzi[17][i*2]);
 203   2      
 204   2      	   out_rxd(&hanzi[2][i*2+1]);     //星字符
 205   2      	   out_rxd(&hanzi[2][i*2]);
 206   2             out_rxd(&hanzi[3][i*2+1]);     //期字符
 207   2      	   out_rxd(&hanzi[3][i*2]);
 208   2      
 209   2      	   out_rxd(&timer[11][i]);	      //不显示
 210   2      
 211   2      	   if(id==4&&ss>750)		 //当ID为3和SS大于1000时星期不显示。
 212   2      	      {out_rxd(&timer[11][i]);	       //不显示 
 213   3      		   out_rxd(&timer[11][i]);}	       //不显示
 214   2      	   else
 215   2      		 {out_rxd(&hanzi[xinqi+10][i*2+1]);//星期值字符
 216   3      	      out_rxd(&hanzi[xinqi+10][i*2]);}
 217   2      		 
 218   2      	   out_rxd(&timer[11][i]);	        //不显示
 219   2      
 220   2      	   if(id==5&&ss>750)			 //当ID为4和SS大于1000时时不显示。
 221   2      	      {out_rxd(&timer[11][i]);	    //不显示 
 222   3      		   out_rxd(&timer[11][i]);}	    //不显示
 223   2      	   else
 224   2      		 {
 225   3      	      if(shi/16==0)
 226   3      		    out_rxd(&timer[11][i]);	    //当时十位为零时不显示
 227   3      	      else
 228   3      	       out_rxd(&timer[shi/16][i]);	//从串口输出时十位。
 229   3      	       out_rxd(&timer[shi%16][i]);	//从串口输出时个位。
 230   3      		  }
 231   2      
 232   2             out_rxd(&timer[10][i]);          //从串口输出两点。
 233   2      
 234   2      	   if(id==6&&ss>750)			 //当ID为6和SS大于1000时分不显示。
 235   2      	      {out_rxd(&timer[11][i]);	    //不显示 
 236   3      		   out_rxd(&timer[11][i]);}	    //不显示
 237   2      		  
 238   2      	  else
 239   2      		 {out_rxd(&timer[fen/16][i]);	 //输出分值
 240   3                out_rxd(&timer[fen%16][i]);}
 241   2      		 
C51 COMPILER V6.12  TEXT1                                                                  06/09/2000 21:38:35 PAGE 5   

 242   2      	   out_rxd(&timer[10][i]);		     //从串口输出两点。
 243   2      
 244   2      	   if(id==7&&ss>750)			     //当ID为6和SS大于1000时秒不显示。
 245   2      	      {out_rxd(&timer[11][i]);	     //不显示 
 246   3      		   out_rxd(&timer[11][i]);}     //不显示
 247   2      		else
 248   2      		 {out_rxd(&timer[miao/16][i]);	 //输出秒值
 249   3      	      out_rxd(&timer[miao%16][i]);}
 250   2      		  
 251   2      	  
 252   2      	 /*****************************************************************/
 253   2      	  
 254   2      	  P2_7=1;					  //锁存为高,595锁存信号
 255   2      	  P2=sw[i];				  //输出行信号
 256   2      	  DelayMs();	 //延时,等待一段时间,让这列显示的内容在人眼内产生“视觉暂留”现象。*/
 257   2      	  P2=0x7f;		         //关闭显示。
 258   2      	 }
 259   1      	
 260   1       }
 261          
 262          
 263          void in_data(void)		 //调整数据
 264          {
 265   1       char s;
 266   1      	for(s=4;s>=0;s--)			              //i为向后先择字节计数器,zimuoo为向后先字计数器
 267   1      	{
 268   2      	 BUFF[2*s+1]=hanzi2[zimuo+32*s+2*i];     // 把第一个字模的第一个字节放入BUFF0中,第二个字模和第一个字节放

⌨️ 快捷键说明

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