久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2254|回復: 1
打印 上一主題 下一主題
收起左側

有沒有大神來指導下,為什么p2.3口的電平不產生跳變,在二次輸入密碼時跳變為低電平?

[復制鏈接]
跳轉到指定樓層
樓主
這是一個電子密碼鎖的程序,初始密碼輸入后選擇1在輸入密碼,這時P2.3卻無法變為低電平,請大神看看有什么問題


#include<reg51.h>
#include<intrins.h.>
#define uchar unsigned char
#define uint unsigned int

sbit RS = P2^0;
sbit RW = P2^1;
sbit E = P2^2;
sbit P2_3 = P2^3;
sbit P2_4 = P2^4;
sbit P2_5 = P2^5;
sbit reset = P2^6;
sbit Sound = P2^7;
sbit scl = P3^6;
sbit sda = P3^7;
sbit led = P3^0;


uchar scan_1[6];
uchar password_1[7];
uchar newpassword_1[6];
uchar password_4[7]={0,0,0,0,0,0,1};
uchar code scan[6]={"******"};
uchar code table[]={0x7b,0xed,0xeb,0xe7,0xdd,0xdb,0xd7,0xbd,0xbb,0xb7,0x7d,0x77};
uchar code table1[]={"Input Code"};
uchar code table2[]={"Function Select"};
uchar code table3[]={"Input Code Again"};
uchar code table4[]={"[1]Open [2]Reset"};
uchar code table5[]={"Input New Code"};
uchar code table6[]={"Comfirm New Code"};
uchar code table7[]={"Success!"};
uchar code table8[]={"Failure!"};
uchar code table9[]={"Warning!"};

uchar code Array1[]={ 0x1C, 0x20,0x20, 0x20,0x1C,0x20,0x18,0x20, 0x20,0x80,0xFF,0x20};


void Read_Code(uchar password[],uchar address,uchar num);
void Write_Code(uchar Data[],uchar address,uchar num);
void Start();
void stop();
void Ack();
void NoAck();
uchar read_byte();
void write_byte(uchar date);
void lcd_init();
void write_com(uchar com);
void write_data(uchar date);
void delay();
void delay_ms(uint z);
void print(uchar tab[],uchar len,uchar loc,bit res);
void num9();
void num10();
void num11();
void Test1();
void Test2();

void Sound_Delay(uchar n);
void Music();
void Alarm();
void Music1();
void errorMusic(uint t);

char scan_num=-1;           //鍵盤號數
uchar scan_len=0;           //輸入數的長度
uchar yes,key,flag;

uchar Sound_Signal;//定義音符大小
uchar Sound_Pace;//定義節拍大小
uchar Counter1;
uchar error;

void main()
{
        P2_3 = 1;                  //密碼鎖關
        P2_4 = 1;
        P2_5 = 1;
        Sound = 1;

        EA=1;                          //開總中斷
        EX0=1;                          //開外部中斷0
        IT0=1;                          //中斷0下降沿觸發

        TMOD=0x01;              //定時器0工作方式1
        TH0=0xff;
        TL0=0xff;
        ET0=1;                          //開定時器0中斷

       

        P1=0xf0;

        led = 1;
       
        if( reset == 0)          //如果鍵按下,則密碼清零,恢復出廠設置
                Write_Code(password_4,0,6);       
       
        Read_Code(password_1,0,7);                  //從24C02中讀密碼

        if(password_1[6] == 1)            //之前對各卡的第七位分別寫入1,2,3
                flag = 1;
        if(password_1[6] == 2)
                flag = 2;
        if(password_1[6] == 3)
                flag = 3;

        lcd_init();                                                  //LCD初始化
        while(1)
        {
                if(scan_num!=-1)
                {
                       
                        if(scan_num<=9)
                        {
                               
                                num9();       //數字0~9處理
                               
                        }
                        if(scan_num==10)
                        {
                                num10();      //刪除
                               
                        }
                        if(scan_num==11)
                        {       
                                if(scan_len == 6)
                                {
                                        num11();      //確定
                                        Music();
                                        if(key == 2)   //再次輸入新密碼后確認鍵
                                        {
                                                key = 0;
                                                Test2();
                                                return;
                                        }
                                        Test1();          //提示"Input Code"輸入的密碼確認后判斷是否正確               
                                }                                                               
                        }
                }
        }
}

void Read_Code(uchar password[],uchar address,uchar num)           //從24C02中讀數據
{
        uchar i;
        for(i=0;i<num;i++)
        {  
                Start();                                            //開始信號
                write_byte(0xa0);                            //寫控制字
                Ack();                                                    //應答信號
                write_byte(address+i);                        //讀地址
                Ack();                                                    //應答信號
                Start();                                            //開始信號
                write_byte(0xa1);                            //讀控制字
                Ack();                                                //應答信號
                password[i] = read_byte();      //讀數據
                NoAck();                                                //非應答信號
                stop();                                          //停止信號
        }
}

void Write_Code(uchar Data[],uchar address,uchar num)        //把數據寫到24C02
{
        uchar i;
        for(i=0;i<num;i++)
        {  
                Start();                                        //開始信號
                write_byte(0xa0);                        //寫控制字
                Ack();                                                //應答信號
                write_byte(address+i);                //寫地址
                Ack();                                                //應答信號
                write_byte(Data[i]);                //寫數據
                Ack();                                                //應答信號
                stop();                                                //停止信號
                delay_ms(10);
        }  
}

void Start()                  //開始信號
{
        sda = 1;
        delay();
        scl = 1;
        delay();
        sda = 0;
        delay();
}

void stop()                    //停止信號
{
        sda = 0;
        delay();
        scl = 1;
        delay();
        sda = 1;
        delay();
}

void Ack()                         //應答信號
{
        uchar i;
        scl = 1;
        delay();
        while((sda == 1)&&(i < 250))
                i++;
        scl = 0;
        delay();       
}

void NoAck()  //非應答信號
{
        sda=1;
        delay();
        scl=1;
        delay();
        scl=0;
        delay();
}

uchar read_byte()         //讀字節數據
{
        uchar i,k;
        scl = 0;
        delay();
        sda = 1;
        delay();
        for(i = 0;i < 8;i++)
        {
                scl = 1;
                delay();
                k = (k<<1)|sda;
                scl = 0;
                delay();
        }
        return k;
}

void write_byte(uchar date)                //寫字節數據
{
        uchar i,temp;
        temp = date;
        for(i = 0;i < 8;i++)
        {
                temp = temp<<1;
                scl = 0;
                delay();
                sda = CY;
                delay();
                scl = 1;
                delay();
        }
        scl = 0;
        delay();
        sda = 1;
        delay();       
}

void lcd_init()
{
        //uchar i;
        write_com(0x38);                //設置16*2顯示,5*7點陣,8位數據接口
        write_com(0x0c);                //設置開顯示,不顯示光標
        write_com(0x06);                //寫一個字符后地址指針加1
        write_com(0x01);                //顯示清0,數據指針清0
        write_com(0x80 + 0x03);        //設置數據地址指針位置
        /*for(i = 0;i <10;i++)
        {
                write_data(table1[i]);
                delay_ms(5);
        }與下句語句等價 */
        print(table1,10,0x83,1); //LCD顯示“Input Code”
}

/*LCD顯示,輸出函數*/
void print(uchar tab[],uchar len,uchar loc,bit res)       
{
        uchar i,n;
        if(res==1)
        {
                write_com(0x01);             //光標復位               
        }
        write_com(loc);                         //設置顯示起始位置
        for(n=0;n<len;n++)
        {
                i=tab[n];
                write_data(i);
        }
        for(n=len;n<6;n++)
        {
                write_data(32);                          //空格
        }
}

void write_com(uchar com)                 //向LCD寫命令
{
        RS = 0;
        RW = 0;
        P0 = com;
        delay_ms(5);
        E = 1;
        delay_ms(5);
        E = 0;       
}

void write_data(uchar date)                 //向LCD寫數據
{
        RS = 1;
        RW = 0;
        P0 = date;
        delay_ms(5);
        E = 1;
        delay_ms(5);
        E = 0;
}

/*按下鍵盤產生中斷,中斷程序*/
void EX_INT0() interrupt 0
{
        uchar aa,bb,i,j;
        EA = 0;                  //關總中斷
        P1 = 0xf0;
        if((P1 & 0xf0) != 0xf0)
        {
                delay_ms(5);
                if((P1 & 0xf0) != 0xf0)
                {
                        aa = 0xfe;
                        for(i = 0;i < 4;i++)
                        {
                                P1 = aa;
                                if((P1 & 0xf0) != 0xf0)
                                {       
                                        bb = P1;
                                        for(j=0;j<16;j++)
                                        {
                                                if(bb == table[j])
                                                {   
                                                        scan_num = j;
                                                }
                                        }
                                }
                                else
                                        aa = _crol_(aa,1);       
                        }
                }
        }
        P1 = 0xf0;
        EA=1;                 //開總中斷
}

/*輸入數字0~9處理函數*/
void num9()
{
        uchar i;
       
        if(scan_len>5)
                return;
       
        if(yes == 1)                  // 提示“Input Code”輸入正確密碼后
        {
               
                if(scan_num == 1)           //鍵1開鎖鍵
                {
                        Music();
                        yes = 0;
                        scan_num=-1;
                        if(flag == 1)
                        {       
                                flag = 0;
                                P2_3 = 0;
                        }
                        if(flag == 2)
                        {       
                                flag = 0;
                                P2_3 = 0;
                                P2_4 = 0;
                        }
                        if(flag == 3)
                        {       
                                flag = 0;
                                P2_3 = 0;
                                P2_4 = 0;
                                P2_5 = 0;
                        }
                        print(table1,10,0x83,1); //LCD顯示“Input Code”
                }
                if(scan_num == 2)                //鍵2設置新密碼
                {
                        Music();
                        yes = 0;
                        print(table5,14,0x81,1); //LCD顯示“Input New Code”
                        scan_num=-1;
                        key = 1;
                }return;       
        }
        Music();
        scan_1[scan_len] = scan_num;
        //scan[scan_len] = scan_num + 48;
        scan_len++;
        print(scan,scan_len,0xc5,0);          //顯示密碼值
        scan_num=-1;
        if(key == 1)                  //輸入6位新密碼后,提示“Comfirm New Code”
        {
                if(scan_len == 6)
                {
                        scan_len = 0;
                        for(i = 0;i < 6;i++)
                                newpassword_1[i] = scan_1[i];       
                        key = 2;
                        print(table6,16,0x80,1);            //LCD顯示“Comfirm New Code”
                }
        }                        
}

/*刪除鍵*/
void num10()
{
        if(scan_len>0)
        {
                Music();
                scan_len=scan_len-1;//字符串的長度減少一位
                print(scan,scan_len,0xc5,0);  //顯示輸入值刪除一位后的新值
                scan_num=-1;
        }
}

/*確認鍵*/
void num11()
{
//        if(scan_len == 0)
//        {
//                return;
//        }
        scan_num=-1;
        scan_len=0;
}

void Test1()         //輸入的密碼是否正確
{
        uchar i;
        if((password_1[0]==scan_1[0])&&(password_1[1]==scan_1[1])&&(password_1[2]==scan_1[2])&&(password_1[3]==scan_1[3])&&(password_1[4]==scan_1[4])&&(password_1[5]==scan_1[5]))
        {
                yes=1;
                print(table2,15,0x81,1);
                print(table4,16,0xc0,0);
        }                 
        else
        {
                yes=0;
                print(table3,16,0x80,1); //LCD顯示“Input Code Again”
                error++;
                if(error == 3)
                {
                        error = 0;
                        print(table9,8,0x84,1); //LCD顯示“Warning!”
                        for(i = 0;i < 10;i++ )
                        {
                                errorMusic(90);
                                errorMusic(120);
                                led = ~led;
                        }
                        delay_ms(1000);
                        led = 1;
                        print(table1,10,0x83,1); //LCD顯示“Input Code”
                }

        }
}

void Test2()                          //修改密碼時兩次輸入的密碼是否相同
{
        if((newpassword_1[0]==scan_1[0])&&(newpassword_1[1]==scan_1[1])&&(newpassword_1[2]==scan_1[2])&&(newpassword_1[3]==scan_1[3])&&(newpassword_1[4]==scan_1[4])&&(newpassword_1[5]==scan_1[5]))
        {
                Write_Code(newpassword_1,0,6);        //向24c02寫入新密碼
                print(table7,8,0x84,1); //LCD顯示“Success!”
                Alarm();
                delay_ms(1000);
                Read_Code(password_1,0,6);
                print(table1,10,0x83,1); //LCD顯示“Input Code”
        }
        else
        {
                print(table8,8,0x84,1); //LCD顯示“Failure!”
                Music1();
                delay_ms(1000);
                print(table1,10,0x83,1); //LCD顯示“Input Code”
        }
}

void timer0(void) interrupt 1 using 1
{
        Counter1++;        //節拍次數計數
        TH0=0xd8; //定義單位節拍的延時大小
        TL0=0xef;
}

void Music()                         //按鍵聲
{
        Sound_Signal=Array1[0];
        Sound_Pace=Array1[1];
        TR0=1;
        //當節拍數未達到時候,繼續循環,產生該音調的聲音
        while(Counter1!=Sound_Pace)
        {   
                Sound=~Sound;
                Sound_Delay(Sound_Signal);
        }
        Counter1=0;//節拍計數器置0,進入下一個音調
        TR0=0;
}

void Alarm()                                  //設置密碼成功后的聲音
{  
        Sound_Signal=Array1[2];
        Sound_Pace=Array1[3];
        TR0=1;
        //當節拍數未達到時候,繼續循環,產生該音調的聲音
        while(Counter1!=Sound_Pace)
        {   
                Sound=~Sound;
                Sound_Delay(Sound_Signal);
        }
        // i++;
        Counter1=0;//節拍計數器置0,進入下一個音調
        TR0=0;
}

void Music1()                  //設置密碼失敗后的聲音
{
        uchar i=0;
        while(i<14)
        {
                Sound_Signal=Array1[i];
                Sound_Pace=Array1[++i];
                TR0=1;                  //開定時器T0
                while(Counter1!=Sound_Pace)
                {
                        Sound=~Sound;
                        Sound_Delay(Sound_Signal);
                }
                Counter1=0;
                TR0=0;
                i++;
        }
}

void errorMusic(uint t)
{
        uchar i,j;
        for(i=0;i<100;i++)
        {
                Sound=~Sound;
                for(j=0;j<t;j++);
        }
}

void Sound_Delay(uchar n)
{  
        uchar i;
        while(n--)
        {  
                for(i=0;i<2;i++);
        }
}

void delay()
{
        uchar i,j;
        for(i=1;i>0;i--)
                for(j=20;j>0;j--);
}


void delay_ms(uint z)
{
        uint x,y;
        for(x = z;x > 0;x--)
                for(y = 110;y > 0;y--);
}       


12.png (48.08 KB, 下載次數: 90)

p2.3應產生跳變與1N4001連接使二極管亮起來

p2.3應產生跳變與1N4001連接使二極管亮起來
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:212728 發表于 2017-12-24 16:38 | 只看該作者
不是1N4001而是74ls04連接
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲福利在线观看 | 日本网站免费在线观看 | 久久久婷| 国产亚洲www | 视频一区 国产精品 | 国产一区二 | 久久综合久久久 | 99免费看 | 成人亚洲精品久久久久软件 | 国产精品久久久久久一区二区三区 | 日韩欧美国产精品综合嫩v 一区中文字幕 | 国产成人精品一区二区 | 日韩欧美在线不卡 | 毛片网在线观看 | 久久一区二区视频 | 国产激情三区 | 一级黄色片免费在线观看 | 天天拍天天操 | 久久精品国产亚洲 | 日本久久久影视 | 色婷婷久久久亚洲一区二区三区 | 夜夜干夜夜操 | 黄色毛片在线播放 | 国产精品国产a | 一区二区久久 | 日韩1区 | 欧州一区二区三区 | 91中文在线观看 | 久久九精品 | 日韩免费毛片 | 91一区二区三区 | 久久久久久久一区 | av香港经典三级级 在线 | 国产精品欧美一区二区三区 | 蜜桃免费一区二区三区 | 欧美精品一区在线发布 | 国产原创视频 | 黄网免费 | 国产精品国产三级国产aⅴ中文 | 久久一级大片 | 国产精品呻吟久久av凹凸 |