|
基于51單片機密碼鎖,1602顯示屏,矩陣鍵盤以及繼電器
電子密碼鎖焊接圖2.jpg (92.91 KB, 下載次數: 78)
下載附件
2017-5-8 00:55 上傳
電子密碼鎖焊接圖1不.jpg (62.84 KB, 下載次數: 83)
下載附件
2017-5-8 00:55 上傳
電子密碼鎖焊接圖3.jpg (106.56 KB, 下載次數: 83)
下載附件
2017-5-8 00:55 上傳
0.png (427.88 KB, 下載次數: 89)
下載附件
2017-5-8 00:54 上傳
0.png (113.61 KB, 下載次數: 77)
下載附件
2017-5-8 00:54 上傳
0.png (57.24 KB, 下載次數: 84)
下載附件
2017-5-8 00:53 上傳
10、讀寫存儲并顯示\
11最終程序-按鍵修改完密碼后進行存儲\
1、液晶顯示\
2、讀取矩陣鍵盤鍵碼\
3、六個按鍵碼的顯示\
4、將程序3輸入的6個鍵碼顯示改為隱藏\
5、判斷輸入的6位數和系統(tǒng)默認密碼是否一樣\
6、再程序5的基礎上加入定時器\
7、在程序6的基礎上加入聲音和計數器\
8、加入修改開鎖密碼的功能\
9、讀存儲器并顯示\
- //編譯環(huán)境: KEIL UVISION2
- //單片機晶振:12M 單片機型號AT89S52
- //單片機晶振: 無特殊要求
- //作者:興向榮電子元件店
- //功能:實現4組密碼鎖,4組密碼均可以修改,修改后掉電可以保持
- #include <reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- //==============LCD1602接口連接方法=====================
- /*-----------------------------------------------------
- |DB0-----P0.0 | DB4-----P0.4 | RW-------P2.3 |
- |DB1-----P0.1 | DB5-----P0.5 | RS-------P2.4 |
- |DB2-----P0.2 | DB6-----P0.6 | E--------P2.2 |
- |DB3-----P0.3 | DB7-----P0.7 |
- ---------------------------------------------------*/
- //===============================AT24C16控制引腳定義===================
- sbit sda_24c16=P2^0;//定義24C16串行數據線 第5腳
- sbit scl_24c16=P2^1;//定義24C16串行時鐘線 第6腳
- //================================================*/
- #define LCM_Data P0 //LCD1602數據接口
- #define Busy 0x80 //用于檢測LCM狀態(tài)字中的Busy標識
- sbit LCM_RW = P2^6; //讀寫控制輸入端,LCD1602的第五腳
- sbit LCM_RS = P2^5; //寄存器選擇輸入端,LCD1602的第四腳
- sbit LCM_E = P2^7; //使能信號輸入端,LCD1602的第6腳
- #define key_port P3//用KEY_PORT代替P3
- sbit beek_c =P2^2;//定義蜂鳴器控制口
- sbit lock_c =P2^3;//定義鎖信號輸出口
- //**************函數聲明***************************************
- void delay_3us();//3US的延時程序
- void nack_24c16();//24C16非應答信號
- void stop_24c16();//停止通訊信號
- void star_24c16();//啟動信號
- void cack_24c16();//檢測應答信號
- void mack_24c16();//發(fā)送應答信號
- void w1byte_24c16(uchar byte1);//向24C16寫入一字節(jié)的數據
- uchar rd1byte_24c16(void);
- void read_24c16();//讀數據操作
- void write_24c16();//寫入16字節(jié)的數據操作
- void init_t0();//定時器0初始化函數
- void WriteDataLCM (uchar WDLCM);//LCD模塊寫數據
- void WriteCommandLCM (uchar WCLCM,BuysC); //LCD模塊寫指令
- uchar ReadStatusLCM(void);//讀LCD模塊的忙標
- void DisplayOneChar(uchar X,uchar Y,uchar ASCII);//在第X+1行的第Y+1位置顯示一個字符
- void LCMInit(void);//LCD初始
- void delayms(uint ms);//1MS基準延時程序
- void delay_50us(unsigned int t);// 延時50*t(us)
- void DisplayListChar(uchar X,uchar Y,uchar delayms, uchar code *DData);
- void judge_xianshi(void);//顯示處理程序
- void read_key(void);//按鍵鍵碼讀取子函數,返回相應的鍵碼
- uchar keybord_value;//全局變量,存儲最終的鍵碼,其值為0-F
- void read_password(void);//6位數據的讀取,也就是密碼的讀取
- uchar deal_password(void);//輸入密碼和系統(tǒng)碼對比,看是否符合開鎖條件
- //返回值為1就開鎖,返回值為0為密碼錯誤
- void makesurekeydeal();//確認鍵處理程序
- void cancelkeydeal();//取消鍵處理程序
- //***********矩陣鍵盤鍵碼****************************************
- const uchar tabl2[16]={0xee,0xed,0xeb,0xe7,0xde,0xdd,0xdb,0xd7,0xbe,
- // s1 s2 s3 s4 s5 s6 s7 s8 s9
- 0xbd,0xbb,0xb7,0x7e,0x7d,0x7b,0x77};
- // s10 s11 s12 s13 s14 s15 s16
- uchar system[4][6];//定義 4*6個數據作為系統(tǒng)的密碼 也就是4組6位數
- uchar passin[6];//定義全局變量,儲存輸入的6個按鍵數據
- uchar temppassin[6];//輸入的數據暫存
- uchar flag1;//按鍵鍵入是否成功的標準,為1成功 為0失敗
- uchar passcount;//鍵入次數的統(tǒng)計
- uchar flag2;//密碼是否對的標志單位 ,為1成功 ,為0失敗
- uchar flag3,flag4,flag5,flag6,flag7,flag12;
- uchar t0_crycle;
- uchar error_count;//密碼輸入次數
- //***********************主程序******************************
- main()
- {
- passcount=0;
- flag5=0;
- flag7=0;
- flag6=0;
- flag4=0;
- flag3=0;
- flag1=0;
- beek_c=1;//關閉蜂鳴器
- lock_c=0;//關閉鎖
- LCMInit();//液晶初始化設置
- init_t0();
- TR0=0;//關閉定時器T0
- error_count=0;
- read_24c16();//單片機上電的時候先讀取4組密碼
- while(1)
- {
- read_key();//讀取鍵碼
- read_password();//把鍵碼轉為密碼
- judge_xianshi();//顯示
- }
- }
- //****************************************************
- //寫入數據操作
- void write_24c16()
- {
- uchar i,j;
- write1:
- star_24c16();//發(fā)送啟動脈沖
- w1byte_24c16(0xa0);//寫24C16的芯片地址,高四位固定為1010,選擇第一區(qū),寫操作
- cack_24c16();// 讀取應答或非應答信號
- if(flag12)goto write1;//判斷
- w1byte_24c16(01);//寫入24C16的內部地址
- cack_24c16();
- if(flag12)goto write1;
- for(j=0;j<2;j++)//先寫入12個字節(jié)的數據
- {
- for(i=0;i<6;i++)
- {
- w1byte_24c16(system[j][i]);
- cack_24c16();
- if(flag12)goto write1;
- }
- }
- stop_24c16();//寫數據完畢,發(fā)送停止脈沖
- write2:
- star_24c16();//發(fā)送啟動脈沖
- w1byte_24c16(0xa0);//寫24C16的芯片地址,高四位固定為1010,選擇第一區(qū),寫操作
- cack_24c16();// 讀取應答或非應答信號
- if(flag12)goto write2;//判斷
- w1byte_24c16(17);//寫入24C16的內部地址
- cack_24c16();
- if(flag12)goto write2;
- for(j=2;j<4;j++)//寫入后面24字節(jié)的數據
- {
- for(i=0;i<6;i++)
- {
- w1byte_24c16(system[j][i]);
- cack_24c16();
- if(flag12)goto write2;
- }
- }
- stop_24c16();//寫數據完畢,發(fā)送停止脈沖
- }
- //***************************************************
- //讀數據操作
- void read_24c16()
- { uchar i,j;
- read1:
- for(j=0;j<2;j++)//讀取前面12字節(jié)的數據
- {
- for(i=0;i<6;i++)
- {
- nack_24c16();
- star_24c16();//發(fā)送啟動脈沖
- w1byte_24c16(0xa0);//24C16的芯片地址,高四位固定為1010,選擇第一區(qū),寫操作
- cack_24c16();
- if(flag12)goto read1;
- w1byte_24c16(j*6+i+1);//寫入24C16的內部地址,選擇第二頁
- cack_24c16();
- if(flag12)goto read1;
- nack_24c16();
- stop_24c16();//重新開始
- star_24c16();//
- w1byte_24c16(0xa1);// 24C16的芯片地址,高四位固定為1010,選擇第一區(qū),讀操作
- cack_24c16();
- if(flag12)goto read1;
- system[j][i]=rd1byte_24c16();
- }
- }
- mack_24c16();
- nack_24c16();
- stop_24c16();
- read2:
- for(j=2;j<4;j++)
- {
- for(i=0;i<6;i++)
- {
- nack_24c16();
- star_24c16();//發(fā)送啟動脈沖
- w1byte_24c16(0xa0);//24C16的芯片地址,高四位固定為1010,選擇第一區(qū),寫操作
- cack_24c16();
- if(flag12)goto read2;
- w1byte_24c16(j*6+i+5);//寫入24C16的內部地址,選擇第二頁
- cack_24c16();
- if(flag12)goto read2;
- nack_24c16();
- stop_24c16();//重新開始
- star_24c16();//
- w1byte_24c16(0xa1);// 24C16的芯片地址,高四位固定為1010,選擇第一區(qū),讀操作
- cack_24c16();
- if(flag12)goto read2;
- system[j][i]=rd1byte_24c16();
- }
- }
- mack_24c16();
- nack_24c16();
- stop_24c16();
- for(j=0;j<4;j++)//
- {
- for(i=0;i<6;i++)
- {
- if(system[j][i]>15)system[j][i]=1;//出廠芯片讀出的是FF,這樣就沒有密碼可以輸入了,防止防止這種任何密碼都無效的情況,我們設置出廠4組密碼都是111 111
- }
- }
- }
- //****************************************************
- //顯示處理程序
- void judge_xianshi()
- {
- uchar i;
- _nop_();
- if(flag2==0)//開關初始顯示
- {
- DisplayListChar(0,0,0, "Electronics Lock");//
- DisplayListChar(1,0,0, "Password:");
- for(i=0;i<passcount&&i<6;i++)//顯示輸入的6個數據
- {
- DisplayOneChar( 1, 9+i, '*'); //第一行改為隱藏
- // //第二行改為真實顯示,可以把這句刪除就隱藏密碼了
- }
- }
- else if(flag2==5)
- {
- DisplayListChar(0,0,0, "Change passwor ");
- DisplayOneChar( 0,15,flag5+0x30);
- DisplayListChar(1,0,0, "0: n: ");
-
- for(i=0;i<6;i++)
- {
- DisplayOneChar( 1,i+2,system[flag5-1][i]+0x30);
- }
- for(i=0;i<6;i++)DisplayOneChar( 1,i+10,temppassin[i]+0x30);
- }
- }
- //6位數據的讀取,也就是密碼的讀取
- void read_password()
- {
- _nop_();
- if(flag1==1 )//判斷鍵入是否成功
- {
- flag1=0;
- if(passcount<6 && flag5==0)
- {
- passin[passcount]=keybord_value;
- passcount++;
- }
- if(passcount<6 && flag5!=0)
- {
- if(keybord_value!=15 && keybord_value!=14 )
- {
- flag7=1;
- temppassin[passcount]=keybord_value;
- passcount++;
- }
- }
- cancelkeydeal();//取消鍵處理程序
- makesurekeydeal();//確認鍵處理程序
- if(keybord_value==15 && flag7==0)//判斷是否為設置鍵
- {
- flag5++;
- if(flag5>=5)flag5=1;
- }
- }
- }
- //************************************************
- //確認鍵處理程序
- void makesurekeydeal()
- {
- uchar i;
- _nop_();
- if(keybord_value==12 && flag7==0 )//判斷時候為確認鍵
- {
- flag2=deal_password();// 判斷輸入的密碼是否正確
- passcount=0;
- if(flag3==0)//按第一次確認
- {
- flag3=1;
- if(flag2==1)//輸入的密碼正確
- {
- beek_c=0;//開蜂鳴器
- lock_c=1;//開鎖
- flag6=1;
- DisplayListChar(1,0,0, "Opening........");//在液晶的第二行顯示字符"OPERING
- TR0=1;
- flag4=0;
- error_count=0;
- while(flag4<=20);//密碼正確開鎖信號閉合2秒 蜂鳴器響2秒
- flag4=0;
- flag2=0;
- flag3=0;
- TR0=0;
- WriteCommandLCM(0x01,1); //清除顯示一下
- beek_c=1;//關閉蜂鳴器
- lock_c=0;//斷開鎖信號輸出
-
- }
- else if(flag2==2)//輸入的密碼錯誤
- {
- beek_c=0;
- TR0=1;
- flag6=0;
- error_count++;//密碼輸入錯誤后,計數器+1
- DisplayListChar(1,0,0, "Input Error TIS");
- DisplayOneChar( 1,12,error_count+0x30);//顯示輸入多少次錯誤
- while(flag4<=5);//密碼輸入錯誤蜂鳴器響0.5秒,關0.5秒的頻率響2次
- beek_c=1;
- flag4=0;
- while(flag4<=5);
- beek_c=0;
- flag4=0;
- while(flag4<=5);
- beek_c=1;
- flag4=0;
- flag2=0;
- flag3=0;
- TR0=0;
- if(error_count>=3)//如果密碼輸入3次錯誤經鎖定2.54分鐘或需要重新斷電
- {
- DisplayListChar(0,0,0, "Input Error 3 Ts");
- DisplayListChar(1,0,0, "locked 3 minutes");
- TR0=1;
- while(flag4<=254);//鎖定時間過后系統(tǒng)恢復
- DisplayListChar(0,0,0, "Electronics Lock");
- TR0=0;
- error_count=0;
- flag4=0;
- }
- }
- }
- /* else if(flag3==1)//第二次按確認
- {
- flag2=0;
- flag3=0;
- }*/
- WriteCommandLCM(0x01,1); //清除顯示一下
- }
- if(keybord_value==12 && flag7==1 )//確認修改密碼
- {
- for(i=0;i<6;i++)
- {
- system[flag5-1][i]=temppassin[i];//把暫存單元的數據傳給對應的開始密碼
- temppassin[i]=0;//暫存單元清零,下次修改密碼可以再次利用
- }
- write_24c16();
- flag7=0;//各種標志單元清零
- flag2=0;
- flag3=0;
- flag5=0;
- flag6=0;
- passcount=0; //按鍵次數計數清零
- WriteCommandLCM(0x01,1); //清除顯示一下
- }
- }
- //************************************************
- //取消鍵處理程序
- void cancelkeydeal()
- {
- uchar i;
- _nop_();
- if(keybord_value==13 )//判斷是否為取消鍵
- {
- if(flag7==0)
- {
- for(i=0;i<passcount;i++)
- {
- passin[i]=0;
- }//清零
- passcount=0;//按取消鍵后,鍵入按鍵次數的計數單元清零
- if(flag3==1)//取消顯示密碼錯誤
- {
- flag2=0;
- flag3=0;
- }
- }
- else if(flag7==1)
- {
- flag7=0;
- flag2=0;
- flag3=0;
- flag5=0;
- flag6=0;
- passcount=0;
-
- }
- WriteCommandLCM(0x01,1); //清除顯示一下
- }
- }
- uchar deal_password()//輸入密碼和系統(tǒng)碼對比,看是否符合開鎖條件
- {
- uchar i,j,temp2,temp;
- temp2=0;
- _nop_();
- for(j=0;j<4;j++)//依次判斷4組
- {
- temp=0;
- for(i=0;i<6;i++)
- {
- if(system[j][i]==passin[i])temp++;//如果系統(tǒng)密碼和鍵入的密碼對應的位一樣,則暫存單元自加1
- }
- if(temp==6)
- {
- temp2=1;
- return(1);//如果TEMP為6,證明鍵入的密碼和4組系統(tǒng)密碼中的一組一樣;
- break;//退出判斷
- }
- }
- if(temp2==0)return(2);
- }
- void read_key(void)
- {
- uchar key_value,i=1;
- uchar key_high_value,key_low_value;//定義變量暫存高四位和低四位按鍵的鍵碼
- _nop_();
- key_port=0xf0;//置按鍵控制口為1,準備讀入數據
- key_value=key_port & 0xf0;
- if(key_value!=0xf0)//如果沒有按鍵按下,則相等
- {
- delay_50us(200);//延時10ms去除抖動
- key_port=0xf0;//再次講IO置1,準備讀入去除抖動后的數據
- key_value=key_port & 0xf0;
- switch (key_value)
- { case 0xf0:break;//經軟件延時后,判斷為誤判,則退出函數,返回
- case 0x70:key_high_value=0x70;break;
- case 0xb0:key_high_value=0xb0;break;
- case 0xd0:key_high_value=0xd0;break;
- case 0xe0:key_high_value=0xe0;break;
- default:key_high_value=0x00;break;//多個按鍵同時按下,顯示0,然后退出
- }
- key_port=0x0f;//交換高四位和低四位的狀態(tài),再次讀取鍵碼
- key_value=key_port & 0x0f;
- switch(key_value)
- {
- case 0x07:key_low_value=0x07;break;
- case 0x0b:key_low_value=0x0b;break;
- case 0x0d:key_low_value=0x0d;break;
- case 0x0e:key_low_value=0x0e;break;
- default:key_low_value=0x00;break;
- }
- key_value=key_high_value | key_low_value;
- for(i=0;i<16;i++)
- {
- if(key_value==tabl2[i])
- {
- keybord_value=i;
- flag1=1;//置按鍵碼讀取成功標志位1;
- if(flag6==1 && keybord_value==14)
- {
- flag1=0;
- }
- break;
- }
- }
- beek_c=0;//開蜂鳴器
- TR0=1;
- while(flag4<=1);//按按鍵的時候蜂鳴器響0.1秒
- flag4=0;
- TR0=0;//關閉定時器
- beek_c=1;//關閉蜂鳴器
- if(flag6!=0)
- {
- if(keybord_value==14)
- {
- TR0=1;
- key_port=0xf0;//置按鍵控制口為1,準備讀入數據
- while((key_port & 0xf0 )!=0xf0 && flag5==0)
- {
-
- if(flag4>=30)
- {
- TR0=0;
- flag4=0;
- flag2=5;
- flag5=1;
- flag7=0;
- }
- }
- }
- }
- key_port=0xf0;//置按鍵控制口為1,準備讀入數據
- while((key_port & 0xf0 )!=0xf0 && keybord_value!=14 ); //等待按鍵釋放,按鍵釋放后才往下執(zhí)行程序
- }
- }
- //定時器0中斷服務程序
- void timer0() interrupt 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;//定時器設置為定時50MS
- t0_crycle++;
- if(t0_crycle==2)// 0.1秒
- {
- t0_crycle=0;
- flag4++; //定時器開啟后,FLAG4每0.1秒自加1
- if(flag6!=0 && flag4>=40)//輸入密碼正確開鎖后超過2分鐘后不能進入修改開鎖密碼的界面
- {
- flag6=0;
- flag4=0;
- TR0=0;
- }
- }
- }
- //********************************************************************************************
- void init_t0()
- {
- _nop_();
- TMOD=0x01;//設定定時器工作方式1,定時器定時50毫秒
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- EA=1;//開總中斷
- ET0=1;//允許定時器0中斷
- t0_crycle=0;//定時器中斷次數計數單元
- }
- /*====================================================================
- 按指定位置顯示一串字符:第 X 行,第 y列
- 注意:字符串不能長于16個字符
- ======================================================================*/
- void DisplayListChar(uchar X,uchar Y,uchar ms, uchar code *DData)
- {
- uchar ListLength;
- _nop_();
- ListLength = 0;
- X &= 0x1;
- Y &= 0xF; //限制X不能大于15,Y不能大于1
- while (DData[ListLength]!='\0') //若到達字串尾則退出
- {
- if (Y <= 0xF) //X坐標應小于0xF
- {
- DisplayOneChar(X, Y, DData[ListLength]); //顯示單個字符
- ListLength++;
- Y++;
- delayms(ms);//延時顯示字符串
- }
- else
- break;//跳出循環(huán)體
- }
- }
- /*======================================================================
- LCM初始化
- ======================================================================*/
- void LCMInit(void)
- {
- LCM_Data = 0;
- _nop_();
- WriteCommandLCM(0x38,0); //三次顯示模式設置,不檢測忙信號
- delayms(5);
- WriteCommandLCM(0x38,0);
- delayms(5);
- WriteCommandLCM(0x38,0);
- delayms(5);
- WriteCommandLCM(0x38,1); //顯示模式設置,開始要求每次檢測忙信號
- WriteCommandLCM(0x08,1); //關閉顯示
- WriteCommandLCM(0x01,1); //顯示清屏
- WriteCommandLCM(0x06,1); // 顯示光標移動設置
- WriteCommandLCM(0x0C,1); // 顯示開及光標設置
- delayms(100);
- }
- //==============================LCD1602顯示子程序================================================
- // 寫數據函數: E =高脈沖 RS=1 RW=0
- //======================================================================*/
- void WriteDataLCM(uchar WDLCM)
- {
- ReadStatusLCM(); //檢測忙
- _nop_();
- LCM_Data = WDLCM;
- LCM_RS = 1;
- LCM_RW = 0;
- LCM_E = 0; //若晶振速度太高可以在這后加小的延時
- LCM_E = 0; //延時
- LCM_E = 1;
- }
- /*====================================================================
- 寫指令函數: E=高脈沖 RS=0 RW=0
- ======================================================================*/
- void WriteCommandLCM(uchar WCLCM,BuysC) //BuysC為0時忽略忙檢測
- {
- if (BuysC) ReadStatusLCM(); //根據需要檢測忙
- LCM_Data = WCLCM;
- LCM_RS = 0;
- LCM_RW = 0;
- LCM_E = 0;
- LCM_E = 0;
- LCM_E = 1;
- }
- /*====================================================================
- 正常讀寫操作之前必須檢測LCD控制器狀態(tài):E=1 RS=0 RW=1;
- DB7: 0 LCD控制器空閑,1 LCD控制器忙。
- 讀狀態(tài)
- ======================================================================*/
- uchar ReadStatusLCM(void)
- {
- LCM_Data = 0xFF;
- LCM_RS = 0;
- LCM_RW = 1;
- LCM_E = 0;
- LCM_E = 0;
- LCM_E = 1;
- while (LCM_Data & Busy); //檢測忙信號
- return(LCM_Data);
- }
- /*======================================================================
- 功 能: 在1602 指定位置顯示一個字符:第一行位置0~15,第二行16~31
- 說 明: 第 X 行,第 y 列 注意:字符串不能長于16個字符
- ======================================================================*/
- void DisplayOneChar( uchar X, uchar Y, uchar ASCII)
- {
- X &= 0x1;
- Y &= 0xF; //限制Y不能大于15,X不能大于1
- if (X) Y |= 0x40; //當要顯示第二行時地址碼+0x40;
- Y |= 0x80; // 算出指令碼
- WriteCommandLCM(Y, 0); //這里不檢測忙信號,發(fā)送地址碼
- WriteDataLCM(ASCII);
- }
- /*====================================================================
- 設定延時時間:x*1ms
- ====================================================================*/
- void delayms(uint Ms)
- {
- uint i,TempCyc;
- for(i=0;i<Ms;i++)
- {
- TempCyc =70;
- while(TempCyc--);
- }
- }
- //***********************************************************************
- //函數名稱:void delay_50US(unsigned int t)
- //功能: 延時50*t(us)
- void delay_50us(unsigned int t)
- {
- unsigned char j;
- for(;t>0;t--)
- {
- for(j=19;j>0;j--);
- }
- }
- //******************************************************************************************
- //***********************************************
- //3微秒延時程序
- void delay_3us()
- {
- ;
- ;
- }
- //*************************************************
- //功能:發(fā)送非應答信號
- void nack_24c16()
- {
- sda_24c16=1;
- delay_3us();
- delay_3us();
- scl_24c16=1;
- delay_3us();
- delay_3us();
- scl_24c16=0;
- sda_24c16=0;
- }
- //*************************************************
- //功能:發(fā)送IIC停止信號
- void stop_24c16()
- {
- sda_24c16=0;
- scl_24c16=1;
- delay_3us();
- delay_3us();
- sda_24c16=1;
- delay_3us();
- delay_3us();
- scl_24c16=0;
- }
- //*************************************************
- //功能:發(fā)送啟動通訊的信號
- void star_24c16()
- {
- sda_24c16=1;
- scl_24c16=1;
- delay_3us();
- delay_3us();
- sda_24c16=0;
- delay_3us();
- delay_3us();
- scl_24c16=0;
- }
- //****************************************************
- //功能:判斷應答或非應答
- //說明:通訊出錯時標志為1,否則為0
- void cack_24c16()
- {
- scl_24c16=0;
- sda_24c16=1;
- delay_3us();
- scl_24c16=1;
- flag12=0;//清除錯誤標志
- if(sda_24c16)flag12=1;
- scl_24c16=0;
- }
- //****************************************************
- //功能:發(fā)送應答信號
- void mack_24c16()
- {
- sda_24c16=0;
- scl_24c16=1;
- delay_3us();
- delay_3us();
- scl_24c16=0;
- sda_24c16=1;
- }
- //*************************************************
- //功能:向24C16寫入一字節(jié)的數據
- void w1byte_24c16(uchar byte1)
- {
- uchar i=8;
- while(i--)
- {
- delay_3us();
- delay_3us();
- delay_3us();
- if(byte1 & 0x80)
- {sda_24c16=1;}
- else
- {sda_24c16=0;}
- delay_3us();
- delay_3us();
- delay_3us();
- scl_24c16=1;
- delay_3us();
- delay_3us();
- delay_3us();
- scl_24c16=0;
- byte1<<=1;
- }
- }
- //*******************************
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png (51.09 KB, 下載次數: 88)
下載附件
2017-5-8 00:55 上傳
下載:
rar (1)rr.rar
(1.95 MB, 下載次數: 46)
2017-5-8 00:52 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
|