找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 962|回复: 0
打印 上一主题 下一主题
收起左侧

基于AD电位器采集的电子密码锁

[复制链接]
跳转到指定楼层
楼主
ID:957231 发表于 2021-7-28 20:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
       
sbit SCL = P2^1;
sbit SDA = P2^0;

sbit RS = P2^6;
sbit RW = P2^5;
sbit EN = P2^7;

sbit DCLK = P3^6;
sbit DIN = P3^4;
sbit CS = P3^5;
sbit DOUT = P3^7;

sbit key1 = P3^1;
sbit key2 = P3^0;
sbit key3 = P3^2;
sbit key4 = P3^3;

uchar sec1,sec2,sec3,sec4,t,i;
int s = 0, k=0, wei = 0,NEW1,NEW2,NEW3,NEW4,old1,old2,old3,old4,wei1,k1;

uchar table1[] = "WELCOME";
uchar table2[] = "LOCK";
uchar table3[] = "Input Password:";
uchar table4[] = "CONGRATULATIONS";
uchar table5[] = "ERROR";
uchar table6[] = "Change Password";
uchar table7[] = "Seting Over";
uchar table8[] = "0000";

void delay5us()
{
     ;;
}

void delayms(uint xms)
{
     int i,j;
        for(i=xms;i>0;i--)
            for(j=114;j>0;j--);
}


void init()
{
    SDA = 1;
    delay5us();
        SCL = 1;
        delay5us();
}

void start()
{
    SDA = 1;
        delay5us();
        SCL = 1;
        delay5us();
        SDA = 0;
        delay5us();
}

void respons()
{
    uchar i = 0;
        SCL = 1;
        delay5us();
        while((SDA==1)&&(i<250))
                i++;
        SCL = 0;
        delay5us();
}

void stop()
{
    SDA = 0;
        delay5us();
        SCL = 1;
    delay5us();
    SDA = 1;
    delay5us();       
}

void writebyte(uchar DAT)   //发送
{
        uchar i,temp;
       
        temp = DAT;
    for(i=0;i<8;i++)
    {
                temp = temp<<1;
            SCL = 0;
                delay5us();
        SDA = CY;
        delay5us();
        SCL = 1;
                delay5us();
        }
     SCL = 0;
     delay5us();
     SDA = 1;
     delay5us();       
}

uchar readbyte()            //接受
{
    uchar i,k;
       
        SCL = 0;
        delay5us();
        SDA = 1;
        delay5us();
        for(i=0;i<8;i++)
        {
                SCL = 1;
                delay5us();
                k = (k<<1)|SDA;
                SCL = 0;
                delay5us();
        }
        return (k);
}

void write_add(uchar address,uchar DAT)
{
    start();
        writebyte(0xA0);
        respons();
        writebyte(address);
        respons();
        writebyte(DAT);
        respons();
        stop();
}

uchar read_add(uchar address)
{
    uchar DAT;
    start();
    writebyte(0xA0);
    respons();
    writebyte(address);
    respons();
    start();
    writebyte(0xA1);
    respons();
    DAT = readbyte();
    stop();
    return(DAT);        
}

void write_com(int com)
{   
        EN = 0;
    RS = 0;
    RW = 0;
        P0 = com;
        delayms(1);
    EN = 1;
    delayms(5);
        EN = 0;
}

void write_date(int date)
{
        EN = 0;
    RS = 1;
    RW = 0;
        P0 = date;
        delayms(1);
        EN = 1;
        delayms(5);
        EN = 0;
}

void lcdset()
{
    write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);
}

void SPI_Write(uchar dat)
{
        uchar i;
        DCLK = 0;
        for(i=0; i<8; i++)
        {
                DIN = dat >> 7;         
                dat <<= 1;
                DCLK = 0;                       
                DCLK = 1;

        }
}

uint SPI_Read(void)
{
        uint i, dat = 0;
        DCLK = 0;
        for(i=0; i<12; i++)               
        {
                dat <<= 1;

                DCLK = 1;
                DCLK = 0;

                dat |= DOUT;

        }
        return dat;       
}

uint Read_AD_Data(uchar cmd)
{
        uchar i;
        uint AD_Value;
        DCLK = 0;
        CS  = 0;
        SPI_Write(cmd);
        for(i=6; i>0; i--);        
        DCLK = 1;                   
        _nop_();
        _nop_();
        DCLK = 0;
        _nop_();
        _nop_();
        AD_Value=SPI_Read();
        CS = 1;
        return AD_Value;       
}

void datapros()
{
        uint temp;
        static uint j;
        if(j==50)
        {
                j=0;
                temp = Read_AD_Data(0x94);               
        }
        j++;
       
    if(temp>0&&temp<400)
        {       
                t =0;
            sec1 = 0;
                sec2 = 0;
                sec3 = 0;
                sec4 = 0;
        }
        if(temp>400&&temp<800)
        {
                t =1;
                sec1 = 1;
                sec2 = 1;
                sec3 = 1;
                sec4 = 1;
        }
        if(temp>800&&temp<1200)
        {
                t =2;
                sec1 = 2;
                sec2 = 2;
                sec3 = 2;
                sec4 = 2;
        }
        if(temp>1200&&temp<1600)
        {
                t =3;
                sec1 = 3;
                sec2 = 3;
                sec3 = 3;
                sec4 = 3;
        }
        if(temp>1600&&temp<2000)
        {       
                t =4;
                sec1 = 4;
                sec2 = 4;
                sec3 = 4;
                sec4 = 4;
        }
        if(temp>2000&&temp<2400)
        {
                t =5;
                sec1 = 5;
                sec2 = 5;
                sec3 = 5;
                sec4 = 5;
        }
        if(temp>2400&&temp<2800)
        {
                t =6;
                sec1 = 6;
                sec2 = 6;
                sec3 = 6;
                sec4 = 6;
        }
        if(temp>2800&&temp<3600)
        {
                t =7;
                sec1 = 7;
                sec2 = 7;
                sec3 = 7;
                sec4 = 7;
        }
        if(temp>3600&&temp<4000)
        {
                t =8;
                sec1 = 8;
                sec2 = 8;
                sec3 = 8;
                sec4 = 8;
        }
        if(temp>4000&&temp<4400)
        {
                t =9;
                sec1 = 9;
                sec2 = 9;
                sec3 = 9;
                sec4 = 9;
        }
}

void display()
{
    if(s==0)
        {
           write_com(0x80);
           for(i=0;i<7;i++)
           {
          write_date(table1[i]);                 
           }
        }
       
        if(s==1)
        {
           write_com(0x80);
           for(i=0;i<14;i++)
           {
                   write_date(table3[i]);
           }
          
           write_com(0x80+0x40+k);
           write_date(0x30+t);
        }
       
        if(s==2)
        {
           write_com(0x80);
           for(i=0;i<15;i++)
           {
                   write_date(table4[i]);                  
           }
    }

    if(s==3)
        {               
           write_com(0x80);
           for(i=0;i<5;i++)
           {
                   write_date(table5[i]);
           }
    }

     if(s==4)
        {               
           write_com(0x80);
           for(i=0;i<15;i++)
           {
                   write_date(table6[i]);
           }
          
           write_com(0x80+0x46+k1);
           write_date(0x30+sec1);
          
           write_com(0x80+0x46+k1);
           write_date(0x30+sec2);
          
           write_com(0x80+0x46+k1);
           write_date(0x30+sec3);
          
           write_com(0x80+0x46+k1);
           write_date(0x30+sec4);
    }

    if(s==5)
        {               
           write_com(0x80);
           for(i=0;i<11;i++)
           {
                  write_date(table7[i]);
           }
    }          
}

void keyscan();
void check_password();

void main()
{
    init();
        lcdset();
       
        old1 = read_add(1);
        old2 = read_add(2);
        old3 = read_add(3);
        old4 = read_add(4);
//        if(sec > 100)              //防止首次读数据出错
//                sec = 0;
       
        while(1)
        {
                datapros();
                keyscan();
            display();
        }
}

void keyscan()
{       
    if(key1==0)
        {
            delayms(1);
                if(key1==0)
                {
                        lcdset();
                    s = 1;
                        display();
                while(!key1);
                }
         }
                  
         if(key2==0)
         {
             delayms(1);
                 if(key2==0)
                 {
                       
                        switch(wei)
                        {       
                                case 0: NEW1 = t; break;
                                case 1: NEW2 = t; break;
                            case 2: NEW3 = t; break;
                            case 3: NEW4 = t; break;
                        }
                       
                        wei++;
                        s = 1;
                    k++;
                    if(k>=4)
                           k=0;
                        display();
                                               
                        if(wei >=4)
                       check_password();
                       
                while(!key2);
                 }
          }
         
          if(key3==0)
          {
             delayms(1);
                 if(key3==0)
                 {
                        s = 4;
                while(!key3);
                 }
          }
          
                    
         if(key4==0)
         {
             delayms(1);
                 if(key4==0)
                 {
                       
                        switch(wei1)
                        {       
                                case 0: old1 = sec1;  write_add(1,old1);break;
                                case 1: old2 = sec2;  write_add(2,old2);break;
                            case 2: old3 = sec3;  write_add(3,old3);break;
                            case 3: old4 = sec4;  write_add(4,old4);break;
                        }
                       
                        wei1++;
                    k1++;
                    if(k1>=4)
                        {   
                           k1=0;
                        }
                        display();
                                               
                        if(wei1 >=4)
                    {
                                lcdset();
                            s = 5;
                                display();
                        }
                while(!key4);
                 }
          }
}

void check_password()
{
     if((NEW1==old1)&&(NEW2==old2)&&(NEW3==old3)&&(NEW4==old4))
         {
                 lcdset();
             s = 2;
                 display();
         }
         else
         {
             lcdset();
             s = 3;
                 display();
         }               
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表