|
/*
#include<reg52.h>
sbit a = P3^4;
void delay(unsigned int z)
{
unsigned int x,y;
for(x = z;x > 0;x--)
for (y = 110;y > 0;y--);
}
void main()
{
while(1)
{
a = 0;
delay(1);
a = 1;
delay(1);
}
*/
#include <reg52.h>
#include <intrins.h>
#define LCD1602_DB P0
sbit IO_18B20 = P3^4; //DS18B20í¨DÅòy½Å
sbit LCD1602_RS = P2^5;
sbit LCD1602_RW = P2^6;
sbit LCD1602_E = P2^7;
sbit DS1302_CE = P1^6;
sbit DS1302_CK = P1^4;
sbit DS1302_IO = P1^5;
bit flag200ms = 0; //200ms¶¨ê±±êÖ¾
bit flag1s = 0; //1s¶¨ê±±êÖ¾
unsigned char T1RH = 0 ;
unsigned char T1RL = 0 ;
unsigned char T0RH = 0 ; //T0ÖØÔØÖμμĸß×Ö½ú
unsigned char T0RL = 0 ; //T0ÖØÔØÖμμÄμí×Ö½ú
//′yÏÔê¾μÄμúò»DD×Ö·û′®
//unsigned char code str1[] = "Kingst Studio";
//′yÏÔê¾μÄμú¶tDD×Ö·û′®£¬Dè±£3Öóëμúò»DD×Ö·û′®μè3¤£¬½Ï¶ìμÄDD¿éóÿոñ21Æë
//unsigned char code str2[] = "Let's move...";
unsigned char IntToString(unsigned char *str, int dat);
bit Start18B20();
bit Get18B20Temp(int *temp);
void InitDS1302();
void DS1302BurstRead(unsigned char *dat);
void ConfigTimer0(unsigned int ms);
void ConfigTimer1(unsigned int ms);
void InitLcd1602();
void LcdShowStr(unsigned char x, unsigned char y,
unsigned char *str);
/* μè′yòo¾§×¼±¸oà */
void LcdWaitReady()
{
unsigned char sta;
LCD1602_DB = 0xFF;
LCD1602_RS = 0;
LCD1602_RW = 1;
do {
LCD1602_E = 1;
sta = LCD1602_DB; //¶áè¡×′ì¬×Ö
LCD1602_E = 0;
} while (sta & 0x80); //bit7μèóú1±íê¾òo¾§ÕyÃ|£¬Öظ′¼ì2aÖ±μ½Æäμèóú0ÎaÖ1
}
/* ÏòLCD1602òo¾§D′èëò»×Ö½úÃüácmd-′yD′èëÃüáîÖμ */
void LcdWriteCmd(unsigned char cmd)
{
LcdWaitReady();
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DB = cmd;
LCD1602_E = 1;
LCD1602_E = 0;
}
/* ÏòLCD1602òo¾§D′èëò»×Ö½úêy¾Y£¬dat-′yD′èëêy¾YÖμ */
void LcdWriteDat(unsigned char dat)
{
LcdWaitReady();
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DB = dat;
LCD1602_E = 1;
LCD1602_E = 0;
}
/* 3õê¼»ˉ1602òo¾§ */
void InitLcd1602()
{
LcdWriteCmd(0x38); //16*2ÏÔê¾£¬5*7μãÕó£¬8λêy¾Y½ó¿ú
LcdWriteCmd(0x0C); //ÏÔê¾Æ÷¿a£¬1a±ê1رÕ
LcdWriteCmd(0x06); //ÎÄ×Ö2»¶ˉ£¬μØÖ·×Ô¶ˉ+1
LcdWriteCmd(0x01); //ÇåÆá
}
/* éèÖÃÏÔê¾RAMÆeê¼μØÖ·£¬òà¼′1a±êλÖã¬(x,y)-¶Ôó|ÆáÄ»éÏμÄ×Ö·û×ø±ê */
void LcdSetCursor(unsigned char x, unsigned char y)
{
unsigned char addr;
if (y == 0) //óéêäèëμÄÆáÄ»×ø±ê¼ÆËãÏÔê¾RAMμÄμØÖ·
addr = 0x00 + x; //μúò»DD×Ö·ûμØÖ·′ó0x00Æeê¼
else
addr = 0x40 + x; //μú¶tDD×Ö·ûμØÖ·′ó0x40Æeê¼
LcdWriteCmd(addr | 0x80); //éèÖÃRAMμØÖ·
}
/* Ôúòo¾§éÏÏÔê¾×Ö·û′®£¬(x,y)-¶Ôó|ÆáÄ»éÏμÄÆeê¼×ø±ê£¬str-×Ö·û′®Ö¸Õë */
void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str)
{
LcdSetCursor(x, y); //éèÖÃÆeê¼μØÖ·
while (*str != '\0') //á¬DøD′èë×Ö·û′®êy¾Y£¬Ö±μ½¼ì2aμ½½áêø·û
{
LcdWriteDat(*str++);
}
}
/* ·¢Ëíò»¸ö×Ö½úμ½DS1302í¨DÅ×üÏßéÏ */
void DS1302ByteWrite(unsigned char dat)
{
unsigned char mask;
for (mask=0x01; mask!=0; mask<<=1) //μíλÔúǰ£¬ÖeλòÆ3ö
{
if ((mask&dat) != 0) //ê×Ïèêä3ö¸Ãλêy¾Y
DS1302_IO = 1;
else
DS1302_IO = 0;
DS1302_CK = 1; //è»oóà-¸ßê±Öó
DS1302_CK = 0; //Ôùà-μíê±Öó£¬íê3éò»¸öλμÄ2ù×÷
}
DS1302_IO = 1; //×îoóè·±£êí·ÅIOòy½Å
}
/* óéDS1302í¨DÅ×üÏßé϶áè¡ò»¸ö×Ö½ú */
unsigned char DS1302ByteRead()
{
unsigned char mask;
unsigned char dat = 0;
for (mask=0x01; mask!=0; mask<<=1) //μíλÔúǰ£¬Öeλ¶áè¡
{
if (DS1302_IO != 0) //ê×Ïè¶áè¡′Ëê±μÄIOòy½Å£¬2¢éèÖÃdatÖDμĶÔó|λ
{
dat |= mask;
}
DS1302_CK = 1; //è»oóà-¸ßê±Öó
DS1302_CK = 0; //Ôùà-μíê±Öó£¬íê3éò»¸öλμÄ2ù×÷
}
return dat; //×îoó·μ»Ø¶áμ½μÄ×Ö½úêy¾Y
}
/* óÃμ¥′ÎD′2ù×÷ÏòÄ3ò»¼Ä′æÆ÷D′èëò»¸ö×Ö½ú£¬reg-¼Ä′æÆ÷μØÖ·£¬dat-′yD′èë×Ö½ú */
void DS1302SingleWrite(unsigned char reg, unsigned char dat)
{
DS1302_CE = 1; //ê1ÄüƬѡDÅoÅ
DS1302ByteWrite((reg<<1)|0x80); //·¢ËíD′¼Ä′æÆ÷Ö¸áî
DS1302ByteWrite(dat); //D′èë×Ö½úêy¾Y
DS1302_CE = 0; //3yÄüƬѡDÅoÅ
}
/* óÃμ¥′ζá2ù×÷′óÄ3ò»¼Ä′æÆ÷¶áè¡ò»¸ö×Ö½ú£¬reg-¼Ä′æÆ÷μØÖ·£¬·μ»ØÖμ-¶áμ½μÄ×Ö½ú */
unsigned char DS1302SingleRead(unsigned char reg)
{
unsigned char dat;
DS1302_CE = 1; //ê1ÄüƬѡDÅoÅ
DS1302ByteWrite((reg<<1)|0x81); //·¢Ëí¶á¼Ä′æÆ÷Ö¸áî
dat = DS1302ByteRead(); //¶áè¡×Ö½úêy¾Y
DS1302_CE = 0; //3yÄüƬѡDÅoÅ
return dat;
}
void DS1302BurstWrite(unsigned char *dat)
{
unsigned char i;
DS1302_CE = 1;
DS1302ByteWrite(0xBE);
for(i=0; i<8; i++)
{
DS1302ByteWrite(dat[i]);
}
DS1302_CE = 0;
}
void DS1302BurstRead(unsigned char *dat)
{
unsigned char i;
DS1302_CE = 1;
DS1302ByteWrite(0xBF);
for(i=0; i<8; i++)
{
dat[i] = DS1302ByteRead();
}
DS1302_CE = 0;
}
/* DS13023õê¼»ˉ£¬èç·¢éúμôμçÔòÖØDÂéèÖÃ3õê¼ê±¼ä */
void InitDS1302()
{
unsigned char dat;
unsigned char code InitTime[] = { //2013Äê10ÔÂ8èÕ DÇÆú¶t 12:30:00
0x00,0x53,0x20, 0x07, 0x01, 0x04, 0x16
};
DS1302_CE = 0; //3õê¼»ˉDS1302í¨DÅòy½Å
DS1302_CK = 0;
dat = DS1302SingleRead(0); //¶áè¡Ãë¼Ä′æÆ÷
if ((dat & 0x80) != 0) //óéÃë¼Ä′æÆ÷×î¸ßλCHμÄÖμÅD¶ÏDS1302êÇ·ñòÑí£Ö1
{
DS1302SingleWrite(7, 0x00); //3·ÏúD′±£»¤òÔÔêDíD′èëêy¾Y
DS1302BurstWrite(InitTime); //éèÖÃDS1302ÎaĬèÏμÄ3õê¼ê±¼ä
}
}
/* ÅäÖÃ2¢Æô¶ˉT1£¬ms-T1¶¨ê±ê±¼ä */
void ConfigTimer1(unsigned int ms)
{
unsigned long tmp; //áùê±±äá¿
tmp = 11059200 / 12; //¶¨ê±Æ÷¼ÆêyÆμÂê
tmp = (tmp * ms) / 1000; //¼ÆËãËùDèμļÆêyÖμ
tmp = 65536 - tmp; //¼ÆËã¶¨ê±Æ÷ÖØÔØÖμ
tmp = tmp + 12; //213¥ÖD¶ÏÏìó|Ñóê±Ôì3éμÄÎó2î
T1RH = (unsigned char)(tmp>>8); //¶¨ê±Æ÷ÖØÔØÖμ2e·ÖÎa¸ßμí×Ö½ú
T1RL = (unsigned char)tmp;
TMOD &= 0x0F; //ÇåáãT1μÄ¿ØÖÆÎ»
TMOD |= 0x10; //ÅäÖÃT1ÎaÄ£ê½1
TH1 = T1RH; //¼óÔØT1ÖØÔØÖμ
TL1 = T1RL;
ET1 = 1; //ê1ÄüT1ÖD¶Ï
TR1 = 1; //Æô¶ˉT1
}
/* ÅäÖÃ2¢Æô¶ˉT0£¬ms-T0¶¨ê±ê±¼ä */
void ConfigTimer0(unsigned int ms)
{
unsigned long tmp; //áùê±±äá¿
tmp = 11059200 / 12; //¶¨ê±Æ÷¼ÆêyÆμÂê
tmp = (tmp * ms) / 1000; //¼ÆËãËùDèμļÆêyÖμ
tmp = 65536 - tmp; //¼ÆËã¶¨ê±Æ÷ÖØÔØÖμ
tmp = tmp + 12; //213¥ÖD¶ÏÏìó|Ñóê±Ôì3éμÄÎó2î
T0RH = (unsigned char)(tmp>>8); //¶¨ê±Æ÷ÖØÔØÖμ2e·ÖÎa¸ßμí×Ö½ú
T0RL = (unsigned char)tmp;
TMOD &= 0xF0; //ÇåáãT0μÄ¿ØÖÆÎ»
TMOD |= 0x01; //ÅäÖÃT0ÎaÄ£ê½1
TH0 = T0RH; //¼óÔØT0ÖØÔØÖμ
TL0 = T0RL;
ET0 = 1; //ê1ÄüT0ÖD¶Ï
TR0 = 1; //Æô¶ˉT0
}
/* èí¼tÑóê±oˉêy£¬Ñóê±ê±¼ä(t*10)us */
void DelayX10us(unsigned char t)
{
do {
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
} while (--t);
}
bit Get18B20Ack()
{
bit ack;
EA = 0;
IO_18B20 = 0;
DelayX10us(50);
IO_18B20 = 1;
DelayX10us(6);
ack = IO_18B20;
while(!IO_18B20);
EA = 1;
return ack;
}
void Write18B20(unsigned char dat)
{
unsigned char mask;
EA = 0;
for(mask=0x01; mask!= 0; mask<<=1)
{
IO_18B20 = 0;
_nop_();
_nop_();
if((mask&dat) == 0)
IO_18B20 = 0;
else
IO_18B20 = 1;
DelayX10us(6);
IO_18B20 = 1;
}
EA = 1;
}
unsigned char Read18B20()
{
unsigned char dat;
unsigned char mask;
EA = 0;
for(mask=0x01; mask!=0; mask<<=1)
{
IO_18B20 = 0;
_nop_();
_nop_();
IO_18B20 = 1;
_nop_();
_nop_();
if(!IO_18B20)
dat &= ~mask;
else
dat |= mask;
DelayX10us(6);
}
EA = 1;
return dat;
}
bit Start18B20()
{
bit ack;
ack = Get18B20Ack();
if(ack == 0)
{
Write18B20(0xCC);
Write18B20(0x44);
}
return ~ack;
}
bit Get18B20Temp(int *temp)
{
bit ack;
unsigned char LSB, MSB;
ack = Get18B20Ack();
if(ack == 0)
{
Write18B20(0xCC);
Write18B20(0xBE);
LSB = Read18B20();
MSB = Read18B20();
*temp = ((int)MSB<<8) + LSB;
}
return ~ack;
}
void main()
{
unsigned char psec=0xAA; //Ã뱸·Y£¬3õÖμAAè·±£ê×′ζáè¡ê±¼äoó»áË¢DÂÏÔê¾
unsigned char time[8]; //μ±Ç°ê±¼äêy×é
unsigned char str[12]; //×Ö·û′®×a»»»o3åÇø
unsigned char str1[12];
bit res;
int temp; //¶áè¡μ½μÄμ±Ç°Î¶èÖμ
int intT, decT; //ζèÖμμÄÕûêyoíD¡êy2¿·Ö
unsigned char len;
EA = 1; //¿a×üÖD¶Ï
ConfigTimer1(1); //T0¶¨ê±1ms
ConfigTimer0(10);
InitDS1302(); //3õê¼»ˉêμê±ê±Öó
InitLcd1602(); //3õê¼»ˉòo¾§
Start18B20(); //Æô¶ˉDS18B20
while (1)
{
if (flag1s) //ÿÃë¸üDÂò»′Îζè
{
flag1s = 0;
res = Get18B20Temp(&temp); //¶áè¡μ±Ç°Î¶è
if (res) //¶áè¡3é1|ê±£¬Ë¢DÂμ±Ç°Î¶èÏÔê¾
{
intT = temp >> 4; //·Öàë3öζèÖμÕûêy2¿·Ö
decT = temp & 0xF; //·Öàë3öζèÖμD¡êy2¿·Ö
len = IntToString(str1, intT); //Õûêy2¿·Ö×a»»Îa×Ö·û′®
str1[len++] = '.'; //ìí¼óD¡êyμã
decT = (decT*10) / 16; //¶t½øÖÆμÄD¡êy2¿·Ö×a»»Îa1λꮽøÖÆÎ»
str1[len++] = decT + '0'; //ꮽøÖÆD¡êyλÔù×a»»ÎaASCII×Ö·û
while (len < 6) //óÿոñ21Æëμ½6¸ö×Ö·û3¤¶è
{
str1[len++] = ' ';
}
str1[len] = '\0'; //ìí¼ó×Ö·û′®½áêø·û
LcdShowStr(10, 1, str1); //ÏÔê¾μ½òo¾§ÆáéÏ
LcdWriteCmd(0x80+0x40+14);
LcdWriteDat(0xdf);
LcdWriteDat('C');
}
else //¶áè¡ê§°üê±£¬ìáê¾′íÎóDÅÏ¢
{
LcdShowStr(10, 1, "error!");
}
Start18B20(); //ÖØDÂÆô¶ˉÏÂò»′Î×a»»
}
if (flag200ms) //ÿ200ms¶áè¡òà′Îê±¼ä
{
flag200ms = 0;
DS1302BurstRead(time); //¶áè¡DS1302μ±Ç°ê±¼ä
if (psec != time[0]) //¼ì2aμ½ê±¼äóD±ä»ˉê±Ë¢DÂÏÔê¾
{
str[0] = '2'; //ìí¼óÄê·Yμĸß2λ£o20
str[1] = '0';
str[2] = (time[6] >> 4) + '0'; //¡°Äꡱ¸ßλêy×Ö×a»»ÎaASCIIÂë
str[3] = (time[6]&0x0F) + '0'; //¡°Äꡱμíλêy×Ö×a»»ÎaASCIIÂë
str[4] = '-'; //ìí¼óèÕÆú·Ö¸ô·û
str[5] = (time[4] >> 4) + '0'; //¡°Ô¡±
str[6] = (time[4]&0x0F) + '0';
str[7] = '-';
str[8] = (time[3] >> 4) + '0'; //¡°èÕ¡±
str[9] = (time[3]&0x0F) + '0';
str[10] = '\0';
LcdShowStr(0, 0, str); //ÏÔê¾μ½òo¾§μÄμúò»DD
str[0] = (time[5]&0x0F) + '0'; //¡°DÇÆú¡±
str[1] = '\0';
LcdShowStr(11, 0, "week");
LcdShowStr(15, 0, str); //ÏÔê¾μ½òo¾§μÄμúò»DD
str[0] = (time[2] >> 4) + '0'; //¡°ê±¡±
str[1] = (time[2]&0x0F) + '0';
str[2] = ':'; //ìí¼óê±¼ä·Ö¸ô·û
str[3] = (time[1] >> 4) + '0'; //¡°·Ö¡±
str[4] = (time[1]&0x0F) + '0';
str[5] = ':';
str[6] = (time[0] >> 4) + '0'; //¡°Ã롱
str[7] = (time[0]&0x0F) + '0';
str[8] = '\0';
LcdShowStr(1, 1, str); //ÏÔê¾μ½òo¾§μÄμú¶tDD
psec = time[0]; //óÃμ±Ç°Öμ¸üDÂéÏ′ÎÃëêy
}
}
}
}
/* ÕûDíêy×a»»Îa×Ö·û′®£¬str-×Ö·û′®Ö¸Õ룬dat-′y×a»»êy£¬·μ»ØÖμ-×Ö·û′®3¤¶è */
unsigned char IntToString(unsigned char *str, int dat)
{
signed char i = 0;
unsigned char len = 0;
unsigned char buf[6];
if (dat < 0) //èç1ûÎa¸oêy£¬ê×Ïè衾ø¶ÔÖ죬2¢ÔúÖ¸ÕëéÏìí¼ó¸ooÅ
{
dat = -dat;
*str++ = '-';
len++;
}
do { //Ïè×a»»ÎaμíλÔúǰμÄꮽøÖÆêy×é
buf[i++] = dat % 10;
dat /= 10;
} while (dat > 0);
len += i; //i×îoóμÄÖμ¾íêÇóDD§×Ö·ûμĸöêy
while (i-- > 0) //½«êy×éÖμ×a»»ÎaASCIIÂë·′Ïò¿½±′μ½½óêÕÖ¸ÕëéÏ
{
*str++ = buf[i] + '0';
}
*str = '\0'; //ìí¼ó×Ö·û′®½áêø·û
return len; //·μ»Ø×Ö·û′®3¤¶è
}
/* T0ÖD¶Ï·tÎñoˉêy£¬íê3é1Ãë¶¨ê± */
void InterruptTimer0() interrupt 1
{
static unsigned char tmr1s = 0;
TH0 = T0RH; //ÖØD¼óÔØÖØÔØÖμ
TL0 = T0RL;
tmr1s++;
if (tmr1s >= 100) //¶¨ê±1s
{
tmr1s = 0;
flag1s = 1;
}
}
/* T1ÖD¶Ï·tÎñoˉêy£¬Ö′DD200ms¶¨ê± */
void InterruptTimer1() interrupt 3
{
static unsigned char tmr200ms = 0;
TH1 = T1RH; //ÖØD¼óÔØÖØÔØÖμ
TL1 = T1RL;
tmr200ms++;
if (tmr200ms >= 200) //¶¨ê±200ms
{
tmr200ms = 0;
flag200ms = 1;
}
}
|
|