單片機51密碼鎖c語言程序下載,51單片機四位密碼鎖程序

本文目錄一覽:

求51單片機C語言編的密碼鎖程序

#include reg52.h

#define uint unsigned int

#define uchar unsigned char

#define BIN(a,b,c,d,e,f,g,h) ((a7)+(b6)+(c5)+(d4)+(e3)+(f2)+(g1)+(h0))

//下面的code表示數組存放在ROM中,因為這個數組的值不需要改寫

uchar code KeyCode[16]={15,14,12,8,30,28,24,16,60,56,48,32,120,112,96,64};//值為m*(n+1)的乘積,用於Key()

uchar dis[6];

msdelay(uint x)//延時子函數

{uchar j;

while(x–)

{for(j=0;j125;j++){;}

}

}

//鍵盤子程序一,鍵盤值與數組值對比得到

uchar Key(void)

{uchar temp,m,n,i,j,matrix,k;

P1=0xF0; /*行線電平為高,列線為低*/

temp=P10xf0;

if (temp==0xf0) return(16); /*行仍為高,無按健,退出*/

else msdelay(10);

for(i=1;i16;i=i*2)

{m=i;

for(j=1;j16;j=j*2)

{n=(~j)0x0f;

P1=(m4)|n; /*m為P1的行值由i循環得到,n為列值,由j循環並取反得到*/

temp=P10xf0;

if (!temp)

{do{temp=P10xf0;}while(!temp);

matrix=m*(n+1);/*為避免乘積重複,n+1*/

for(k=0;k16;k++){if (matrix==KeyCode[k]) return(k);} //KeyCode:見前

return(16);

} //if loop

}//j loop

}//i loop

}//Key end

//用Switch…case語句得到鍵盤值*/

uchar Key1(void)

{uchar temp,m,n,i,j,matrix;

P1=0xF0; /*行線電平為高,列線為低*/

temp=P10xf0;

if (temp==0xf0) return(16); /*行仍為高,無按健,退出*/

else msdelay(10);

for(i=1;i16;i=i*2)

{m=i;

for(j=1;j16;j=j*2)

{n=(~j)0x0f;

P1=(m4)|n;/*m為P1的行值由i循環得到,n為列值,由j循環並取反得到*/

temp=P10xf0;

if (!temp)

{do{temp=P10xf0;}while(!temp);

matrix=m*(n+1);

switch(matrix) //此方法的基本思路:

{case 15:return(1); break; //由循環得到的m,n值賦於P1端口實現逐個鍵掃描

case 14:return(2); break; //同時由m,n+1的值相乘得到對應鍵點de的積

case 12:return(3); break; //m*(n+1)值掃描鍵點對應而得出鍵值

case 8:return(4); break; //

case 30:return(5); break; //

case 28:return(6); break; //

case 24:return(7); break; //

case 16:return(8); break;

case 60:return(9); break;

case 56:return(0); break;

case 48:return(10); break;

case 32:return(11); break;

case 120:return(12); break;

case 112:return(13); break;

case 96:return(14); break;

case 64:return(15); break;

default:return(16);

} //switch end

} //if loop

}//j loop

}//i loop

}//Key end

//依次掃描16個按鍵

uchar Key2(void)

{uchar temp;

P1=0xF0; /*使P1=1111 0000,行線電平為高,列線為低*/

temp=P10xf0;

if (temp==0xf0) return(16); /*讀P1=1111 xxxx,表示行仍為高,無按健,退出(x表示不關心)?/

else msdelay(10);

P1=0x1e; /*P1=0001 1110,行一為高,列一為低,掃描第一個按鍵*/

temp=P10xf0;

if (!temp) {do{temp=P10xf0;}while(!temp);

return(1);}

P1=0x1d; /*P1=0001 1101,行一為高,列二為低,掃描第二個按鍵,下面掃描其餘按鍵*/

temp=P10xf0;

if (!temp) {do{temp=P10xf0;}while(!temp);

return(2);}

P1=0x1b;

temp=P10xf0;

if (!temp) {do{temp=P10xf0;}while(!temp);

return(3);}

P1=0x17;

temp=P10xf0;

if (!temp) {do{temp=P10xf0;}while(!temp);

return(4);}

P1=0x2e;

temp=P10xf0;

if (!temp) {do{temp=P10xf0;}while(!temp);

return(5);}

P1=0x2d;

temp=P10xf0;

if (!temp) {do{temp=P10xf0;}while(!temp);

return(6);}

P1=0x2b;

temp=P10xf0;

if (!temp) {do{temp=P10xf0;}while(!temp);

return(7);}

P1=0x27;

temp=P10xf0;

if (!temp) {do{temp=P10xf0;}while(!temp);

return(8);}

P1=0x4e;

temp=P10xf0;

if (!temp) {do{temp=P10xf0;}while(!temp);

return(9);}

P1=0x4d;

temp=P10xf0;

if (!temp) {do{temp=P10xf0;}while(!temp);

return(0);}

P1=0x4b;

temp=P10xf0;

if (!temp) {do{temp=P10xf0;}while(!temp);

return(10);}

P1=0x47;

temp=P10xf0;

if (!temp) {do{temp=P10xf0;}while(!temp);

return(11);}

P1=0x8e;

temp=P10xf0;

if (!temp) {do{temp=P10xf0;}while(!temp);

return(12);}

P1=0x8d;

temp=P10xf0;

if (!temp) {do{temp=P10xf0;}while(!temp);

return(13);}

P1=0x8b;

temp=P10xf0;

if (!temp) {do{temp=P10xf0;}while(!temp);

return(14);}

P1=0x87;

temp=P10xf0;

if (!temp) {do{temp=P10xf0;}while(!temp);

return(15);}

return(16); //掃描all按鍵都未按下,則輸出16

}//Key2 end.

////////時鐘中斷顯示子程序

void T0_int() interrupt 1

{static uchar i;

if (i==6){i=0;}

P0=5-i;

P0=P0|(dis[i]4);

i++;

TL0=0;

TH0=252;}

void distri(uint disnum)

{uint temp;

dis[0]=0;

dis[1]=disnum/10000;

temp=disnum%10000;

dis[2]=temp/1000;

temp=temp%1000;

dis[3]=temp/100;

temp=temp%100;

dis[4]=temp/10;

dis[5]=temp%10;

}

Main()

{uchar KeyVal,i=0;

TMOD=0x01;

IE=0x82;

TH0=252;

TL0=0;

TR0=1;

distri(0);

do{

KeyVal=Key();

if (KeyVal!=16) dis[1]=KeyVal; //注意:當有按鍵時才賦於顯示位dis[1],否則出錯,請分析!

}while(1);

}

求51單片機4*3矩陣鍵盤6位密碼鎖c語言程序

#includestdio.h

#includereg51.h

#define uchar unsigned char

uchar key;

int i=0;

char b[4]={‘0′,’0′,’0′,’0’};//輸入的密碼放這裡和初始的比較來判斷是否密碼正確

void keyscan() //掃描按鍵是否按下

{

uchar temp;

P3=0xfe; //掃描第一行

temp=P3;

temp=temp0xf0;

if(temp!=0xf0) //判斷按鍵是否按下

{

delayms(10);//去抖動

temp=P3;

temp=temp0xf0;

if(temp!=0xf0)//確認按鍵按下

{

temp=P3;

switch(temp)

{

case 0xee:key=’0′;break;

case 0xde:key=’1′;break;

case 0xbe:key=’2′;break;

case 0x7e:key=’3′;break;

}

while(temp!=0xf0) //判斷按鍵是否鬆開

{

temp=P3;

temp=temp0xf0;

}

b[i]=key;i++;if(i==3)i=0;

}

}

P3=0xfd; //掃描第二行

temp=P3;

temp=temp0xf0;

if(temp!=0xf0)

{

delayms(10);

temp=P3;

temp=temp0xf0;

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xed:key=’4′;break;

case 0xdd:key=’5′;break;

case 0xbd:key=’6′;break;

case 0x7d:key=’7′;break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp0xf0;

}

b[i]=key;i++;if(i==3)i=0;

}

}

P3=0xfb; //掃描第三行

temp=P3;

temp=temp0xf0;

if(temp!=0xf0)

{

delayms(10);

temp=P3;

temp=temp0xf0;

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xeb:key=’8′ ;break;

case 0xdb:key=’9′ ;break;

case 0xbb:key=’A’;break;

case 0x7b:key=’B’;break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp0xf0;

}

b[i]=key;i++;if(i==3)i=0;

}

}

P3=0xf7; //掃描第四行

temp=P3;

temp=temp0xf0;

if(temp!=0xf0)

{

delayms(10);

temp=P3;

temp=temp0xf0;

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xe7:key=’C’;break;

case 0xd7:key=’D’;break;

case 0xb7:key=’E’;break;

case 0x77:key=’F’;break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp0xf0;

}

b[i]=key;i++;if(i==3)i=0;

}

}

}

main()

{

char a[4]={‘3′,’5′,’A’,’C’}; //這個做初始密碼

while(1)//無限循環,保證了b 0-3 四個數有值

{

keyscan();

if(a[0]==b[0]a[1]==b[1]a[2]==b[2]a[3]==b[3])

{

//這裡寫密碼正確程序要怎麼處理

}

}

}

代碼應該可以。。 我沒板子,只是想着寫。你main裡面加上你要的功能試試,順便把結果告訴我下。。。 我只是給每個按鍵做標記,然後根據按鍵按下的順序,和預定的標記相同則判斷密碼正確。 按鍵是低電平選通。

求51單片機C語言編的簡易密碼鎖程序

首先得說明我這個可是自己原創手打的,但是沒去仿真了,程序可能有錯誤,你自己修改下吧

#includereg52.h

typedef unsigned char uchar;

typedef unsigned int uint;

sbit key1=P0^0;

sbit key2=P0^1;

sbit key3=P0^2;

sbit key4=P0^3;

sbit wela=P2^0;//位鎖存端

#define SMG P1

sbit LED=P3^0;//低電平亮

uchar code table[]={0x8d,0x86};//共陽數碼管 P,E

uchar chushi_mima[]={2,1,3};

uchar shuru_mima[3];

uchar index;//控制輸入密碼的位數

uchar flag_3s=0;//3s標誌位

uchar keydown;//確定按鍵變量

#define times 15//去抖時間15Ms

uchar key1_count,key2_count,key3_count,key4_count;

void init()

{

wela=0;

SMG=0xff;

TMOD=0x01;

TH0=(65536-1000)/256;

TL0=(65536-1000)%256;

ET0=1;

EA=1;

TR0=1;

LED=1;

}

void main()

{

init();

while(1)

{

switch(keydown)

{

if(index2)index=0;

case 1:

shuru_mima[index]=0;

index++;

break;

case 2:

shuru_mima[index]=1;

index++;

break;

case 3:

shuru_mima[index]=2;

index++;

break;

case 4:

shuru_mima[index]=3;

index++;

break;

}

flag_3s=0;

for(i=0;i3;i++)

{

if(shuru_mima[i]==chushi_mima[i])

{

LED=0;

wela=1;

SMG=table[0];

if(flag_3s)

{

flag_3s=0;

wela=0;

}

}

else

{

LED=1;

wela=1;

SMG=table[1];

if(flag_3s)

{

flag_3s=0;

wela=0;

}

}

}

}

}

void timer0() interrupt 1

{

uchar count;

TH0=(65536-1000)/256;

TL0=(65536-1000)%256;

if(++count=600)

{

count=0;

flag_3s=1;

}

/*********1ms中斷掃描按鍵(包含去抖程序)********/

if(!key1key1_count!=0)

{

key1_count–;

if(key1_count==0)

{

keydown=1;

}

}

else if(!key1) key1_count=times;

// key2,key3,key4你自己寫吧

}

求51單片機簡易密碼鎖C語言程序 要求用到矩陣鍵盤、數碼管和流水燈

你這明顯不是密碼鎖啊,我之前做過可以修改密碼的LCD顯示的,不過只能顯示英文。

基於51單片機的密碼鎖程序

用STC52編的,下面是C程序,調試已經成功,自己看程序吧……

#includereg52.h

#include intrins.h

#define uchar unsigned char

#define uint unsigned int

#define LCD_data P0

sbit SDA=P3^5;

sbit SCL=P3^4;//24C08控制口設置

sbit LCD_RS = P3^3; //寄存器選擇輸入

sbit LCD_RW = P3^6; //液晶讀/寫控制

sbit LCD_EN = P3^7; //液晶使能控制

sbit LCD_PSB = P3^2; //串/並方式控制

sbit FM=P2^4;//蜂鳴器控制口

sbit RS=P2^5;

sbit T_CLK = P2^0; //實時時鐘時鐘線引腳 //

sbit T_IO = P2^1; //實時時鐘數據線引腳 //

sbit T_RST = P2^2; //實時時鐘複位線引腳 //

sbit ds=P2^3;

sbit EN=P2^6;

sbit ZZ=P2^7;

sbit FZ=P3^1;

sbit ACC0=ACC^0;

sbit ACC7=ACC^7;

uint temp1,s_temp; //定義整形變量

float f_temp; //定義浮點型變量

uchar time[]=” : : “;

uchar day[]=” 20 / / ( ) “;

uchar temp0[]=” 溫度: . 度 “;

uchar num,num1,flag,count,a,b;

uchar unlock_i;//解密標誌位

uchar t[4];

uchar t1[4];

void delay_ms(uint z)//長延時

{

uint x,y;

for(x=z;x0;x–)

for(y=110;y0;y–);

}

void delay() //短延時,大約5us

{

; ;

}

void reshi()

{

if(RS==1)

{ unlock_i=1;

}

else

{

unlock_i=0;

}

}

uchar code mima[]={‘0′,’1′,’2′,’3′,’4′,’5′,’6′,’7′,’8′,’9′,’0′,’*’};

void lcd_xieping0(uchar x,uchar y,uchar date);

void lcd_xieping(uchar x,uchar y,uchar *str);

//********************************************************

// 開機顯示

//********************************************************

void kjxs()

{

uint i,j;

lcd_xieping(0,0,”****************”);

lcd_xieping(1,0,” 歡迎進入 “);

lcd_xieping(2,0,” 密碼鎖系統! “);

lcd_xieping(3,0,”****************”);

delay_ms(4000);

lcd_xieping(0,0,” 系統初始化中 “);

lcd_xieping(1,0,” 請稍後… “);

lcd_xieping(2,0,”————————”);

lcd_xieping(3,0,” “);

for(j=3;j0;j–)

{

for(i=0;i8;i++)

{

lcd_xieping(3,i,”*”);

delay_ms(250);

}

lcd_xieping(3,0,” “);

}

}

//********************************************************

// 12864顯示

//********************************************************

void write_cmd(uchar cmd)

{

LCD_RS = 0;

LCD_RW = 0;

LCD_EN = 0;

P0 = cmd;

delay_ms(5);

LCD_EN = 1;

delay_ms(5);

LCD_EN = 0;

}

void write_dat(uchar dat)

{

LCD_RS = 1;

LCD_RW = 0;

LCD_EN = 0;

P0 = dat;

delay_ms(5);

LCD_EN = 1;

delay_ms(5);

LCD_EN = 0;

}

void lcd_xieping0(uchar x,uchar y,uchar date)

{

switch(x)

{

case 0: write_cmd(0x80+y); break;

case 1: write_cmd(0x90+y); break;

case 2: write_cmd(0x88+y); break;

case 3: write_cmd(0x98+y); break;

}

write_dat(date);

}

void lcd_xieping(uchar x,uchar y,uchar *str)

{

switch(x)

{

case 0: write_cmd(0x80+y); break;

case 1: write_cmd(0x90+y); break;

case 2: write_cmd(0x88+y); break;

case 3: write_cmd(0x98+y); break;

}

while (*str)

{

write_dat(*str);

str++;

}

}

void lcd_init()

{

LCD_PSB = 1; //並口方式

write_cmd(0x30); //基本指令操作

delay_ms(5);

write_cmd(0x0C); //顯示開,關光標

delay_ms(5);

write_cmd(0x01); //清除LCD的顯示內容

delay_ms(5);

}

//**************************************************************

// 鍵盤掃描函數

//**************************************************************

uchar keyscan1() //矩陣鍵盤掃描函數

{

uchar temp;

while(!num)

{P1=0xfe; //賦值

temp=P1; //讀回數據

temp=temp0xf0; //與運算

if(temp!=0xf0) //判斷

{

delay_ms(2); //延時消抖

temp=P1; //讀回數據

temp=temp0xf0;

if(temp!=0xf0)

{

switch(temp) //多分支選擇

{

case 0x70:num=1;break; //跳出

case 0xb0:num=2;break;

case 0xd0:num=3;break;

case 0xe0:num=4;break;

}

while(temp!=0xf0)

{

temp=P1;

temp=temp0xf0;

}//等待按鍵釋放

}

}

P1=0xfd; //賦值

temp=P1; //讀回數據

temp=temp0xf0; //與運算

if(temp!=0xf0) //判斷

{

delay_ms(2); //延時消抖

temp=P1; //讀回數據

temp=temp0xf0;

if(temp!=0xf0)

{

switch(temp) //多分支選擇

{

case 0x70:num=5;break; //跳出

case 0xb0:num=6;break;

case 0xd0:num=7;break;

case 0xe0:num=8;break;

}

while(temp!=0xf0)

{

temp=P1;

temp=temp0xf0;

}//等待按鍵釋放

}

}

P1=0xfb; //賦值

temp=P1; //讀回數據

temp=temp0xf0; //與運算

if(temp!=0xf0) //判斷

{

delay_ms(2); //延時消抖

temp=P1; //讀回數據

temp=temp0xf0;

if(temp!=0xf0)

{

switch(temp) //多分支選擇

{

case 0x70:num=9;break; //跳出

case 0xb0:num=10;break;

case 0xd0:num=11;break;

case 0xe0:num=12;break;

}

while(temp!=0xf0)

{

temp=P1;

temp=temp0xf0;

}//等待按鍵釋放

}

}

}

return(num); //返回值

}

uchar keyscan2()

{

uchar temp;

while(!num1)

{P1=0xf7; //賦值

temp=P1; //讀回數據

temp=temp0xf0; //與運算

if(temp!=0xf0) //判斷

{

delay_ms(2); //延時消抖

temp=P1; //讀回數據

temp=temp0xf0;

if(temp!=0xf0)

{

switch(temp) //多分支選擇

{

case 0x70:num1=1;break; //跳出

case 0xb0:num1=2;break;

case 0xd0:num1=3;break;

case 0xe0:num1=4;break;

}

while(temp!=0xf0)

{

temp=P1;

temp=temp0xf0;

}//等待按鍵釋放

}

}

}

return(num1);

}

//**************************************************************

// 直流電機

//**************************************************************

void dianjiZZ()

{

EN=1;

ZZ=1;

FZ=0;

}

void dianjiFZ()

{

EN=1;

ZZ=0;

FZ=1;

}

void dianji_stop()

{

EN=0;

}

//**************************************************************

// EPPROM

//**************************************************************

void start() //啟動信號

{

SDA=1;

delay();

SCL=1;

delay();

SDA=0;

delay();

}

void stop() //停止信號

{

SDA=0;

delay();

SCL=1;

delay();

SDA=1;

delay();

}

void respons() //響應信號

{

uchar i;

SCL=1;

delay();

while((SDA==1)(i250))

i++;

SCL=0;

delay();

}

void writebyte(uchar date) //寫一個字節

{

uchar i,temp;

temp=date;

for(i=0;i8;i++)

{

temp=temp1;

SCL=0;

delay();

SDA=CY;

delay();

SCL=1;

delay();

}

SCL=0;

delay();

SDA=1; //釋放總線

delay();

}

uchar readbyte() //讀一個字節

{

uchar i,k;

SCL=0;

delay();

SDA=1;

for(i=0;i8;i++)

{

SCL=1;

delay();

k=(k1)|SDA;

SCL=0;

delay();

}

delay();

return(k);

}

void write(uchar add,uchar date) //在一個地址寫一個字節

{

start();

writebyte(0xa0);

respons();

writebyte(add);

respons();

writebyte(date);

respons();

stop();

}

uchar read(uchar add) //在一個地址讀一個字節

{

start();

writebyte(0xa0);

respons();

writebyte(add);

respons();

start();

writebyte(0xa1);

respons();

b=readbyte();

respons();

stop();

return(b);

}

//**************************************************************

// 時間日期函數

//**************************************************************

void v_WTInputByte(uchar ucDa)

{

uchar i;

ACC= ucDa;

for(i=8; i0; i–)

{

T_IO = ACC0; //*相當於彙編中的 RRC

T_CLK = 1;

T_CLK = 0;

ACC =ACC 1;

}

}

uchar uc_RTOutputByte(void)

{

uchar i;

for(i=8; i0; i–)

{

ACC = ACC1; //*相當於彙編中的 RRC

ACC7 = T_IO;

T_CLK = 1;

T_CLK = 0;

}

return(ACC);

}

void v_W1302(uchar ucAddr, uchar ucDa)

{

T_RST = 0;

T_CLK = 0;

T_RST = 1;

v_WTInputByte(ucAddr); /* 地址,命令 */

v_WTInputByte(ucDa); /* 寫1Byte數據*/

T_CLK = 1;

T_RST =0;

}

uchar uc_R1302(uchar ucAddr)

{

uchar ucDa;

T_RST = 0;

T_CLK = 0;

T_RST = 1;

v_WTInputByte(ucAddr); // 地址,命令 //

ucDa = uc_RTOutputByte(); // 讀1Byte數據 //

T_CLK = 1;

T_RST =0;

return(ucDa);

}

void Init1302(void)

{

v_W1302(0x8e,0x00); //控制寫入WP=0

v_W1302(0x80,0x80);

v_W1302(0x90,0xa9);

v_W1302(0x80,0x00); //秒

v_W1302(0x82,0x24); //分

v_W1302(0x84,0x12); //時

v_W1302(0x86,0x29); //日

v_W1302(0x88,0x10); //月

v_W1302(0x8a,0x05); //星期

v_W1302(0x8c,0x10); //年 //

v_W1302(0x8e,0x80);

}

void donetime(void)

{

uchar d;

d=uc_R1302(0x87);

day[10]=(d0x0f)+48;

day[9]=((d4)0x03)+48;

d=uc_R1302(0x89);

day[7]=(d0x0f)+48;

day[6]=((d4)0x01)+48;

d=uc_R1302(0x8b);

day[13]=(d0x07)+48;

d=uc_R1302(0x8d);

day[4]=(d0x0f)+48;

day[3]=(d4)+48;

d=uc_R1302(0x81);

time[15]=(d0x0f)+48;

time[14]=(d4)+48;

d=uc_R1302(0x83);

time[12]=(d0x0f)+48;

time[11]=(d4)+48;

d=uc_R1302(0x85);

time[9]=(d0x0f)+48;

time[8]=(d4)+48;

}

//**************************************************************

// 溫度檢測函數

//**************************************************************

void dsreset(void) //18B20複位,初始化函數

{

uint i;

ds=0;

i=103;

while(i0)i–;

ds=1;

i=4;

while(i0)i–;

}

bit tempreadbit(void) //讀1位函數

{

uint i;

bit dat;

ds=0;i++; //i++ 起延時作用

ds=1;i++;i++;

dat=ds; //讀數據

i=8;while(i0)i–;

return (dat);

}

uchar tempread(void) //讀1個字節

{

uchar i,j,dat;

dat=0;

for(i=1;i=8;i++)

{

j=tempreadbit();

dat=(j7)|(dat1); //讀出的數據最低位在最前面,這樣剛好一個字節在DAT里

}

return(dat);

}

void tempwritebyte(uchar dat) //向18B20寫一個字節數據

{

uint i;

uchar j;

bit testb;

for(j=1;j=8;j++)

{

testb=dat0x01; //判斷最後一位是1還是0

dat=dat1;

if(testb) //寫 1

{

ds=0;

i++;i++;

ds=1;

i=8;while(i0)i–;

}

else

{

ds=0; //寫 0

i=8;while(i0)i–;

ds=1;

i++;i++;

}

}

}

void tempchange(void) //DS18B20 開始獲取溫度並轉換

{

dsreset(); //初始化,每次對18B20的操作都首先要初始化

delay_ms(1);

tempwritebyte(0xcc); // 寫跳過讀ROM指令

tempwritebyte(0x44); // 寫溫度轉換指令

}

void get_temp() //讀取寄存器中存儲的溫度數據

{

uchar a,b;

dsreset(); //初始化

delay_ms(1);

tempwritebyte(0xcc); // 寫跳過讀ROM指令

tempwritebyte(0xbe); //寫讀指令

a=tempread(); //讀低8位

b=tempread(); //讀高8位

temp1=b;

temp1=8; //兩個字節組合為1個字

temp1=temp1|a;

f_temp=temp1*0.0625; //溫度在寄存器中為12位 分辨率位0.0625°

}

//**************************************************************

// 解密函數

//**************************************************************

void unlock()

{

uchar in,i;

if(num==0)

{

lcd_xieping(0,0,”**密碼鎖系統** “);

lcd_xieping(1,0,”—————————”);

lcd_xieping(2,0,” 請輸入密碼: “);

lcd_xieping(3,0,” “);

for(i=0;i4;i++)

{

t1[i]=keyscan1();

lcd_xieping(3,i,”*”);

num=0;

}//輸密碼

}

in=keyscan1();

if(in==12)//in-確定鍵標誌位

{

in=0;

num=0;

if((t1[0]==t[0])(t1[1]==t[1])(t1[2]==t[2])(t1[3]==t[3]))

{

flag=1;//解密成功與否標誌位

//unlock_i=1;

a=0;//功能鍵標誌

lcd_xieping(0,0,”**密碼鎖系統** “);

lcd_xieping(1,0,”——————————”);

lcd_xieping(2,0,” 密碼正確! “);

lcd_xieping(3,0,” 您的身份已確認”);

delay_ms(1500);

lcd_xieping(1,0,”————————”);

lcd_xieping(2,0,”功能 I 開鎖 “);

lcd_xieping(3,0,” II修改密碼”);

}

else

{

flag=0;

count++;

if(count==3)

{

count=0;

num=1;

lcd_xieping(1,0,”——————————”);

lcd_xieping(2,0,”您的機會已用完 “);

lcd_xieping(3,0,”對不起**無法進入”);

FM=0;

delay_ms(1000);

FM=1;

}

}

}

}

//**************************************************************

// 修改密碼函數

//**************************************************************

void xiugaimima()

{ uchar i,j,l,im,ib;

uchar t2[4];

uchar t3[4];

num=0;

lcd_xieping(1,0,”————————”);

lcd_xieping(2,0,”請輸入新密碼: “);

lcd_xieping(3,0,” “);

for(i=0;i4;i++)

{

t2[i]=keyscan1();

lcd_xieping0(3,i,mima[num]);

num=0;

}

im=keyscan1();

if(im==12)//im,in,ib,同為確定鍵標誌位

{

im=0;

num=0;

lcd_xieping(1,0,”————————”);

lcd_xieping(2,0,”請再次輸入新密碼”);

lcd_xieping(3,0,” “);

for(i=0;i4;i++)

{

t3[i]=keyscan1();

lcd_xieping0(3,i,mima[num]);

num=0;

}

}

ib=keyscan1();

if(ib==12)

{

ib=0;

num=0;

if(t2[0]==t3[0]t2[1]==t3[1]t2[2]==t3[2]t2[3]==t3[3])

{

t[0]=t3[0];

t[1]=t3[1];

t[2]=t3[2];

t[3]=t3[3];

lcd_xieping(1,0,”————————”);

lcd_xieping(2,0,” 祝賀您! “);

lcd_xieping(3,0,” 密碼修改成功 “);

flag=0;

for(j=0;j4;j++)

{

l=j+1;

write(l,t[j]);

delay_ms(10);

}//24C08寫數據

delay_ms(1000);

}

else

{

lcd_xieping(2,0,”兩次輸入密碼不同”);

lcd_xieping(3,0,” 密碼修改失敗 “);

flag=1;

delay_ms(500);

}

}

}

//**************************************************************

// 顯示函數

//**************************************************************

void xianshi()

{

donetime();

tempchange();

get_temp();

s_temp=f_temp*100;

temp0[7]=(s_temp/1000)+48;

temp0[8]=(s_temp%1000/100)+48;

temp0[10]=(s_temp%100/10)+48;

temp0[11]=(s_temp%10)+48;

lcd_xieping(0,0,”**密碼鎖系統** “);

lcd_xieping(1,0,temp0);

lcd_xieping(2,0,day);

lcd_xieping(3,0,time);

num=0;

}

//**************************************************************

// 開鎖函數

//**************************************************************

void kaisuo()

{

uchar i;

lcd_xieping(2,0,” 開鎖中…… “);

lcd_xieping(3,0,”——耐心等待——”);

for(i=3;i0;i–)

{

FM=0;

delay_ms(100);

FM=1;

delay_ms(100);

flag=0;

}

dianjiZZ();

delay_ms(10000);

dianji_stop();

lcd_xieping(2,0,”—開鎖過程結束—”);

lcd_xieping(3,0,” 請開門 “);

delay_ms(5000);

dianjiFZ();

delay_ms(10000);

dianji_stop();

flag=0;

}

//**************************************************************

// 主函數

//**************************************************************

void main()

{

uchar m;

unlock_i=1;

lcd_init(); //液晶初始化

//Init1302();

kjxs(); //開機顯示

for(m=0;m4;m++)

{

t[m]=read(m+1);

delay_ms(10);

}//24C08讀數據

while(1)

{

reshi();

if(!unlock_i)

{

unlock();//解密函數

}

else

{

xianshi();//時間、日期、溫度顯示函數

}

if(flag==1)

{

num1=0;

a=keyscan2();

if(a==1)

{

kaisuo();//開鎖函數

}

if(a==2)

{

xiugaimima();//修改密碼函數

}

}

}

}

單片機c語言密碼鎖程序

includereg52.h //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義

#define DataPort P0 //定義數據端口 程序中遇到DataPort 則用P0 替換

#define KeyPort P1

sbit LATCH1=P2^2;//定義鎖存使能端口 段鎖存

sbit LATCH2=P2^3;// 位鎖存

unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,

0x77,0x7c,0x39,0x5e,0x79,0x71};// 顯示段碼值0~F

unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分別對應相應的數碼管點亮,即位碼

unsigned char TempData[10]; //存儲顯示值的全局變量

unsigned char code password[8]={1,2,3,4,5,6,7,8};

//可以更改此密碼做多組測試

void DelayUs2x(unsigned char t);//us級延時函數聲明

void DelayMs(unsigned char t); //ms級延時

void Display(unsigned char FirstBit,unsigned char Num);//數碼管顯示函數

unsigned char KeyScan(void);//鍵盤掃描

unsigned char KeyPro(void);

void Init_Timer0(void);//定時器初始化

/*————————————————

主函數

————————————————*/

void main (void)

{

unsigned char num,i,j;

unsigned char temp[8];

bit Flag;

Init_Timer0();

while (1) //主循環

{

num=KeyPro();

if(num!=0xff)

{

if(i==0)

{

for(j=0;j8;j++)//清屏

TempData[j]=0;

}

if(i8)

{

temp[i]=dofly_DuanMa[num];//把按鍵值輸入到臨時數組中

for(j=0;j=i;j++) //通過一定順序把臨時數組中

//的值賦值到顯示緩衝區,從右往左輸入

TempData[7-i+j]=temp[j];

}

i++; //輸入數值累加

if(i==9)//正常等於8即可,由於我們需要空一個用於清屏,

//清屏時的按鍵不做輸入值

{

i=0;

Flag=1;//先把比較位置1

for(j=0;j8;j++)//循環比較8個數值,

//如果有一個不等 則最終Flag值為0

Flag=Flag(temp[j]==dofly_DuanMa[password[j]]);

//比較輸入值和已有密碼

for(j=0;j8;j++)//清屏

TempData[j]=0;

if(Flag)//如果比較全部相同,標誌位置1

{

TempData[0]=0x3f; // “o”

TempData[1]=0x73; // “p”

TempData[2]=0x79; // “E”

TempData[3]=0x54; // “n”

//說明密碼正確,輸入對應操作 顯示”open”

}

else

{

TempData[0]=0x79; // “E”

TempData[1]=0x50; // “r”

TempData[2]=0x50; // “r”

//否則顯示”Err”

}

}

}

}

}

/*————————————————

uS延時函數,含有輸入參數 unsigned char t,無返回值

unsigned char 是定義無符號字符變量,其值的範圍是

0~255 這裡使用晶振12M,精確延時請使用彙編,大致延時

長度如下 T=tx2+5 uS

————————————————*/

void DelayUs2x(unsigned char t)

{

while(–t);

}

/*————————————————

mS延時函數,含有輸入參數 unsigned char t,無返回值

unsigned char 是定義無符號字符變量,其值的範圍是

0~255 這裡使用晶振12M,精確延時請使用彙編

————————————————*/

void DelayMs(unsigned char t)

{

while(t–)

{

//大致延時1mS

DelayUs2x(245);

DelayUs2x(245);

}

}

/*————————————————

顯示函數,用於動態掃描數碼管

輸入參數 FirstBit 表示需要顯示的第一位,如賦值2表示從第三個數碼管開始顯示

如輸入0表示從第一個顯示。

Num表示需要顯示的位數,如需要顯示99兩位數值則該值輸入2

————————————————*/

void Display(unsigned char FirstBit,unsigned char Num)

{

static unsigned char i=0;

DataPort=0; //清空數據,防止有交替重影

LATCH1=1; //段鎖存

LATCH1=0;

DataPort=dofly_WeiMa[i+FirstBit]; //取位碼

LATCH2=1; //位鎖存

LATCH2=0;

DataPort=TempData[i]; //取顯示數據,段碼

LATCH1=1; //段鎖存

LATCH1=0;

i++;

if(i==Num)

i=0;

}

/*————————————————

定時器初始化子程序

————————————————*/

void Init_Timer0(void)

{

TMOD |= 0x01; //使用模式1,16位定時器,使用”|”符號可以在使用多個定時器時不受影響

//TH0=0x00; //給定初值

//TL0=0x00;

EA=1; //總中斷打開

ET0=1; //定時器中斷打開

TR0=1; //定時器開關打開

}

/*————————————————

定時器中斷子程序

————————————————*/

void Timer0_isr(void) interrupt 1

{

TH0=(65536-2000)/256; //重新賦值 2ms

TL0=(65536-2000)%256;

Display(0,8); // 調用數碼管掃描

}

/*————————————————

按鍵掃描函數,返回掃描鍵值

————————————————*/

unsigned char KeyScan(void) //鍵盤掃描函數,使用行列反轉掃描法

{

unsigned char cord_h,cord_l;//行列值中間變量

KeyPort=0x0f; //行線輸出全為0

cord_h=KeyPort0x0f; //讀入列線值

if(cord_h!=0x0f) //先檢測有無按鍵按下

{

DelayMs(10); //去抖

if((KeyPort0x0f)!=0x0f)

{

cord_h=KeyPort0x0f; //讀入列線值

KeyPort=cord_h|0xf0; //輸出當前列線值

cord_l=KeyPort0xf0; //讀入行線值

while((KeyPort0xf0)!=0xf0);//等待鬆開並輸出

return(cord_h+cord_l);//鍵盤最後組合碼值

}

}return(0xff); //返回該值

}

/*————————————————

按鍵值處理函數,返回掃鍵值

————————————————*/

unsigned char KeyPro(void)

{

switch(KeyScan())

{

case 0x7e:return 0;break;//0 按下相應的鍵顯示相對應的碼值

case 0x7d:return 1;break;//1

case 0x7b:return 2;break;//2

case 0x77:return 3;break;//3

case 0xbe:return 4;break;//4

case 0xbd:return 5;break;//5

case 0xbb:return 6;break;//6

case 0xb7:return 7;break;//7

case 0xde:return 8;break;//8

case 0xdd:return 9;break;//9

case 0xdb:return 10;break;//a

case 0xd7:return 11;break;//b

case 0xee:return 12;break;//c

case 0xed:return 13;break;//d

case 0xeb:return 14;break;//e

case 0xe7:return 15;break;//f

default:return 0xff;break;

}

}

原創文章,作者:CHEG,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/140330.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
CHEG的頭像CHEG
上一篇 2024-10-04 00:23
下一篇 2024-10-04 00:23

相關推薦

  • 單片機打印函數

    單片機打印是指通過串口或並口將一些數據打印到終端設備上。在單片機應用中,打印非常重要。正確的打印數據可以讓我們知道單片機運行的狀態,方便我們進行調試;錯誤的打印數據可以幫助我們快速…

    編程 2025-04-29
  • 單片機課程設計心得體會

    單片機課程設計體驗,不僅能夠讓我們初步掌握單片機基本概念,更能夠讓我們在實踐中加深對學習內容的理解和實際操作能力的提升。在此過程中,我總結了以下幾方面的經驗和體會。 一、選擇合適的…

    編程 2025-04-27
  • PIC單片機——高性能微控制器

    一、介紹 PIC(Peripheral Interface Controller)是一種高性能微控制器,由Microchip Technology公司推出。PIC採取哈佛架構,對定…

    編程 2025-02-01
  • 單片機入門詳解

    一、單片機是什麼 單片機(Microcontroller Unit, 簡稱MCU)是一種集成了微處理器、存儲器、定時器、輸入/輸出端口等功能於一體的微型計算機系統。它由CPU、RA…

    編程 2025-01-21
  • 單片機發c語言,c語言寫單片機程序

    本文目錄一覽: 1、單片機C語言編程,要使用C語言自帶的庫函數,使用哪個宏包含命令? 2、單片機c語言編程? 3、C語言怎麼寫進單片機? 單片機C語言編程,要使用C語言自帶的庫函數…

    編程 2025-01-07
  • php在線多人聊天程序下載,php在線編程

    本文目錄一覽: 1、php聊天室 2、php實時在線視頻聊天怎麼實現? 3、php怎麼用websocket做ie也可以支持的多人聊天室 4、anlin-chat下載了怎麼安裝 ph…

    編程 2025-01-04
  • msp430單片機c語言語句y,msp430 c語言

    本文目錄一覽: 1、msp430單片機c語言編程中斷函數問題 2、簡單的msp430編程問題C語言 3、msp430 pragma 單片機 C語言 4、MSP430單片機C語言編程…

    編程 2025-01-04
  • 單片機時鐘

    一、單片機時鐘程序 單片機時鐘程序是一個基於單片機的計時程序,它能夠精確計時並輸出當前時間。單片機時鐘程序的實現需要通過定時器來控制計時,並通過外部顯示器等設備來實現時間輸出。下面…

    編程 2025-01-03
  • 單片機c語言編程,單片機c語言編程300例

    本文目錄一覽: 1、單片機c語言編程? 2、at89c51單片機 如何用c語言編程啊? 3、單片機 c語言編寫 4、單片機C語言編程教程 單片機c語言編程? 單片機C語言程序設計入…

    編程 2025-01-03
  • 單片機技術應用c語言仿真版,單片機c語言編程免費下載pdf

    本文目錄一覽: 1、《單片機C語言程序設計實訓100例——基於8051+Proteus仿真》第03篇源代碼 2、《單片機C語言程序設計實訓100例——基於8051+Proteus仿…

    編程 2025-01-02

發表回復

登錄後才能評論