<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 門(mén)禁系統(tǒng)項(xiàng)目驅(qū)動(dòng)程序

          門(mén)禁系統(tǒng)項(xiàng)目驅(qū)動(dòng)程序

          作者: 時(shí)間:2016-11-30 來(lái)源:網(wǎng)絡(luò) 收藏
          /*****************************************************************************

          門(mén)禁系統(tǒng)項(xiàng)目驅(qū)動(dòng)程序

          本文引用地址:http://www.ex-cimer.com/article/201611/323636.htm

          (1)晶振 11.0592MHZ
          (2)芯片 DS1302,AT24C64,HEF4053BP
          (3)ZIMO21.EXE縱向、字節(jié)倒序取字模
          (4)完整代碼下載(包含頭文件):http://www.51hei.com/f/12154f.rar
          *****************************************************************************/
          #include "reg51.h"
          #include "intrins.h"
          #include "7041_Door.h"http://字模

          #define LCD_DATA P1//液晶屏數(shù)據(jù)輸入
          #define EEAddr EAddr.All//AT24C64片內(nèi)地址
          #define EAddrH EAddr.array[0]
          #define EAddrL EAddr.array[1]

          #define uchar unsigned char
          #define uint unsigned int

          union Add{ //定義EEPROM地址
          uint All;
          uchar array[2];
          }EAddr;

          uchar Sto = 1,Del = 0;
          uint DelCount;//定時(shí)器中斷中用于延時(shí)的變量DelCount
          uchar Function = 0;//按鍵功能變量Function
          uchar SCount = 0;//串行中斷中用于計(jì)數(shù)卡號(hào)信息的循環(huán)變量
          bit TimeDisFlag = 0,KEndFlag = 0,StoreFlag = 0,DeleteFlag = 0,SwitchFlag = 0,WXFlag = 0,NSK12Flag = 0;//控制時(shí)間顯示標(biāo)志位TimeDisFlag,14位卡號(hào)接收完的標(biāo)志KEndFlag
          uchar CardNo[14] = {0},GetTime[7],RD24C64[32] = 0,CardMax = 0,CardNum = 0;//存儲(chǔ)讀到的卡號(hào)CardNo[14],存儲(chǔ)從1302讀到的時(shí)間GetTime[7],存入卡的個(gè)數(shù)CardMax

          /*---------------------------------定義P口-----------------------------------*/

          sbit LCD_RS = P2^7; //LCD12864
          sbit LCD_RW = P2^6;
          sbit LCD_E = P2^5;
          sbit LCD_CS1 = P2^4;
          sbit LCD_CS2 = P2^3;
          sbit Busy = P1^7;
          sbit Motor2 = P3^7;
          sbit Motor1 = P3^6;
          sbit SDA_24C64 = P3^5;//AT24C64
          sbit SCL_24C64 = P3^4;
          sbit CLK_1302 = P2^2;//DS1302
          sbit IO_1302 = P2^1;
          sbit RST_1302 = P2^0;
          sbit RS_485 = P3^2;//485R/S,其為1時(shí)允許發(fā)送,為0時(shí)允許接收
          sbit CON_4053 = P3^3;//通信控制,其為1時(shí)讀卡,為0時(shí)485通信
          sbit KEY1 = P0^0;//定義按鍵
          sbit KEY2 = P0^1;
          sbit KEY3 = P0^2;
          sbit KEY4 = P0^3;

          /***************************液晶屏驅(qū)動(dòng)程序*********************************/

          void LCD_BusyCheck(bit BCS){//檢測(cè)忙子程序
          LCD_DATA = 0xff;//LCD_RS = 0,LCD_RW = 1,LCD_E = 高電平。
          LCD_RS = 0;
          LCD_RW = 1;
          if(BCS){//檢測(cè)片1忙狀態(tài)
          LCD_CS1 = 1;
          LCD_E = 1;
          while(Busy);
          LCD_E = 0;
          LCD_CS1 = 0;
          }
          else{//檢測(cè)片2忙狀態(tài)
          LCD_CS2 = 1;
          LCD_E = 1;
          while(Busy);
          LCD_E = 0;
          LCD_CS2 = 0;
          }
          }
          void LCD_Write_Code(uchar WCode,bit CS){//寫(xiě)指令子程序
          LCD_BusyCheck(CS);//調(diào)用忙檢測(cè)子程序:寫(xiě)前檢測(cè)
          LCD_DATA = WCode;
          LCD_RS = 0;//LCD_RS = 0,LCD_RW = 0,LCD_E = 高脈沖。
          LCD_RW = 0;
          if(CS){//檢測(cè)片1忙狀態(tài)
          LCD_CS1 = 1;
          LCD_E = 1;
          _nop_();
          LCD_E = 0;
          LCD_CS1 = 0;
          }
          else{//檢測(cè)片2忙狀態(tài)
          LCD_CS2 = 1;
          LCD_E = 1;
          _nop_();
          LCD_E = 0;
          LCD_CS2 = 0;
          }
          }
          void LCD_Write_Data(uchar WData,uchar CS){//寫(xiě)數(shù)據(jù)子程序
          LCD_BusyCheck(CS);//調(diào)用忙檢測(cè)子程序:寫(xiě)前忙狀態(tài)檢測(cè)
          LCD_DATA = WData;
          LCD_RS = 1;//LCD_RS = 1,LCD_RW = 0,LCD_E = 高脈沖。
          LCD_RW = 0;
          if(CS){//檢測(cè)片1忙狀態(tài)
          LCD_CS1 = 1;
          LCD_E = 1;
          _nop_();
          LCD_E = 0;
          LCD_CS1 = 0;
          }
          else{//檢測(cè)片2忙狀態(tài)
          LCD_CS2 = 1;
          LCD_E = 1;
          _nop_();
          LCD_E = 0;
          LCD_CS2 = 0;
          }
          }
          void LCD_Write(uchar xpos,uchar ypos,uchar WData){//寫(xiě)屏子(地址轉(zhuǎn)換)程序
          uchar WCS;
          if(xpos < 64)WCS = 1;//判斷將要操作片1或片2:WCS = 1操作LCD_CS1
          else WCS = 0;//WCS = 2 操作LCD_CS2
          ypos &= 0x07;//頁(yè)地址轉(zhuǎn)換
          ypos |= 0xb8;
          LCD_Write_Code(ypos,WCS);//寫(xiě)入頁(yè)地址到對(duì)應(yīng)片
          xpos &= 0x3f;//列地址轉(zhuǎn)換
          xpos |= 0x40;
          LCD_Write_Code(xpos,WCS);//寫(xiě)入列地址到對(duì)應(yīng)片
          LCD_Write_Data(WData,WCS);//寫(xiě)入數(shù)據(jù)到對(duì)應(yīng)片
          }
          void LCD_Data_DisWord(uchar xpos,uchar ypos,uchar array[]){//漢字顯示子程序:12*16
          uchar Cnt = 0,x = 0,y = 0;
          for(y = ypos;y < ypos + 2;y ++){
          for(x = xpos;x < xpos + 12;x ++,Cnt ++)
          LCD_Write(x,y,array[Cnt]);//調(diào)用寫(xiě)屏子程序:在對(duì)應(yīng)的地址上寫(xiě)入要顯示的內(nèi)容
          }
          }
          void LCD_Data_DisNum(uchar xpos,uchar ypos,uchar array[]){//數(shù)字及符號(hào)顯示子程序:6*16
          uchar Cnt = 0,x = 0,y = 0;
          for(y = ypos;y < ypos + 2;y ++){
          for(x = xpos;x < xpos + 6;x ++,Cnt ++)
          LCD_Write(x,y,array[Cnt]);//調(diào)用寫(xiě)屏子程序:在對(duì)應(yīng)的地址上寫(xiě)入要顯示的內(nèi)容
          }
          }
          void LCD_All_Clear(void){//清屏子程序:全屏清0
          uchar x,y;
          for(y = 0;y < 8;y ++)
          for(x = 0;x < 128;x ++)
          LCD_Write(x,y,0x00);//調(diào)用寫(xiě)屏子程序:全屏寫(xiě)0
          }
          void LCD_Page_Clear(uchar yPage){//清屏子程序:清除以所給頁(yè)坐標(biāo)為起始的兩頁(yè)的內(nèi)容
          uchar x,y;
          for(y = yPage;y < yPage + 2;y ++)
          for(x = 0;x < 128;x ++)
          LCD_Write(x,y,0x00);//調(diào)用寫(xiě)屏子程序:以所給頁(yè)坐標(biāo)為起始的兩頁(yè)寫(xiě)0
          }
          void LCD_Reset(void){//液晶屏初始化設(shè)置
          LCD_E = 0;
          LCD_Write_Code(0x3f,1);//開(kāi)片1顯示
          LCD_Write_Code(0x3f,0);//開(kāi)片2顯示
          LCD_Write_Code(0xc0,1);//設(shè)片1起始行顯示
          LCD_Write_Code(0xc0,0);//設(shè)片2起始行顯示
          }

          /******************************DS1302時(shí)鐘程序*******************************/

          void DS1302_WriteByte(uchar WData){ //寫(xiě)入一個(gè)字節(jié)
          uchar Cnt;
          for(Cnt=0;Cnt<8;Cnt++){
          WData >>= 1;//寫(xiě)入數(shù)據(jù)時(shí)先寫(xiě)低位再寫(xiě)高位(D0---D7)
          CLK_1302 = 0;
          IO_1302 = CY;
          CLK_1302 = 1; //上升沿將數(shù)據(jù)寫(xiě)入1302
          }
          }
          uchar DS1302_ReadByte(){ //讀出一個(gè)字節(jié)
          uchar Cnt,RData = 0;
          for(Cnt = 0;Cnt < 8;Cnt ++){
          RData >>= 1;//讀數(shù)據(jù)時(shí)先讀低位再讀高位(D0---D7)
          CLK_1302 = 1;
          CLK_1302 = 0; //下降沿將數(shù)據(jù)讀出來(lái)
          if(IO_1302)
          RData |= 0x80;
          elseRData &= 0x7f;
          }
          return RData;
          }
          void DS1302_WriteData(uchar Waddr,uchar Wdata){ //向某地址中寫(xiě)入一個(gè)字節(jié)的數(shù)據(jù)
          RST_1302 = 0;
          CLK_1302 = 0;
          RST_1302 = 1;
          DS1302_WriteByte(Waddr);//寫(xiě)入地址
          DS1302_WriteByte(Wdata);//寫(xiě)入數(shù)據(jù)
          CLK_1302 = 0;
          RST_1302 = 0;
          }
          uchar DS1302_ReadData(uchar RAddr){ //讀取1302某地址中一個(gè)字節(jié)的數(shù)據(jù)
          uchar Rdata;
          RST_1302 = 0;
          CLK_1302 = 0;
          RST_1302 = 1;
          DS1302_WriteByte(RAddr);//寫(xiě)入讀取數(shù)據(jù)的地址
          Rdata = DS1302_ReadByte();//讀取數(shù)據(jù)
          RST_1302 = 0;
          IO_1302 = 1;
          return(Rdata);
          }
          void DS1302_SetTime(){ //設(shè)置1302時(shí)間
          uchar Cnt,Add = 0x80;//秒 寄存器的寫(xiě)地址0x80
          // 秒 分 時(shí) 日 月 星期 年
          uchar STime[7] = {0x00,0x19,0x14,0x18,0x07,5,0x08};

          DS1302_WriteData(0x8e,0x00);//禁止寫(xiě)保護(hù)(可寫(xiě)入數(shù)據(jù))
          for(Cnt = 0;Cnt < 7;Cnt ++,Add += 2)//循環(huán)寫(xiě)入秒,分,時(shí),日,月,星期,年
          DS1302_WriteData(Add,STime[Cnt]);
          DS1302_WriteData(0x8e,0x80);//寫(xiě)保護(hù)(不能寫(xiě)入數(shù)據(jù))
          }
          void DS1302_GetTime(){ //讀取1302中當(dāng)前時(shí)間
          uchar Cnt,Addr = 0x81;//秒 寄存器的讀地址0x81
          for(Cnt = 0;Cnt < 7;Cnt ++,Addr += 2)//循環(huán)讀取秒,分,時(shí),日,月,星期,年
          GetTime[Cnt] = DS1302_ReadData(Addr);
          }

          /**************************液晶屏顯示程序******************************/

          void LCD_DisTime(){//顯示從1302讀取的時(shí)間
          DS1302_GetTime();
          LCD_Data_DisNum(32,0,num[GetTime[6] >> 4]);//年(由1302循環(huán)讀出顯示)
          LCD_Data_DisNum(38,0,num[GetTime[6] & 0x0f]);
          LCD_Data_DisNum(50,0,num[GetTime[4] >> 4]);//月
          LCD_Data_DisNum(56,0,num[GetTime[4] & 0x0f]);
          LCD_Data_DisNum(68,0,num[GetTime[3] >> 4]);//日
          LCD_Data_DisNum(74,0,num[GetTime[3] & 0x0f]);
          LCD_Data_DisNum(122,0,num[GetTime[5]]);//星期
          LCD_Data_DisNum(32,2,num[GetTime[2] >> 4]);//時(shí)
          LCD_Data_DisNum(38,2,num[GetTime[2] & 0x0f]);
          LCD_Data_DisNum(50,2,num[GetTime[1] >> 4]);//分
          LCD_Data_DisNum(56,2,num[GetTime[1] & 0x0f]);
          LCD_Data_DisNum(68,2,num[GetTime[0] >> 4]);//秒
          LCD_Data_DisNum(74,2,num[GetTime[0] & 0x0f]);
          }
          void LCD_DisCell(){//顯示固定不變的內(nèi)容(日期,時(shí)間等漢字及符號(hào)的顯示)(圖1~4)
          LCD_Data_DisWord(2,0,ri);
          LCD_Data_DisWord(14,0,qi);
          LCD_Data_DisNum(26,0,maohao);
          LCD_Data_DisNum(44,0,heng);
          LCD_Data_DisNum(62,0,heng);
          LCD_Data_DisWord(92,0,xing);
          LCD_Data_DisWord(104,0,qi);
          LCD_Data_DisNum(116,0,maohao);
          LCD_Data_DisWord(2,2,shi);
          LCD_Data_DisWord(14,2,jian);
          LCD_Data_DisNum(26,2,maohao);
          LCD_Data_DisNum(44,2,heng);
          LCD_Data_DisNum(62,2,heng);
          }
          void LCD_Display1(){//無(wú)操作狀態(tài)時(shí)顯示內(nèi)容
          LCD_DisCell();
          LCD_Data_DisWord(34,4,wu);//無(wú)操作狀態(tài)
          LCD_Data_DisWord(46,4,cao);
          LCD_Data_DisWord(58,4,zuo);
          LCD_Data_DisWord(70,4,zhuang);
          LCD_Data_DisWord(82,4,tai);
          }
          void LCD_Display2(){//刷卡后顯示此卡有效或無(wú)效
          LCD_Data_DisWord(2,4,ka);//顯示刷卡后的卡號(hào)
          LCD_Data_DisWord(14,4,hao);
          LCD_Data_DisNum(26,4,maohao);
          }
          void LCD_Display3(){//顯示電機(jī)狀態(tài):打開(kāi)或關(guān)閉
          //LCD_DisCell();//顯示固定不變的內(nèi)容
          LCD_Data_DisWord(2,4,dian);//電機(jī)狀態(tài)
          LCD_Data_DisWord(14,4,ji);
          LCD_Data_DisWord(26,4,zhuang);
          LCD_Data_DisWord(38,4,tai);
          LCD_Data_DisNum(50,4,maohao);
          }
          void LCD_Display4(){//顯示數(shù)據(jù)上傳過(guò)程:上傳成功或失敗
          LCD_Data_DisWord(2,4,shu);//數(shù)據(jù)上傳
          LCD_Data_DisWord(14,4,ju);
          LCD_Data_DisWord(26,4,shang);
          LCD_Data_DisWord(38,4,chuan);
          LCD_Data_DisNum(50,4,maohao);

          LCD_Data_DisWord(56,4,kuang1);
          LCD_Data_DisWord(68,4,kuang1);
          LCD_Data_DisWord(80,4,kuang1);
          LCD_Data_DisWord(92,4,kuang1);
          LCD_Data_DisWord(104,4,kuang1);
          LCD_Data_DisWord(116,4,kuang1);

          LCD_Data_DisWord(35,6,cheng);
          LCD_Data_DisWord(47,6,gong);

          LCD_Data_DisWord(75,6,shibai);
          LCD_Data_DisWord(87,6,bai);
          }
          void LCD_Display5(){//顯示存卡過(guò)程:存入或取消存儲(chǔ)
          LCD_Data_DisWord(2,0,cun);//存卡
          LCD_Data_DisWord(14,0,ka);
          LCD_Data_DisWord(2,2,ka);//卡號(hào)
          LCD_Data_DisWord(14,2,hao);
          LCD_Data_DisNum(26,2,maohao);
          }
          void LCD_Display6(){//顯示卡號(hào)刪除過(guò)程:確認(rèn)刪除或取消刪除
          LCD_Data_DisWord(2,0,liu);//瀏覽卡號(hào)
          LCD_Data_DisWord(14,0,lan);
          LCD_Data_DisWord(26,0,ka);
          LCD_Data_DisWord(38,0,hao);
          LCD_Data_DisWord(2,2,ka);//卡號(hào)顯示
          LCD_Data_DisWord(14,2,hao);
          LCD_Data_DisNum(26,2,maohao);
          LCD_Data_DisWord(35,4,shan);
          LCD_Data_DisWord(47,4,chu);
          LCD_Data_DisWord(75,4,qu);
          LCD_Data_DisWord(87,4,quxiao);
          }

          /******************************AT24C64存儲(chǔ)程序*******************************/

          void I2C_Start(void){//I2C總線(xiàn)啟動(dòng)
          SCL_24C64 = 1;
          _nop_();
          SDA_24C64 = 1;
          _nop_();
          SDA_24C64 = 0;
          }
          void I2C_Stop(void){//I2C總線(xiàn)通信結(jié)束
          SCL_24C64 = 0;
          SDA_24C64 = 0;
          _nop_();
          SCL_24C64 = 1;
          SDA_24C64 = 1;
          }
          void I2C_ACK_Send(bit ack){//發(fā)送返回幀
          SDA_24C64 = ack;
          SCL_24C64 = 1;
          _nop_();
          SCL_24C64 = 0;
          SDA_24C64 = 1;//釋放總線(xiàn)
          }
          bit I2C_ACK_Receive(){//接收返回幀
          bit ACKR;
          SDA_24C64 = 1;//釋放總線(xiàn)
          SCL_24C64 = 1;
          _nop_();
          ACKR = SDA_24C64;
          SCL_24C64 = 0;
          return ACKR;
          }
          void I2C_SendByte(uchar WData){//寫(xiě)入一個(gè)字節(jié)的數(shù)據(jù)
          uchar Count;
          SCL_24C64 = 0;
          for(Count = 0;Count < 8;Count ++){
          WData <<= 1;
          SDA_24C64 = CY;
          SCL_24C64 = 1;//下降沿寫(xiě)入數(shù)據(jù)
          _nop_();
          SCL_24C64 = 0;
          }
          }
          uchar I2C_ReceiveByte(){//讀出一個(gè)字節(jié)的數(shù)據(jù)
          uchar Count,RData;
          SCL_24C64 = 0;
          for(Count = 0;Count < 8;Count ++){
          RData <<= 1;
          SCL_24C64 = 1;//高電平讀出數(shù)據(jù)
          _nop_();
          if(SDA_24C64)
          RData |= 0x01;
          elseRData &= 0xfe;
          SCL_24C64 = 0;
          }
          return RData;
          }
          void I2C_Write_AT24C64(uchar WAddrH,uchar WAddrL,uchar *Point,uchar WNum){//向WAddrH,WAddrL為首地址的頁(yè)中寫(xiě)入WNum個(gè)字節(jié)
          bit ACK;uchar Cnt;
          I2C_Start();//啟動(dòng)通信
          do{
          I2C_SendByte(0xa0);//AT24C64的寫(xiě)地址
          ACK = I2C_ACK_Receive();
          }while(ACK);
          do{
          I2C_SendByte(WAddrH); //寫(xiě)字節(jié)高地址
          ACK = I2C_ACK_Receive();
          }while(ACK);
          do{
          I2C_SendByte(WAddrL); //寫(xiě)字節(jié)低地址
          ACK = I2C_ACK_Receive();
          }while(ACK);
          for(Cnt = 0;Cnt < WNum;Cnt ++,Point ++){//循環(huán)寫(xiě)入WNum個(gè)字節(jié)
          do{
          I2C_SendByte(*Point); //寫(xiě)的內(nèi)容
          ACK = I2C_ACK_Receive();
          }while(ACK);
          }
          I2C_Stop(); //通信結(jié)束
          }
          uchar I2C_Read_AT24C64(uchar WAddrH,uchar WAddrL,uchar RNum){//從WAddrH,WAddrL為首地址的頁(yè)中讀取RNum個(gè)字節(jié)
          uchar Cnt;//一頁(yè)最多32個(gè)字節(jié)
          bit ACK;
          I2C_Start();//啟動(dòng)通信
          do{
          I2C_SendByte(0xa0);//AT24C64的寫(xiě)地址
          ACK = I2C_ACK_Receive();
          }while(ACK);
          do{
          I2C_SendByte(WAddrH);//寫(xiě)入地址的高5位
          ACK = I2C_ACK_Receive();
          }while(ACK);
          do{
          I2C_SendByte(WAddrL);//寫(xiě)入地址的低8位
          ACK = I2C_ACK_Receive();
          }while(ACK);
          I2C_Start();//再次啟動(dòng)通信
          do{
          I2C_SendByte(0xa1);//AT24C64的讀地址
          ACK = I2C_ACK_Receive();
          }while(ACK);
          for(Cnt = 0;Cnt < RNum;Cnt ++){//循環(huán)讀取RNum個(gè)字節(jié)
          RD24C64[Cnt] = I2C_ReceiveByte();
          if(Cnt != RNum - 1)
          I2C_ACK_Send(0);
          }
          I2C_ACK_Send(1);//讀取最后一個(gè)字節(jié)的數(shù)據(jù)后的返回幀
          I2C_Stop();//通信結(jié)束
          }
          void AT24C64Init(){//24C64初始化
          //I2C_Write_AT24C64(0x00,0x1f,&CardMax,1);//將存儲(chǔ)卡的最大數(shù)目初始化為0
          //I2C_Write_AT24C64(0x00,0x1e,&CardNum,1);//將存儲(chǔ)卡的數(shù)目初始化為0
          I2C_Read_AT24C64(0x00,0x1f,1);//讀取0x00,0x1f地址中的內(nèi)容,其為存儲(chǔ)卡過(guò)程中曾存卡的最多個(gè)數(shù)
          CardMax = RD24C64[0];//將讀取的數(shù)據(jù)存入卡數(shù)目最大值變量CardMax中
          I2C_Read_AT24C64(0x00,0x1e,1);//讀取0x00,0x1e地址中的內(nèi)容,其為存儲(chǔ)卡的數(shù)目
          CardNum = RD24C64[0];//將讀取的數(shù)據(jù)存入卡數(shù)目變量CardNum中
          EEAddr = 0x0000;//將24C64的地址初始化到首地址
          }


          上一頁(yè) 1 2 下一頁(yè)

          評(píng)論


          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();