用单片机设计一个简易的密码锁,用键盘输入0~9三位数的密码.密码输入正确显示“P”约3s,并通过P3.0端口将
我可以提供给你做一个,但有几个问题
1、加点后是什么意思,不是没有小数点吗,加电后?
2、用什么型号的的单片机
3、要存密码必须有存储器,24C02什么的行吗
#include
#define uint unsigned int
#define uchar unsigned char
#define KEY P3 //键盘输入端口
#define No_key 20 //无按键时的返回值
#define lcddata P2 //1602的数据输入端口
sbit lcden= P1^2;
sbit lcdrs= P1^0;
sbit lcdrw= P1^1;
sbit light= P1^3;
sbit light1= P1^4;
uchar j ; //用来统计输入 个数的全局变量
uchar aa; //用来在定时器中计数的 全局变量
uchar code table[]= " Hello!";
uchar code table1[]=" OK! " ;
uchar code table2[]="Enter please:" ;
uchar code key_table[16] =
{
1,2,3,10,
4,5,6,11,
7,8,9,12,
0,13,14,15
};
uchar password[]={2,0,1,0,9,3} ; //设定初始密码
uchar save[6]; //保存输入的数据
uchar conflag ; //确认标志
uchar lockflag; //锁键盘标志
uchar startflag; //开始标志
void delay(uint z); //延时子函数
void wright_com(uchar com); //写指令函数
void wright_data(uchar date) ; //写数据函数
void init(); //初始化
void display_OK(); // 显示OK
void delete(); //删除输入的最后一个数
uchar keyscan() ; //带返回值的键盘扫描程序
void enter_code(uchar t); //输入密码函数,把输入的数据存入数组中并在屏幕上显示相应的东西,
void confirm(); //确认密码对不对,把输入的数据与密码逐一对比,完全一样刚正确,
void succeed_an(); //输入密码成功时的 响应,
void fail_an(); //输入密码 失败时 响应
void lockkey(); //锁键盘三秒
void alarm(); //发出警报声
void reset(); //复位函数
void display_enter(); //显示输入
void main(void)
{
uchar temp;
init();
while(1)
{
if(lockflag)
{
temp=keyscan(); // 锁键期间也要进行键盘扫描
if(temp!=No_key) //重新记时三秒
{
aa=0; //重新在定时器中计数
}
}
else
{
temp=keyscan(); //反复扫描输入,等待随时输入
if(temp!=No_key) //有按键按下才进行下面的操作
{
if(temp==10)
{
reset();
startflag=1; //开始标志置位
}
if(startflag)
{
enter_code(temp); //每扫描一次键盘就要进行一次处理,保存输入的数值
if(temp==13) //按下确认键盘就要进行密码确认
{
confirm(); //进行确认判断
if(conflag) //密码确认为正确
{
succeed_an(); //密码正确,作出相应的反应
}
else
{
fail_an(); //密码错误,作相应反应
}
}
if(temp==14)
{
delete(); //作删除操作
}
}
}
}
}
}
/****** 显示enter********/
void display_enter()
{
uchar num;
wright_com(0x80);
for(num=0;num<13;num++)
{
wright_data(table2[num]);
}
}
/****** 显示OK********/
void display_OK()
{
uchar num;
wright_com(0x80);
for(num=0;num<13;num++)
{
wright_data(table1[num]);
}
}
/****** 删除最后一个********/
void delete()
{
wright_com(0x80+0x40+j); //确定删除对象
wright_data(' '); //显示空格即为删除
save[--j]=0; //删除后数据清零
wright_com(0x80+0x40+j); //为下次输入数据时写好位置,必须是在最后一个后面
}
/****** 对各种变量进行复位********/
void reset()
{
uchar num;
display_enter();
wright_com(0x80+0x40); //擦除屏幕上的显示
for(num=0;num<6;num++)
{
save[num]=0; //对输入的数值进行清零
wright_data(' '); //显示的是空格
}
wright_com(0x80+0x40); //下次再输入时可以又从起始位置输入
lockflag=0; //各种变量要清零回起始状态
conflag=0;
j=0;
}
/****** 输入密码正确进行响应********/
void succeed_an()
{
light=0; //灯亮
display_OK(); //显示成功
delay(1000);
light=1; //灯灭
}
/****** 输入密码错误进行响应********/
void fail_an()
{
alarm();
lockkey();
}
/****** 发出警报声**********/
void alarm() //这个以后再扩展它
{
}
/******锁键盘三秒************/
void lockkey()
{
lockflag=1;
}
/******输入密码并在屏幕上显示星号******/
void enter_code(uchar t)
{
if(t>=0&&t<10)
{
if(j==0)
{
wright_com(0x80+0x40) ; //第一输入时要先写入地址指令,否则无法显示
wright_data('*') ;
}
else
{
wright_data('*') ;//不是第一个输入则不用再写地址
}
save[j++]=t; //保存输入的数据
}
}
/******校对密码以确定是不是正确的**********/
void confirm()
{
uchar k;
for(k=0;k<6;k++)
{
if(password[k]!=save[k]) //对数组中的内容进行逐一比较,一旦有数据不对马上退出循环
{
break;
}
}
if(k==6) //要是条件退出的话说明六个数全对密码
{
conflag=1; // 进行标志密码正确
}
}
/******中断服务程序**********/
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //重装初值
if(lockflag)
{
aa++;
light1=0;
if(aa>=60) //三秒到了
{
aa=0; //清零可以方便下次再使用
light1=1; //关闭警报
lockflag=0; //标志清零解除键锁,方便下次使用
}
}
}
/******初始化***********/
void init()
{
uchar num;
/*****定时器初始化****/
TMOD=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
EA=1; //开启总中断
TR0=1;//把定时器关闭
/****1602初始化******/
lcdrw=0; //这个必须要置 零,否则无法正常显示
lcden=0;
wright_com(0x38) ; //初始化
wright_com(0x0c) ; //打开光标 0x0c不显示光标 0x0e光标不闪,0x0f光标闪
wright_com(0x01) ; //清显示
wright_com(0x80) ;
for(num=0;num<9;num++)
{
wright_data(table[num]);
delay(1);
}
}
/******1602写入指令************/
void wright_com(uchar com)
{
lcdrs=0;
lcddata=com;
delay(1);
lcden=1;
delay(1);
lcden=0;
}
/******1602写入数据***********/
void wright_data(uchar date)
{
lcdrs=1;
lcddata=date;
delay(1);
lcden=1;
delay(1);
lcden=0;
}
/******延时函数************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--) ;
}
/**********4x4矩阵键盘扫描函数*********/
uchar keyscan()
{
uchar temp,num=No_key; //num的初值要为无键盘按下时的返回值
/*********扫描第一行****************/
KEY=0xfe;
temp=KEY;
temp=temp&0xf0; //读出高四位
while(temp!=0xf0)
{
delay(5); //延时消抖
temp=KEY;
temp=temp&0xf0;
while(temp!=0xf0) //确认确实有按键按下
{
temp=KEY;
switch(temp) //根据这八个电平可以确定是哪个按键按下
{
case 0xee:num=1;
break;
case 0xde:num=2;
break;
case 0xbe:num=3;
break;
case 0x7e:num=10;
break;
}
while(temp!=0xf0) //等待松手
{
temp=KEY;
temp=temp&0xf0;
}
}
}
/*********扫描第二行***************/
KEY=0xfd;
temp=KEY;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=KEY;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=KEY;
switch(temp)
{
case 0xed:num=4;
break;
case 0xdd:num=5;
break;
case 0xbd:num=6;
break;
case 0x7d:num=11;
break;
}
while(temp!=0xf0)
{
temp=KEY;
temp=temp&0xf0;
}
}
}
/*********扫描第三行****************/
KEY=0xfb;
temp=KEY;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=KEY;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=KEY;
switch(temp)
{
case 0xeb:num=7;
break;
case 0xdb:num=8 ;
break;
case 0xbb:num=9;
break;
case 0x7b:num=12;
break;
}
while(temp!=0xf0)
{
temp=KEY;
temp=temp&0xf0;
}
}
}
/*********扫描第四行****************/
KEY=0xf7;
temp=KEY;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=KEY;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=KEY;
switch(temp)
{
case 0xe7:num=0;
break;
case 0xd7:num=13;
break;
case 0xb7:num=14;
break;
case 0x77:num=15;
break;
}
while(temp!=0xf0)
{
temp=KEY;
temp=temp&0xf0;
}
}
}
return num;
}
你这个问题内容量太大,不可能有谁那么多时间给你开发,我这边有个做过的类似的,代码送你了。
#include <msp430x14x.h>
#include "Delay.h"
#include "x24c02.h"
#include "LCD1602.h"
uchar LCD_ID_1[16] = {"Password: ------"};
uchar LCD_ID_2[16] = {"Old Code: ------"};
uchar LCD_ID_3[16] = {" "};
uchar LCD_ID_4[16] = {"New Code: ------"};
#define JI_OPEN P3OUT|=BIT6
#define JI_CLOSE P3OUT&=~BIT6
uchar a=10,b=10+0x40,c=0,i=0,j=0,k=0,super=0;
uchar flag=0;
uchar table1[6]={1,2,3,4,5,6};
uchar table2[6]={0,0,0,0,0,0};
uchar table3[6]={0,0,0,0,0,0};
uchar supercode[6]={8,8,8,8,8,8};
//SCL时钟线
#define SCO_SET P1OUT|=BIT3//输出高
#define SCO_RESET P1OUT&=(~BIT3)//输出低
#define SCO_IN (P1IN&BIT3)//输出
#define SCOIN P1DIR&=(~BIT3)//设置输入
#define SCOOUT P1DIR|=BIT3//设置输出
//SDA数据线
#define SDO_SET P1OUT|=BIT2
#define SDO_RESET P1OUT&=(~BIT2)
#define SDO_IN (P1IN&BIT2)
#define SDOIN P1DIR&=(~BIT2)
#define SDOOUT P1DIR|=BIT2
void shuru(void);
void shezhi(void);
void bijiao(void);
uchar chumo_read(void)
{
uchar i,dat;
SCOOUT;//设置输出
SCO_RESET;//输出低
SDOOUT;
SDO_SET;
delay_us(93);
SDO_RESET;
delay_us(10);
SDOIN;
for(i=0;i<16;i++)
{
SCO_SET;
delay_us(5);
if(SDO_IN!=0)
{
dat=i+1;
}
SCO_RESET;
delay_us(5);
}
delay_ms(2);
return dat;
}
void OPEN(void)
{
P1OUT |= BIT4;
P3OUT &=~BIT5;
delay_ms(1000);delay_ms(1000);
P3OUT &=~BIT5;
P1OUT &=~BIT4;
}
void CLOSE(void)
{
P3OUT |= BIT5;
P1OUT &=~BIT4;
delay_ms(1000);delay_ms(1000);
P3OUT &=~BIT5;
P1OUT &=~BIT4;
}
void main( void )
{
//系统初始化
WDT_Init(); //STOP WDT
MCLK_Init(); //MCLK=8M
Port_Init(); //CLOSE ALL PORT
P3DIR |= BIT5;
P1DIR |= BIT4;
P3OUT &=~BIT5;
P1OUT &=~BIT4;
d24c_init();
L1602_Init();
L1602_string(1, 1, LCD_ID_1);
P3DIR|=BIT6;
P3DIR&=~BIT7;
P6DIR|=BIT2;
JI_CLOSE;
delay_ms(10);
table1[0]=d24c_read(1);
delay_ms(20);
table1[1]=d24c_read(2);
delay_ms(20);
table1[2]=d24c_read(3);
delay_ms(20);
table1[3]=d24c_read(4);
delay_ms(20);
table1[4]=d24c_read(5);
delay_ms(20);
table1[5]=d24c_read(6);
delay_ms(500);
while(1)
{
delay_ms(100);
shuru();
shezhi();
bijiao();
}
}
void shuru(void)
{
wcmd(0x80+a+c);
wcmd(0x0f);
if((chumo_read()!=0)&&(chumo_read()<11))
{
delay_ms(10);
if(chumo_read()!=0)
{
table2[c]=chumo_read();
L1602_char(1,a+c+1,(chumo_read()%10)+0X30);
c++;
delay_ms(500);
if(c==6)
{
c=0;
L1602_string(1, 1, LCD_ID_1);
}
}
}
j=0;
for(i=0;i<6;i++)
{
if(table1[i]!=table2[i])
{
j=1;
break;
}
}
if(chumo_read()==13)
{
delay_ms(10);
if(chumo_read()==13)
{
c=0;
L1602_string(1, 1, LCD_ID_1);
delay_ms(1000);
}
}
}
void shezhi(void)
{
if(chumo_read()==16)
{
delay_ms(10);
if(chumo_read()==16)
{
L1602_string(1, 1, LCD_ID_3);
L1602_string(2, 1, LCD_ID_2);
flag=1;
c=0;
delay_ms(500);
}
}
while(flag==1)
{
wcmd(0x80+0x40+a+c);
wcmd(0x0f);
if((chumo_read()!=0)&&(chumo_read()<11))
{
delay_ms(10);
if(chumo_read()!=0)
{
table2[c]=chumo_read();
L1602_char(2,a+c+1,(chumo_read()%10)+0X30);
c++;
delay_ms(500);
if(c==6)
{
c=0;
L1602_string(2, 1, LCD_ID_2);
super=1;
for(i=0;i<6;i++)
{
if(supercode[i]!=table2[i])
{
super=0;
break;
}
}
}
}
}
k=1;
for(i=0;i<6;i++)
{
if(table1[i]!=table2[i])
{
k=0;
break;
}
}
if(chumo_read()==13)
{
delay_ms(10);
if(chumo_read()==13)
{
c=0;
L1602_string(2, 1, LCD_ID_2);
delay_ms(1000);
}
}
if(k==1 || super == 1)
{
L1602_string(2, 1, LCD_ID_4);
}
while(k==1 || super==1)
{
wcmd(0x80+0x40+a+c);
wcmd(0x0f);
if((chumo_read()!=0)&&(chumo_read()<11))
{
delay_ms(10);
if(chumo_read()!=0)
{
table1[c]=chumo_read();
L1602_char(2,a+c+1,(chumo_read()%10)+0X30);
c++;
if(c==6)
{
delay_ms(1000);
c=0;
flag=0;
k=0;
super = 0;
d24c_write(1,table1[0]);
delay_ms(30);
d24c_write(2,table1[1]);
delay_ms(30);
d24c_write(3,table1[2]);
delay_ms(30);
d24c_write(4,table1[3]);
delay_ms(30);
d24c_write(5,table1[4]);
delay_ms(30);
d24c_write(6,table1[5]);
delay_ms(30);
L1602_string(1, 1, LCD_ID_1);
L1602_string(2, 1, LCD_ID_3);
}
}
delay_ms(400);
}
delay_ms(100);
if(chumo_read()==13)
{
delay_ms(10);
if(chumo_read()==13)
{
c=0;
L1602_string(2, 1, LCD_ID_2);
delay_ms(500);
}
}
}
}
}
void bijiao()
{
if((j==0)||((P3IN&BIT7)!=0))
{
JI_OPEN;
P6OUT&=~BIT2;
OPEN();
delay_ms(2000);
L1602_string(1, 1, LCD_ID_1);
for(i=0;i<6;i++)
{
table2[i]=0;
}
JI_CLOSE;
CLOSE();
}
else
{
P6OUT|=BIT2;
}
}
我以前写过一个程序,要是找找,还是能找到的,要比你的电路简单多了.
输出就不讲了,输出电平时间是可以设置的.
输入我讲一下,我用的是1个按键,密码输入方法类似摩尔斯码,如输入2,就是连续的按2下,如果输入8,就连续按8下,在这个按键上并一个LED,这个LED为状态显示,当密码输入正确时,LED闪一下.
如果密码都正确,输出脚输出高电平.
这个电路简单吧.
按你说的有点麻烦 不过还是可以完成的
还可以不难
懂事电子设计 Vgz
设计一个计时为1分钟的电子秒表单片机实验如何实现LED的动态扫描?_百...
要设计一个使用单片机实现的计时为1分钟的电子秒表,同时实现LED的动态扫描,你可以按照以下步骤进行:硬件准备:单片机:如Arduino UNO,具有数字和模拟输入\/输出引脚。LED:根据你的需要选择LED的数量和颜色。7段显示器:用于显示秒表的数字,可选。按键:用于启动、暂停和重置秒表。适当的电阻:用于限制...
有人可以帮我设计一个关于单片机的交通灯的程序吗,不需要太复杂_百度知 ...
include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit RED_A=P0^0; \/\/东西向灯sbit YELLOW_A=P0^1;sbit GREEN_A=P0^2;sbit RED_B=P0^3; \/\/南北向灯sbit YELLOW_B=P0^4;sbit GREEN_B=P0^5;uchar Flash_Count=0,Operation_Type=1; \/\/闪烁次数操作类型变量\/\/...
单片机的电路怎么设计
完成单片机最小系统后再完成LED灯的控制,LED灯与单片机的IO端口连接时,需要将LED灯串联220Ω的电阻限流。然后单片机的一组IO口最多串联2个LED灯,如果要多个LED灯,那最多可以在单片机的IO口并联4组2个串接在一起的LED灯。单片机有32个IO口,如此算下来,你一个IO口做多可以控制8个LED灯,那么32...
设计一个简单的单片机实例附加源代码加原理图(在线求!!!)
\/* 名称:闪烁的 LED 说明:LED 按设定的时间间隔闪烁 *\/ include<reg51.h> define uchar unsigned char define uint unsigned int sbit LED=P10;\/\/延时 void DelayMS(uint x){ uchar i;while(x--){ for(i=0;i<120;i++);} } \/\/主程序 void main(){ while(1){ LED=~LED;Delay...
求一段为51单片机编写的LCD电子时钟的设计,简单就好!高分伺候!
简单的时钟,不用1302即可办到。题目要求的设计已经完成,电路图如下。程序稍长,放在我的百度空间了。可以用百度、网页,进行查找:做而论道 用 LCD1602 显示的时钟 百度一下,即可查到。
51单片机简易电子钟设计。汇编语言编写
#0 CLR PAUSE SETB EA SETB ET1 SETB TR1LOOP: LCALL KEYSEL MOV A,KEYVAL CJNE A,#0FFH,LOOP1 SJMP LOOPLOOP1: CJNE A,#10,LOOP2 ;“ON”启动 SETB TR0 SETB ET0 SETB PAUSE SJMP LOOPLOOP2: CJNE A,#11,LOOP3 ;“=”清零 MOV SEC,#0 MOV MIN,#0 ...
用单片机设计简易计算器
;堆栈需求:1 UDIV: CLR C CLR A MOV R2,A MOV R3,A MOV B,#10H MOVBIT: MOV A,R7;R6、R7中数据左移一位到R2、R3中,C到R7 RLC A MOV R7,A MOV A,R6 RLC A MOV R6,A MOV A,R3 RLC A MOV R3,A MOV A,R2 RLC A MOV R2,A CLR C ...
用51单片机写一个程序:用定时中断T0T1控制4个数码管显示1...
用51单片机写一个程序:用定时中断T0T1控制4个数码管显示1...分内容转自:《51单片机C语言创新教程》温子祺等著。原理:软件设计方面使用动态驱动数码管的方式,即要保证当数码管显示时的效果没有闪烁的现象出现,亮 度一致,没有拖尾现象。由于人眼对频率大于对24Hz以上的光的闪烁不敏感,这是利用了...
设计一个单片机输入显示系统,要求每按一下按键数码管显示数据加1(数码...
设计一个单片机输入显示系统,要求每按一下按键数码管显示数据加1(数码管初始值为0,9加1 后显示0)...void DelayNms( uint N )\/\/ 利用x、y作简单的自减运算,消耗单片机指令周期,达到延时的目的
我想设计一个单片机C51按键控制发送不同个数脉冲的实验
【脉冲产生电路中方案】由电阻,电容,按键开关和施密特触发器构成。按键一下,输出一个负脉冲,其中电阻R和电容C主要用来去除抖动,对于按键的效果尤为重要。取VCC=5V ,对于R,C的选择必须满足按键 闭合后,能使电容C充电到VT+以上,从而使施密特触发器输出翻转 。其电路的结构为:...
致庙丹莪: //实例80:矩阵式键盘实现的电子密码锁 #include<reg51.h> //包含51单片机寄存器定义的头文件 sbit P14=P1^4; //将P14位定义为P1.4引脚 sbit P15=P1^5; //将P15位定义为P1.5引脚 sbit P16=P1^6; //将P16位定义为P1.6引脚 sbit P17=P1^7...
贡山独龙族怒族自治县13018542577: 如何利用51单片机设计一个电子密码锁系统 - ?
致庙丹莪: 用单片机最小系统,外扩一个4*4矩阵键盘,再加一个显示设备,蜂鸣器,就可以设计出一个密码锁系统了.
贡山独龙族怒族自治县13018542577: 求51单片机C语言编的简易密码锁程序 - ?
致庙丹莪: 首先得说明我这个可是自己原创手打的,但是没去仿真了,程序可能有错误,你自己修改下吧 #include<reg52.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=...
贡山独龙族怒族自治县13018542577: 求单片机简单密码程序! - ?
致庙丹莪: 这个简单.就象手机,开屏时,按圆圈连起来一样 要用个循环语句,一直扫描键盘输入.有输入就付给一个变量,连起来.最后和123原密对照
贡山独龙族怒族自治县13018542577: 用at89c51单片机制作密码锁,8位密码,用键盘操作,有一个清屏按键,密码正确PASS错误FALL - ?
致庙丹莪: 使用类似手机的阵列键盘,12个按键就足够了,只需要用到3X4,七个端口.在就是弄个液晶显示器.这个是最简单的一个单片机系统了.
贡山独龙族怒族自治县13018542577: (80C51单片机)设计4*4键盘及8位数码管显示构成的电子密码锁.的C语言程序. - ?
致庙丹莪: 4*4矩阵键盘检测程序(新手用),本程序用于检测4*4矩阵按键,先检测是否有按 键按下,如果有按键按下,由P1口读出相应的编码值,由P0经两片74HC573输出给8位数码管,P2^0位选,P2^1段选,P1接4*4矩阵按键#include #include //头文...
贡山独龙族怒族自治县13018542577: 基于ATMEL52单片机的密码锁程序?
致庙丹莪: 思路应该是用52单片机连个i2c接口的存储器芯片+个液晶屏显示密码+按键 存储器芯片存储密码,上电的时候单片机从存储器读出设置的密码,单片机判断按键是否按对密码,显示屏就提示正确,不然就是错误,其实很简单的.
贡山独龙族怒族自治县13018542577: 求用80c51单片机做一个简单的4位或6位密码锁的c程序,不需要很复杂,简单的就行 - ?
致庙丹莪: 有例子 自己设计个键盘电路 再用EEPROM存密码 每次开机核对一下 再转入程序
贡山独龙族怒族自治县13018542577: 求单片机电子密码锁的程序设计??? - ?
致庙丹莪: 这是我写的一个关于火灾报警的小程序的密码锁部分,我想这里面的大部分东西你都可以借鉴.你只要稍微做一些修改... 说明:我用得到的器件----凌阳单片机,lcd(128*64),256(e2prom)蜂鸣器,7279. 主要地方我给你家上了注释,如果还有...
贡山独龙族怒族自治县13018542577: 用单片机AT89C51 简易密码锁+流水灯设计 - ?
致庙丹莪: #include<reg51.h> #define uchar unsigned char #define uint unsigned int void delay(uint); void main(void) {uint i; uchar temp; uint jwhile(1){if(P3^0==0){if(P3&0X1E==0x04;){temp=0x01;for(i=0;i<4;i++){P1=~temp;delay();//自己写延...