本文目錄一覽:
- 1、求51單片機C語言編的密碼鎖程序
- 2、求51單片機4*3矩陣鍵盤6位密碼鎖c語言程序
- 3、求51單片機C語言編的簡易密碼鎖程序
- 4、求51單片機簡易密碼鎖C語言程序 要求用到矩陣鍵盤、數碼管和流水燈
- 5、基於51單片機的密碼鎖程序
- 6、單片機c語言密碼鎖程序
求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