其实就是一个简单的门禁,不过这当中有用到DS1990A,DS1302,AT24C02,里面的时序部分还是有一定考究,有I2C,SPI。显示用的是LCD1602简单方便你懂得。
#include <reg51.h>
#include <intrins.h>
#include <lcd.h>
#include <ds1302.h>
#include"i2c.h"
#define uchar unsigned char
#define uint unsigned int
#define right 1
//??
#define error 0
//??
// sbit ACC0=ACC^0;
// sbit ACC7=ACC^7;
sbit DQ=P1^0;
//DS1990A?????
//sbit SDA=P2^1;
//2402?????//???
//sbit SCL=P2^0;
//2402?????//???
sbit DS1302_RST=P3^5;
//DS1302?????//*
sbit DS1302_CLK=P3^6;
//DS1302?????//*
sbit DS1302_IO=P3^4;
//DS1302?????//*
//sbit din=P2^0;
//MAX7221?????
//sbit load=P2^1;
//MAX7221?????
//sbit clk=P2^2;
//MAX7221?????
sbit Lock=P1^5;
//????????
sbit add = P2^2;
//Ìí¼Ó
sbit del = P2^3;
//ɾ³ý
uchar code CrcTable[256]={
0,94,188,226,97,63,221,131,194,156,126,32,163,253,31,65,
157,195,33,127,252,162,64,30,95,1,227,189,62,96,130,220,
35,125,159,193,66,28,254,160,225,191,93,3,128,222,60,98,
190,224,2,92,223,129,99,61,124,34,192,158,29,67,161,255,
70,24,250,164,39,121,155,197,132,218,56,102,229,187,89,7,
219,133,103,57,186,228,6,88,25,71,165,251,120,38,196,154,
101,59,217,135,4,90,184,230,167,249,27,69,198,152,122,36,
248,166,68,26,153,199,37,123,58,100,134,216,91,5,231,185,
140,210,48,110,237,179,81,15,78,16,242,172,47,113,147,205,
17,79,173,243,112,46,204,146,211,141,111,49,178,236,14,80,
175,241,19,77,206,144,114,44,109,51,209,143,12,82,176,238,
50,108,142,208,83,13,239,177,240,174,76,18,145,207,45,115,
202,148,118,40,171,245,23,73,8,86,180,234,105,55,213,139,
87,9,235,181,54,104,138,212,149,203,41,119,244,170,72,22,
233,183,85,11,136,214,52,106,43,117,151,201,74,20,246,168,
116,42,200,150,21,75,169,247,182,232,10,84,215,137,107,53
};
//??????
uchar code ID[]={
0x01, 0x03, 0xcf, 0xb0,
0x01, 0x00, 0x00, 0x13};
//???????ID
uchar ID1[]={
0x01,0x03,0x39,0xe4,
0x01,0x00,0x00,0xff};
//???????ID
uchar ID2[]={0,0,0,0,0,0,0,0};
//???????ID
bit flag=0;
uchar CRCbyte,num=200,da_ad=0x00;
//CRC???,2402????
uchar SN[8];//time[6];
uchar buf[]={0,0,0,0,0,0,0,0};
uchar opened[] = {"__It is User!___"};
//Óû§´ò¿ªÃÅ16
uchar danger[] = {" It is danger!!!"};
//ΣÏÕ 16
// uchar out[] = {" get out!"};
//¹ö¶¿×Ó 12
uchar wel[] = {"____Welcome!____"};
//»¶Ó½çÃæ 16
uchar clear[] = {" "};
//ÇåÆÁ 16
/******************????*******************/
void Init_DS1302(void);
//DS1302???
void Init_DS1990(void);
//DS1990???
void Init_T0(void);
//???T0???
void Delay(uint i);
//????
void Writebyte(uchar dat);
//?DS1990A???????
void Record(void);
//??????
void Start_bit(void);
//I2C????
void Stop_bit(void);
//I2C????
int Compare(void);
//??????
bit Read1990(void);
//???????
bit Write_8bit(uchar ch);
//I2C???8?????
uchar CRC(uchar j);
//DS1990A???????
uchar Readbyte(void);
//?DS1990A???????
uchar Page_wr(uchar firstw_ad,uchar counter,uchar *firstr_ad);//I2C???????
void Delay10ms(unsigned int c); //??10ms
void welc();
//ÕýÈ·´ò¿ªÃÅʱÏìÓ¦
void warn();
//´íÎó´ò¿ªÃÅʱÏìÓ¦
void LcdDisplay();
void Lcd_Clear();
void At24c02Write(unsigned char addr,unsigned char dat);
unsigned char At24c02Read(unsigned char addr);
void read();
void write();
/******************???*******************/
void main()
{
uchar i;
LcdInit();
Ds1302Init();
Lock=0;
Delay10ms(100);
Lock=1;
//Init_MAX7221();
//Init_DS1302();
//Init_T0();
//P2=0;
while (1)
{
Ds1302ReadTime();
LcdDisplay();
if(Compare()==1)
//??????
{
welc();
}
else if(Compare()==2)
{
LcdWriteCom(0x80);
for(i=0;i<16;i++)
{
LcdWriteData(wel[i]);
}
}
else
{
warn();
}
}
}
/**************T0¶¨Ê±Æ÷³õʼ»¯******************/
void Init_T0(void)
{
TMOD=0x01;
//????1
TH0=(65536-50000)/256;
//?????0.5ms
TL0=(65536-50000)%256;
EA=1;
//????
ET0=1;
//?????T0??
}
/**************T0·þÎñ³ÌÐò******************/
void timer0(void) interrupt 1
{
TH0=(65536-50000)/256;
//????
TL0=(65536-50000)%256;
num--;
if(num==0)
//5????
{
TR0=0;
//????T0
num=200;
//???????
Lock=0;
//?????
}
}
void LcdDisplay()
{
LcdWriteCom(0x80+0X40);
LcdWriteData('0'+TIME[2]/16);
//ʱ
LcdWriteData('0'+(TIME[2]&0x0f));
LcdWriteData('-');
LcdWriteData('0'+TIME[1]/16);
//·Ö
LcdWriteData('0'+(TIME[1]&0x0f));
LcdWriteData('-');
LcdWriteData('0'+TIME[0]/16);
//Ãë
LcdWriteData('0'+(TIME[0]&0x0f));
/*****************????******************/
void Delay(uint i)
{
while (i--);
}
/***********DS1990A???????***********/
uchar CRC(uchar j)
{
uchar i,crc_data=0;
for (i=0;i<j;i++)
//????
crc_data=CrcTable[crc_data^SN[i]];
return(crc_data);
}
/*************DS1990A?????*************/
void Init_DS1990(void)
{
uchar i,x=0;
DQ=0;
//??
Delay(60);
//??480us
DQ=1;
//??
Delay(10);
//??85us
for (i=0;i<10;i++)
{
if (DQ==0)
//????
{
flag=1;
break;
}
}
Delay(20);
}
/***********?DS1990A???????*********/
uchar Readbyte(void)
{
uchar i=0;
uchar temp=0;
for (i=0;i<8;i++)
{
DQ=0;
temp>>=1;
DQ=1;
_nop_();
if (DQ)temp|=0x80;
Delay(8);
}
return(temp);
}
/**********?DS1990A???????**********/
void Writebyte(uchar dat)
{
uchar i=0,send;
for (i=0;i<8;i++)
{
DQ=0;
send=dat&0x01;
if (send==0x01)
{
DQ=1;
Delay(15);
}
else
{
Delay(15);
DQ=1;
}
dat>>=1;
}
Delay(8);
}
/*************???????****************/
bit Read1990(void)
{
uchar i;
Init_DS1990();
if (flag==1)
{
while (DQ==0);
flag=0;
Writebyte(0x33);
for (i=0;i<8;i++)
SN[i]=Readbyte();
CRCbyte=CRC(7);
if (CRCbyte==SN[7])
{
return(right);
}
else
return(error);
}
else
return(error);
}
/****************??????***************/
int Compare(void)
{
uchar i;
if (Read1990()==1)
//?????????1,????0
{
for (i=0;i<8;i++)
{
if (SN[i]!=ID[i])
{
return(error);
}
}
return(right);
}
else
return(2);
}
/*******************************************************************************
* ? ? ? : Delay10ms
* ????
: ????,??10ms
* ? ? : ?
* ? ? : ?
*******************************************************************************/
void Delay10ms(unsigned int c) //?? 0us
{
unsigned char a, b;
//--c???????????????,???for???????????--//
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}
}
}
/*******************************************************************************
* º¯ Êý Ãû : void wel()
* º¯Êý¹¦ÄÜ
: Óû§´ò¿ªÃÅ
* Êä Èë : ÎÞ
* Êä ³ö : ÎÞ
*******************************************************************************/
void welc()
{
uint i;
LcdWriteCom(0x80);
for(i=0;i<16;i++)
{
LcdWriteData(opened[i]);
}
}
/*******************************************************************************
* º¯ Êý Ãû : void warn()
* º¯Êý¹¦ÄÜ
: Ä°ÉúÓû§´ò¿ªÃÅ
* Êä Èë : ÎÞ
* Êä ³ö : ÎÞ
*******************************************************************************/
void warn()
{
uint i;
LcdWriteCom(0x80);
for(i=0;i<16;i++)
{
LcdWriteData(danger[i]);
}
}
/*******************************************************************************
* º¯ Êý Ãû : void warn()
* º¯Êý¹¦ÄÜ
: Ä°ÉúÓû§´ò¿ªÃÅ
* Êä Èë : ÎÞ
* Êä ³ö : ÎÞ
*******************************************************************************/
void Lcd_Clear()
{
uint i;
Delay10ms(1);
for(i=0;i<16;i++)
{
LcdWriteData(clear[i]);
}
Delay10ms(1);
}
/*******************************************************************************
* º¯ Êý Ãû : void At24c02Write(unsigned char addr,unsigned char dat)
* º¯Êý¹¦ÄÜ
: Íù24c02µÄÒ»¸öµØַдÈëÒ»¸öÊý¾Ý
* Êä Èë : ÎÞ
* Êä ³ö : ÎÞ
*******************************************************************************/
void At24c02Write(unsigned char addr,unsigned char dat)
{
I2C_Start();
I2C_SendByte(0xa0, 1);//·¢ËÍдÆ÷¼þµØÖ·
I2C_SendByte(addr, 1);//·¢ËÍҪдÈëÄÚ´æµØÖ·
I2C_SendByte(dat, 0);
//·¢ËÍÊý¾Ý
I2C_Stop();
}
/*******************************************************************************
* º¯ Êý Ãû : unsigned char At24c02Read(unsigned char addr)
* º¯Êý¹¦ÄÜ
: ¶ÁÈ¡24c02µÄÒ»¸öµØÖ·µÄÒ»¸öÊý¾Ý
* Êä Èë : ÎÞ
* Êä ³ö : ÎÞ
*******************************************************************************/
unsigned char At24c02Read(unsigned char addr)
{
unsigned char num;
I2C_Start();
I2C_SendByte(0xa0, 1); //·¢ËÍдÆ÷¼þµØÖ·
I2C_SendByte(addr, 1); //·¢ËÍÒª¶ÁÈ¡µÄµØÖ·
I2C_Start();
I2C_SendByte(0xa1, 1); //·¢ËͶÁÆ÷¼þµØÖ·
num=I2C_ReadByte(); //¶ÁÈ¡Êý¾Ý
I2C_Stop();
return num;
}
void read()
{
uint i;
for(i=0;i<8;i++)
{
ID2[i] = At24c02Read(0x00+i);
}
}
void write()
{
uint i;
for(i=0;i<8;i++)
{
At24c02Write(0x00+i,ID1[i]);
}
}