今天在学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;
}
}
}
}