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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機樓宇對講系統程序

[復制鏈接]
跳轉到指定樓層
樓主
原理圖

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

#define DUAN P0
#define WEI P1
#define KEYMATRIX P3
sbit ON=P1^0;//開關標志燈
sbit sure=P0^7;        //通話鍵
sbit KA=P1^7;
sbit KB=P1^6;
sbit KC=P1^5;
sbit INH=P1^4;
sbit OpenD=P3^7;        //開鎖鍵
sbit Beep=P3^0;                //呼叫響鈴
uchar dispbuf[8],dispcount;
uchar Key,result,password;
uint sum=0,temp;
uint num;        //等待變量
uchar code dispbitcode[]=
{0xfd,0xfb,0xf7,}; //共陽位碼表   
unsigned char code dispcode[]=
{
        0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0xff
}; //共陽段碼表
//0,1,2,3,4,5,6,7,8,9,A,b,C,c,d,E,F,-;NULL
void delay(uint z)//延時1ms子函數
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
void ledinit()/***初始化子函數,定時器0刷新顯示內容***/
{
        TMOD|=0x01;  //  定時器0方式1
        TH0=(65536-5000)/256;
        TL0=(65536-5000)%256;
        TR0=1;
        ET0=1;
        EA=1;        
}
/***顯示子函數**/
void leddisp(uint x)
{
        dispbuf[0]=x%10;         
        dispbuf[1]=x/10%10;                 
        dispbuf[2]=x/100;
}
unsigned char Keyscan(void) //按鍵掃描程序 P2.0--P2.3為行線 P2.4--P2.7為列線
{
        unsigned char rcode, ccode;
        KEYMATRIX = 0xF1;      // 發全0行掃描碼,列線輸入
        Beep=1;
        if((KEYMATRIX & 0xF1) != 0xF1) // 若有鍵按下
                {
                delay(5);// 延時去抖動
                Beep=1;
                if((KEYMATRIX & 0xF1) != 0xF1)
                        {
                        rcode = 0xFd;         // 逐行掃描初值
                        while((rcode & 0x10) != 0)
                                {
                                KEYMATRIX = rcode;         // 輸出行掃描碼
                                if((KEYMATRIX & 0xF1) != 0xF1) // 本行有鍵按下
                                        {
                                        ccode = (KEYMATRIX & 0xF0) | 0x0F;
                                        while((KEYMATRIX & 0xF1) != 0xF1); //等待鍵釋放
                                        Beep=1;
                                        return ((~rcode) + (~ccode)); // 返回鍵編碼
                                        }
                                else
                                        rcode = (rcode<<1)|0x01; // 行掃描碼左移一位
                                }
                        }
                }
        Beep=1;
        return 0; // 無鍵按下,返回值為0
}
Keyresult(unsigned char key)
{
   switch(key)
   {
/*   case 0x11: return(7); break;
   case 0x21: return(8); break;
   case 0x41: return(9); break;                  */
//  case 0x81: return(?); break;
   case 0x12: return(4); break;
   case 0x22: return(5); break;
   case 0x42: return(6); break;
//   case 0x82: return(7); break;
   case 0x14: return(1); break;
   case 0x24: return(2); break;
   case 0x44: return(3); break;
//  case 0x84: return(11); break;
   case 0x18: return(12); break;//*
   case 0x28: return(0); break;
   case 0x48: return(14); break;//#
//  case 0x88: return(15); break;
   default: break;
   }
}
void alarm()
{
        for(temp=0;temp<5;temp++)
        {
                P2=0X00;
                delay(200);
                P2=0XFF;
                delay(200);
        }
}
void hujiao()         //呼叫聲        
{
        uchar a;
        for(a=0;a<5;a++)
        {
                Beep=!Beep;
                delay(50);
        }
}
void open()
{
        P2=0xbf;
        delay(100);

        P2=0xef;
        delay(100);

        P2=0xfb;
        delay(100);

        P2=0xfe;
        delay(100);


        delay(100);
        P2=0x7f;
        delay(100);
        P2=0xdf;
        delay(100);
        P2=0xf7;
        delay(100);
        P2=0xfd;
        delay(100);
        P2=0XFf;
}
void main()
{
start:
        ledinit();
        
        while(1)
        {
//P1=0x40;

                Key = Keyscan();  
                if(Key)
                {
                        result = Keyresult(Key);
                        if(result==14)//#密碼鎖狀態
                                {
                                dispbuf[0]=15;         
                                dispbuf[1]=15;                 
                                dispbuf[2]=15;
                                password=sum=0;
                                do
                                {
                                        Key = Keyscan(); //檢測鍵盤
                                        if(Key)//有按鍵按下
                                        {
                                                result = Keyresult(Key);//讀入按鍵值
                                                if(result>=0&&result<=9)//屬于數字的輸入
                                                        sum=sum*10+result;//計算累計數
                                                if(result==12)//清零按鍵按下?
                                                        sum=0;//結果清零
                                                leddisp(sum);//顯示結果
                                                if(sum>100)//已經輸入三位數了,但是密碼錯
                                                {
                                                        delay(1000);//延時并且報警
                                                        password=sum;//讀入密碼值
                                                        sum=0;//結果清零
                                                        if(password!=123)
                                                                alarm();//密碼錯誤,報警
                                                }
                                                leddisp(sum);//顯示結果
                                        }
                                }while(password!=123);//等待密碼正確
                                ON=0;//開鎖
                                for(temp=0;temp<3;temp++)        
                                        open();
                                delay(2000);
                                ON=1;
                                sum=0;
                        }
                        else
                        {
                                if(result==12)//清零按鍵按下?
                                        sum=0;//結果為零
                                if(result>=0&&result<=9)//屬于數字輸入?
                                        sum=sum*10+result;//將結果計算出
                                }
                }//以上是矩陣鍵盤操作
                leddisp(sum);//顯示結果
                if(sum>100)
                        switch(sum)//輸入正確,點亮對應的住戶指示燈
                        {                //否則報警,重新輸入
                                case  101:P2=0xbf;KC=0;KB=0;KA=0;hujiao();break;//對應八種結果
                                case  102:P2=0x7f;KC=0;KB=0;KA=1;hujiao();break;
                                case  201:P2=0xef;KC=0;KB=1;KA=0;hujiao();break;
                                case  202:P2=0xdf;KC=0;KB=1;KA=1;hujiao();break;
                                case  301:P2=0xfb;KC=1;KB=0;KA=0;hujiao();break;
                                case  302:P2=0xf7;KC=1;KB=0;KA=1;hujiao();break;
                                case  401:P2=0xfe;KC=1;KB=1;KA=0;hujiao();break;
                                case  402:P2=0xfd;KC=1;KB=1;KA=1;hujiao();break;
                                default : P2=0XFf;alarm();sum=0;hujiao();break;
                        }
//                sure=1;
                if(sure==0)        //一旦按下通話鍵
                {
                        Beep=1;
                        num=0;
                        if(sum==0)
                                INH=1;//關閉4051
                        if(sum>100)                //接通對應的攝像頭。
                        {
                                INH=~INH;//開啟4051
                                if(!INH)
                                {
                                        P2=0xff;//關閉報警燈
                                        sum=0;//結果清零
                                }
                        }
//                        ON=~ON;
                        while(!sure);//松開鍵盤檢測
                }
                else
                {
                        if(sum>100)
                        {
                                num++;
                                if(num>40)
                                {
                                        num=0;
                                        P2=0XFf;
                                        sum=0;
                                        Beep=1;
                                        goto start;
                                }
                        }
                }

                if(OpenD==0)        //開鎖鍵
                {
                        delay(10);
                        if(OpenD==0)
                        {
                                ON=0;
                                
                        }
                        while(!OpenD);
                        delay(2000);
                                ON=1;
                }
        }
}
/***定時器0刷新顯示內容**/
void t0(void) interrupt 1 //using 0
{
        TH0=(65536-5000)/256;
        TL0=(65536-5000)%256;
        WEI|=0x0e;//關位選
        DUAN=dispcode[dispbuf[dispcount]]; //段選
        WEI&=dispbitcode[dispcount]; //開位選
        dispcount++;
        if(dispcount==3)
           dispcount=0;
}

1.C語言程序.zip

48.84 KB, 下載次數: 36, 下載積分: 黑幣 -5

程序

3.Protel99se圖.zip

114.82 KB, 下載次數: 36, 下載積分: 黑幣 -5

原理圖

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1112461 發表于 2024-3-9 15:19 | 只看該作者
大佬這個有仿真嗎?想學習
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品国产乱码久久久久久久久 | 在线播放精品视频 | 在线免费观看黄色 | 欧美一级淫片免费视频黄 | 天天影视网天天综合色在线播放 | 亚洲视频一区二区 | 欧美在线日韩 | www.日日操 | 成人精品一区亚洲午夜久久久 | 久久国产精品精品国产色婷婷 | 国产日韩精品一区二区 | 黑人巨大精品欧美一区二区免费 | 欧美性猛片aaaaaaa做受 | 久久一区二区免费视频 | 成人二区 | 日韩图区| 亚洲国产精品va在线看黑人 | 亚洲国产电影 | 欧美一级毛片久久99精品蜜桃 | 久久免费视频1 | 九色网址| 欧美激情一区 | 狠狠做深爱婷婷综合一区 | 精品在线一区二区 | 国产一区二区在线视频 | 国产精品久久久久一区二区三区 | 鸡毛片 | av中文天堂| 精品一区在线免费观看 | 亚洲国产精品人人爽夜夜爽 | 99热这里都是精品 | 欧美日高清视频 | 亚洲一区二区三区四区五区中文 | 欧美日韩在线视频一区 | 色射综合| 久久伊| 国产a区| 黄色成人国产 | 91久久综合 | 欧美精品在线免费观看 | 无人区国产成人久久三区 |