|
這是一個電子密碼鎖的程序,初始密碼輸入后選擇1在輸入密碼,這時P2.3卻無法變為低電平,請大神看看有什么問題
#include<reg51.h>
#include<intrins.h.>
#define uchar unsigned char
#define uint unsigned int
sbit RS = P2^0;
sbit RW = P2^1;
sbit E = P2^2;
sbit P2_3 = P2^3;
sbit P2_4 = P2^4;
sbit P2_5 = P2^5;
sbit reset = P2^6;
sbit Sound = P2^7;
sbit scl = P3^6;
sbit sda = P3^7;
sbit led = P3^0;
uchar scan_1[6];
uchar password_1[7];
uchar newpassword_1[6];
uchar password_4[7]={0,0,0,0,0,0,1};
uchar code scan[6]={"******"};
uchar code table[]={0x7b,0xed,0xeb,0xe7,0xdd,0xdb,0xd7,0xbd,0xbb,0xb7,0x7d,0x77};
uchar code table1[]={"Input Code"};
uchar code table2[]={"Function Select"};
uchar code table3[]={"Input Code Again"};
uchar code table4[]={"[1]Open [2]Reset"};
uchar code table5[]={"Input New Code"};
uchar code table6[]={"Comfirm New Code"};
uchar code table7[]={"Success!"};
uchar code table8[]={"Failure!"};
uchar code table9[]={"Warning!"};
uchar code Array1[]={ 0x1C, 0x20,0x20, 0x20,0x1C,0x20,0x18,0x20, 0x20,0x80,0xFF,0x20};
void Read_Code(uchar password[],uchar address,uchar num);
void Write_Code(uchar Data[],uchar address,uchar num);
void Start();
void stop();
void Ack();
void NoAck();
uchar read_byte();
void write_byte(uchar date);
void lcd_init();
void write_com(uchar com);
void write_data(uchar date);
void delay();
void delay_ms(uint z);
void print(uchar tab[],uchar len,uchar loc,bit res);
void num9();
void num10();
void num11();
void Test1();
void Test2();
void Sound_Delay(uchar n);
void Music();
void Alarm();
void Music1();
void errorMusic(uint t);
char scan_num=-1; //鍵盤號數
uchar scan_len=0; //輸入數的長度
uchar yes,key,flag;
uchar Sound_Signal;//定義音符大小
uchar Sound_Pace;//定義節拍大小
uchar Counter1;
uchar error;
void main()
{
P2_3 = 1; //密碼鎖關
P2_4 = 1;
P2_5 = 1;
Sound = 1;
EA=1; //開總中斷
EX0=1; //開外部中斷0
IT0=1; //中斷0下降沿觸發
TMOD=0x01; //定時器0工作方式1
TH0=0xff;
TL0=0xff;
ET0=1; //開定時器0中斷
P1=0xf0;
led = 1;
if( reset == 0) //如果鍵按下,則密碼清零,恢復出廠設置
Write_Code(password_4,0,6);
Read_Code(password_1,0,7); //從24C02中讀密碼
if(password_1[6] == 1) //之前對各卡的第七位分別寫入1,2,3
flag = 1;
if(password_1[6] == 2)
flag = 2;
if(password_1[6] == 3)
flag = 3;
lcd_init(); //LCD初始化
while(1)
{
if(scan_num!=-1)
{
if(scan_num<=9)
{
num9(); //數字0~9處理
}
if(scan_num==10)
{
num10(); //刪除
}
if(scan_num==11)
{
if(scan_len == 6)
{
num11(); //確定
Music();
if(key == 2) //再次輸入新密碼后確認鍵
{
key = 0;
Test2();
return;
}
Test1(); //提示"Input Code"輸入的密碼確認后判斷是否正確
}
}
}
}
}
void Read_Code(uchar password[],uchar address,uchar num) //從24C02中讀數據
{
uchar i;
for(i=0;i<num;i++)
{
Start(); //開始信號
write_byte(0xa0); //寫控制字
Ack(); //應答信號
write_byte(address+i); //讀地址
Ack(); //應答信號
Start(); //開始信號
write_byte(0xa1); //讀控制字
Ack(); //應答信號
password[i] = read_byte(); //讀數據
NoAck(); //非應答信號
stop(); //停止信號
}
}
void Write_Code(uchar Data[],uchar address,uchar num) //把數據寫到24C02
{
uchar i;
for(i=0;i<num;i++)
{
Start(); //開始信號
write_byte(0xa0); //寫控制字
Ack(); //應答信號
write_byte(address+i); //寫地址
Ack(); //應答信號
write_byte(Data[i]); //寫數據
Ack(); //應答信號
stop(); //停止信號
delay_ms(10);
}
}
void Start() //開始信號
{
sda = 1;
delay();
scl = 1;
delay();
sda = 0;
delay();
}
void stop() //停止信號
{
sda = 0;
delay();
scl = 1;
delay();
sda = 1;
delay();
}
void Ack() //應答信號
{
uchar i;
scl = 1;
delay();
while((sda == 1)&&(i < 250))
i++;
scl = 0;
delay();
}
void NoAck() //非應答信號
{
sda=1;
delay();
scl=1;
delay();
scl=0;
delay();
}
uchar read_byte() //讀字節數據
{
uchar i,k;
scl = 0;
delay();
sda = 1;
delay();
for(i = 0;i < 8;i++)
{
scl = 1;
delay();
k = (k<<1)|sda;
scl = 0;
delay();
}
return k;
}
void write_byte(uchar date) //寫字節數據
{
uchar i,temp;
temp = date;
for(i = 0;i < 8;i++)
{
temp = temp<<1;
scl = 0;
delay();
sda = CY;
delay();
scl = 1;
delay();
}
scl = 0;
delay();
sda = 1;
delay();
}
void lcd_init()
{
//uchar i;
write_com(0x38); //設置16*2顯示,5*7點陣,8位數據接口
write_com(0x0c); //設置開顯示,不顯示光標
write_com(0x06); //寫一個字符后地址指針加1
write_com(0x01); //顯示清0,數據指針清0
write_com(0x80 + 0x03); //設置數據地址指針位置
/*for(i = 0;i <10;i++)
{
write_data(table1[i]);
delay_ms(5);
}與下句語句等價 */
print(table1,10,0x83,1); //LCD顯示“Input Code”
}
/*LCD顯示,輸出函數*/
void print(uchar tab[],uchar len,uchar loc,bit res)
{
uchar i,n;
if(res==1)
{
write_com(0x01); //光標復位
}
write_com(loc); //設置顯示起始位置
for(n=0;n<len;n++)
{
i=tab[n];
write_data(i);
}
for(n=len;n<6;n++)
{
write_data(32); //空格
}
}
void write_com(uchar com) //向LCD寫命令
{
RS = 0;
RW = 0;
P0 = com;
delay_ms(5);
E = 1;
delay_ms(5);
E = 0;
}
void write_data(uchar date) //向LCD寫數據
{
RS = 1;
RW = 0;
P0 = date;
delay_ms(5);
E = 1;
delay_ms(5);
E = 0;
}
/*按下鍵盤產生中斷,中斷程序*/
void EX_INT0() interrupt 0
{
uchar aa,bb,i,j;
EA = 0; //關總中斷
P1 = 0xf0;
if((P1 & 0xf0) != 0xf0)
{
delay_ms(5);
if((P1 & 0xf0) != 0xf0)
{
aa = 0xfe;
for(i = 0;i < 4;i++)
{
P1 = aa;
if((P1 & 0xf0) != 0xf0)
{
bb = P1;
for(j=0;j<16;j++)
{
if(bb == table[j])
{
scan_num = j;
}
}
}
else
aa = _crol_(aa,1);
}
}
}
P1 = 0xf0;
EA=1; //開總中斷
}
/*輸入數字0~9處理函數*/
void num9()
{
uchar i;
if(scan_len>5)
return;
if(yes == 1) // 提示“Input Code”輸入正確密碼后
{
if(scan_num == 1) //鍵1開鎖鍵
{
Music();
yes = 0;
scan_num=-1;
if(flag == 1)
{
flag = 0;
P2_3 = 0;
}
if(flag == 2)
{
flag = 0;
P2_3 = 0;
P2_4 = 0;
}
if(flag == 3)
{
flag = 0;
P2_3 = 0;
P2_4 = 0;
P2_5 = 0;
}
print(table1,10,0x83,1); //LCD顯示“Input Code”
}
if(scan_num == 2) //鍵2設置新密碼
{
Music();
yes = 0;
print(table5,14,0x81,1); //LCD顯示“Input New Code”
scan_num=-1;
key = 1;
}return;
}
Music();
scan_1[scan_len] = scan_num;
//scan[scan_len] = scan_num + 48;
scan_len++;
print(scan,scan_len,0xc5,0); //顯示密碼值
scan_num=-1;
if(key == 1) //輸入6位新密碼后,提示“Comfirm New Code”
{
if(scan_len == 6)
{
scan_len = 0;
for(i = 0;i < 6;i++)
newpassword_1[i] = scan_1[i];
key = 2;
print(table6,16,0x80,1); //LCD顯示“Comfirm New Code”
}
}
}
/*刪除鍵*/
void num10()
{
if(scan_len>0)
{
Music();
scan_len=scan_len-1;//字符串的長度減少一位
print(scan,scan_len,0xc5,0); //顯示輸入值刪除一位后的新值
scan_num=-1;
}
}
/*確認鍵*/
void num11()
{
// if(scan_len == 0)
// {
// return;
// }
scan_num=-1;
scan_len=0;
}
void Test1() //輸入的密碼是否正確
{
uchar i;
if((password_1[0]==scan_1[0])&&(password_1[1]==scan_1[1])&&(password_1[2]==scan_1[2])&&(password_1[3]==scan_1[3])&&(password_1[4]==scan_1[4])&&(password_1[5]==scan_1[5]))
{
yes=1;
print(table2,15,0x81,1);
print(table4,16,0xc0,0);
}
else
{
yes=0;
print(table3,16,0x80,1); //LCD顯示“Input Code Again”
error++;
if(error == 3)
{
error = 0;
print(table9,8,0x84,1); //LCD顯示“Warning!”
for(i = 0;i < 10;i++ )
{
errorMusic(90);
errorMusic(120);
led = ~led;
}
delay_ms(1000);
led = 1;
print(table1,10,0x83,1); //LCD顯示“Input Code”
}
}
}
void Test2() //修改密碼時兩次輸入的密碼是否相同
{
if((newpassword_1[0]==scan_1[0])&&(newpassword_1[1]==scan_1[1])&&(newpassword_1[2]==scan_1[2])&&(newpassword_1[3]==scan_1[3])&&(newpassword_1[4]==scan_1[4])&&(newpassword_1[5]==scan_1[5]))
{
Write_Code(newpassword_1,0,6); //向24c02寫入新密碼
print(table7,8,0x84,1); //LCD顯示“Success!”
Alarm();
delay_ms(1000);
Read_Code(password_1,0,6);
print(table1,10,0x83,1); //LCD顯示“Input Code”
}
else
{
print(table8,8,0x84,1); //LCD顯示“Failure!”
Music1();
delay_ms(1000);
print(table1,10,0x83,1); //LCD顯示“Input Code”
}
}
void timer0(void) interrupt 1 using 1
{
Counter1++; //節拍次數計數
TH0=0xd8; //定義單位節拍的延時大小
TL0=0xef;
}
void Music() //按鍵聲
{
Sound_Signal=Array1[0];
Sound_Pace=Array1[1];
TR0=1;
//當節拍數未達到時候,繼續循環,產生該音調的聲音
while(Counter1!=Sound_Pace)
{
Sound=~Sound;
Sound_Delay(Sound_Signal);
}
Counter1=0;//節拍計數器置0,進入下一個音調
TR0=0;
}
void Alarm() //設置密碼成功后的聲音
{
Sound_Signal=Array1[2];
Sound_Pace=Array1[3];
TR0=1;
//當節拍數未達到時候,繼續循環,產生該音調的聲音
while(Counter1!=Sound_Pace)
{
Sound=~Sound;
Sound_Delay(Sound_Signal);
}
// i++;
Counter1=0;//節拍計數器置0,進入下一個音調
TR0=0;
}
void Music1() //設置密碼失敗后的聲音
{
uchar i=0;
while(i<14)
{
Sound_Signal=Array1[i];
Sound_Pace=Array1[++i];
TR0=1; //開定時器T0
while(Counter1!=Sound_Pace)
{
Sound=~Sound;
Sound_Delay(Sound_Signal);
}
Counter1=0;
TR0=0;
i++;
}
}
void errorMusic(uint t)
{
uchar i,j;
for(i=0;i<100;i++)
{
Sound=~Sound;
for(j=0;j<t;j++);
}
}
void Sound_Delay(uchar n)
{
uchar i;
while(n--)
{
for(i=0;i<2;i++);
}
}
void delay()
{
uchar i,j;
for(i=1;i>0;i--)
for(j=20;j>0;j--);
}
void delay_ms(uint z)
{
uint x,y;
for(x = z;x > 0;x--)
for(y = 110;y > 0;y--);
}
|
-
12.png
(48.08 KB, 下載次數: 90)
下載附件
2017-12-24 16:23 上傳
p2.3應產生跳變與1N4001連接使二極管亮起來
|