单片机数码管时钟显示

今天在学IIC 时突然想到为何不用数码管显示时钟那?

所以 (注意:晶振要选择好,在做串口通信实验时,返回的字符老是与发送字符不同,在学长的指导下,原来把12.0MHZ的晶振,换成11.0592的就可以了...

 

/*--------------------------------------------------------------------------------------------------
 * Project: IIC.c
 * Name: zwp
 * Date: 2013.8
 *--------------------------------------------------------------------------------------------------*/
 
 
 
 #include <reg52.h>
 
 
 
 bit write = 0;				// д24C02µÄ±êÖ¾
 sbit sda = P2^0;			
 sbit scl = P2^1;
 sbit dula = P2^6;			// U1Ëø´æÆ÷¶ÎÊý¾Ý
 sbit wela = P2^7;			// U2Ëø´æÆ÷λÊý¾Ý
 
 
 unsigned char sec, min, hou, tcnt;
 
 
 unsigned char code Table[] = 
 {
	 0X3F, 0X06, 0X5B, 0X4F,
	 0X66, 0X6D, 0X7D, 0X07,
	 0X7F, 0X6F, 0X77, 0X7C,
	 0X39, 0X5E, 0X79, 0X71
 };
 
 
 /*
 ** ΢Ã뼶ÑÓʱ
 */
 void Delay(void)
 {
	 ;;
 }
 
 
 
 /*
 ** ÑÓʱ1ºÁÃë
 */
 void Delay1ms(unsigned int xms)
 {
	 unsigned int index, indeu;
	 
	 
	 for(index = xms; index > 0; -- index)
		for(indeu = 110; indeu > 0; -- indeu);
	 
 }
 
 /*
 ** ³õʼ»¯º¯Êý
 */
 void Initialize(unsigned char s, unsigned char f, unsigned char m)
 {
	 sda = 1;
	 Delay();
	 scl = 1;
	 Delay();
	 
	 /* µ÷Õûʱ¼ä */
	 
	 hou = s;
	 min = f;
	 sec = m; 
	 
 }
 
 
 /*
 ** ÐźſªÊ¼
 */
 void Start(void)
 {
	 sda = 1;
	 Delay();
	 scl = 1;			// scl ¸ßµçƽÆÚ¼ä
	 Delay();
	 sda = 0;			// sda Ò»¸öϽµÑØÆô¶¯ÐźÅ
	 Delay();
 }
 
 
 /*
 ** Í£Ö¹ÐźÅ
 */
 void Stop(void)
 {
	 sda = 0;
	 Delay();
	 scl = 1;				// SCL ¸ßµçƽÆÚ¼ä
	 Delay();	
	 sda = 1;				// sda Ò»¸öÉÏÉýÑØÍ£Ö¹ÐźÅ
	 Delay();
 }
 
 
 /*
 ** Ó¦´ðÐźÅ
 */
 void Response(void)
 {
	 unsigned char index = 0;
	 
	 scl = 1;				// SCL Ϊ¸ßµçƽÆÚ¼ä
	 Delay();
	 while((sda == 1)&&(index < 255)) // sda ±»´ÓÉ豸À­ÎªµÍµçƽ±íʾӦ´ð
		 index++;
	 
	 scl = 0;				// »Ö¸´µÍµçƽ״̬
	 Delay();
 }
 
 
/*
 ** д×Ö½Ú
 */
 void Write_byte(unsigned char xms)
 {
	 unsigned char index, temp;
	 
	 
	 temp = xms;
	 for(index = 0; index < xms; ++ index)
	 {
		 temp <<= 1; 		// Ñ­»·ÒÆλ
		 scl   = 0;
		 Delay();
		 sda = CY;			// ×î¸ß뽫ÒÆÈëPSWµÄCY¼Ä´æÆ÷ÖУ¬È»ºó½«CY¸³Öµ¸øSDA
		 Delay();			// ½ø¶øÔÚsclµÄ¿ØÖÆÏ·¢ËͳöÈ¥
		 scl = 1;
		 Delay();
	 }
	 
	 scl = 0;
	 Delay();
	 sda = 1;
	 Delay();
 }
 
 
 /*
 ** ¶ÁÒ»¸ö×Ö½Ú
 */
 unsigned char Read_byte(void)
 {
	 unsigned char index, kent;
	 
	 scl = 0;
	 Delay();
	 sda = 1;
	 
	 for(index = 0; index < 8; index ++)
	 {
		 scl = 1;
		 Delay();
		 kent = (kent<<1)|sda;	// ÒÀ´Î°Ñ8¸ö¶ÀÁ¢µÄλ·ÅÈëÒ»¸ö×Ö½ÚÖÐÀ´Íê³É½ÓÊÕ
		 scl = 0;
		 Delay();
	 }
	 Delay();
	 
	 return kent;
 }
 
 
 
 /*
 ** Ö¸¶¨µØַдÊý¾Ý
 */
 void Write_add(unsigned char address, unsigned char adata)
 {
	 Start();				// ÐźſªÊ¼
	 
	 Write_byte(0XA0);
	 Response();			// Ó¦´ð
	 
	 Write_byte(address);   // дµØÖ·
	 Response();			// Ó¦´ð
	 Write_byte(adata);		// дÊý¾Ý
	 Response();
	
	 Stop();
 }
 
 
 /*
 ** Ö¸¶¨µØÖ·¶ÁÊý¾Ý
 */
 unsigned char Read_add(unsigned char address)
 {
	 unsigned char adata;
	 
	 
	 Start();				// ÐźſªÊ¼
	 
	 Write_byte(0XA0);		
	 Response();			// Ó¦´ð
	 
	 Write_byte(address);	// дµØÖ·
	 Response();
	 
	 Start();				// ÐźſªÊ¼
	 Write_byte(0XA1);
	 
	 Response();
	 adata = Read_byte();	// ¶ÁÊý¾Ý
	 
	 Stop();				// Í£Ö¹ÐźÅ
	 
	 return adata;
 }
 
 /*
 ** ÔÚÊýÂë¹ÜÉÏÏÔʾÊý¾Ý ʱÏÔʾ
 */
 void Display_hou(unsigned char bai, unsigned char shi)
 {
	 dula = 0;
	 P0	  = Table[bai];		// ·¢ËͶÎÑ¡Êý¾Ý ÏÔʾµÄÊý×Ö
	 dula = 1;
	 dula = 0;
	 
	 wela = 0;
	 P0 = 0X7E;				// ·¢ËÍλѡÊý¾Ý ÏÔʾÊýÂë¹ÜλÖÃ
	 wela = 1;
	 wela = 0;
	 
	 Delay1ms(2);
	 
	 
	 dula = 0;
	 P0   = Table[shi];		
	 dula = 1;
	 dula = 0;
	 
	 wela = 0;
	 P0  = 0X7D;
	 wela = 1;
	 wela = 0;
	 
	 Delay1ms(2);
	 
 }
 
 
 
 /*
 ** ÔÚÊýÂë¹ÜÉÏÏÔʾÊý¾Ý ·ÖÏÔʾ
 */
 
void Display_min(unsigned char bai, unsigned char shi)
 {
	 dula = 0;
	 P0	  = Table[bai];		// ·¢ËͶÎÑ¡Êý¾Ý ÏÔʾµÄÊý×Ö
	 dula = 1;
	 dula = 0;
	 
	 wela = 0;
	 P0 = 0XFB;				// ·¢ËÍλѡÊý¾Ý ÏÔʾÊýÂë¹ÜλÖÃ
	 wela = 1;
	 wela = 0;
	 
	 Delay1ms(2);
	 
	 
	 dula = 0;
	 P0   = Table[shi];		
	 dula = 1;
	 dula = 0;
	 
	 wela = 0;
	 P0  = 0XF7;
	 wela = 1;
	 wela = 0;
	 
	 Delay1ms(2);
	 
	 
 }
 
	 
 /*
 ** ÔÚÊýÂë¹ÜÉÏÏÔʾÊý¾Ý ÃëÏÔʾ
 */
 void Display_sec(unsigned char bai, unsigned char shi)
 {
	 
	 
	 dula = 0;
	 P0  = Table[bai];		// ·¢ËͶÎÊý¾Ý ÏÔʾµÄÊý×Ö
	 dula = 1;
	 dula = 0;
	 
	 wela = 0;
	 P0   = 0xEF;			// λѡÊý¾Ý ÊýÂë¹ÜλÖÃ
	 wela = 1;
	 wela = 0;
	 
	 Delay1ms(2);
	 
	 
	 dula = 0;
	 P0  = Table[shi];		// ÏÔʾ¶ËÊý¾Ý
	 dula = 1;
	 dula = 0;
	 
	 wela = 0;
	 P0 = 0XDF;				// ÏÔʾλѡÊý¾Ý
	 wela = 1;
	 wela = 0;
	 
	 Delay1ms(2);
	 
	
 }
 
 
 /*
 ** Ö÷º¯Êý
 */
 void main(void)
 {
	 Initialize(20, 11, 59);			// ³õʼ»¯
	 
	 sec = Read_add(2);
	 if(sec > 100)			// ·ÀÖ¹Ê״ζÁ³ö´íÎóÊý¾Ý
		 sec = 0;	
	 
	 TMOD = 0X01;			// ¶¨Ê±Æ÷¹¤×÷ÔÚ·½Ê½0
	 ET0  = 1;				// ¿ª¶¨Ê±Æ÷0ÖжÏ
	 EA   = 1;				// ¿ª×ÜÖжÏ
	 
	 TH0 = (65536 - 50000) / 256;	// Öжϼä¸ôλ0.05Ãë
	 TL0 = (65536 - 50000) % 256;	
	 TR0 = 1;				// ¿ª¶¨Ê±Æ÷0
	 
	 
	 while(1)
	 {
		 Display_sec(sec / 10, sec % 10);
		 
		 Display_min(min / 10, min % 10);
		 
		 Display_hou(hou / 10, hou % 10);
		 
		 
		 
		 if(write == 1)		// ¼ÆʱÆ÷ÒѾ­¼Æʱ1Ãë
		 {
			 write = 0;
			 Write_add(2, sec);	// ÔÚ24c02µÄµØÖ·2ÖÐдÈëÊý¾Ýsec
		 }
	 }
 }
 
 
 /*
 ** ÖжÏ0´¦Àí³ÌÐò
 */
 void Timer() interrupt 1
 {
	 TH0 = (65536 - 50000) / 256;	// Öжϼä¸ôλ0.05Ãë
	 TL0 = (65536 - 50000) % 256;
	 
	 tcnt++;		// ÿ¹ý50msµÝÔö
	 
	 if(tcnt == 20) // ʱ¼äΪ1Ãë
	 { 
		 tcnt = 0;
		 sec++;
		 write = 1;				//1Ãëдһ´Î24C02
		 
		 if(sec == 60)	 // ¶¨Ê±60ÃëÔÙ´ÓÁ㿪ʼ¼Æʱ
		 {				 
			 sec = 0;
			 min++;		  // Ôö¼Ó1·ÖÖÓ
			 
			 if(min == 60) 	// ¶¨Ê±µ½60·ÖÖÓʱÔÙ´ÓÁ㿪ʼ¼Æʱ
			 {
				 min = 0;
				 hou++;		// Ôö¼ÓÒ»¸öСʱ
				 
				 if(hou == 24) // ¶¨Ê±µ½24СʱʱÔÙ´ÓÁ㿪ʼ¼Æʱ
					 hou = 0;  
			 }
			 
		 }
	 }
 }
 
 
 
 
		 
 
 
	 
 
 


 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值