最近又搞了一个51的小玩意,出入管理系(DS1990A,LCD1602,AT24C02,DS1302)




其实就是一个简单的门禁,不过这当中有用到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]);
}
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值