关键字:ATS51,电子琴电路 1.实验任务
(1).由4X4组成16个按钮矩阵,设计成16个音。 (2).可随意弹奏想要表达的音乐。 2.电路原理图
3.系统板硬件连线
(1).把“单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”区域中的SPK IN端口上; (2).把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4 R1-R4端口上;
4.相关程序内容
(1).4X4行列式键盘识别; (2).音乐产生的方法;
一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。现在以单片机12MHz晶振为例,例出高中低音符与单片机计数T0相关的计数值如下表所示 音符 低1 DO #1 DO# 低2 RE #2 RE# 低 3 M 低 4 FA # 4 FA# 低 5 SO # 5 SO# 低 6 LA # 6 低 7 SI 中 1 DO # 1 DO# 中 2 RE # 2 RE# 中 3 M 中 4 FA
频率(HZ) 262 277 294 311 330 349 370 392 415 440 466 494 523 5 587 622 659 698
简谱码(T值) 63628 63731 63835 63928 021 103 185 260 331 400 463 524 580 633 684 732 777 820
音符 # 4 FA# 中 5 SO # 5 SO# 中 6 LA # 6 中 7 SI 高 1 DO # 1 DO# 高 2 RE # 2 RE# 高 3 M 高 4 FA # 4 FA# 高 5 SO # 5 SO# 高 6 LA # 6 高 7 SI
频率(HZ) 740 784 831 880 932 988 1046 1109 1175 1245 1318 1397 1480 1568 1661 1760 1865 1967
简谱码(T值) 860 8 934 968 994 65030 65058 65085 65110 65134 65157 65178 65198 65217 65235 65252 65268 65283
下面我们要为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应的数据 低音0-19之间,中音在20-39之间,高音在40-59之间
TABLE: DW 0,63628,63835,021,103,260,400,524,0,0 DW 0,63731,63928,0,185,331,463,0,0,0
DW 0,580,684,777,820,8,968,65030,0,0 DW 0,633,732,0,860,934,994,0,0,0
DW 0,65058,65110,65157,65178,65217,65252,65283,0,0 DW 0,65085,65134,0,65198,65235,65268,0,0,0 DW 0
2、音乐的音拍,一个节拍为单位(C调) 曲调值 调4/4 调3/4 调2/4
DELAY 125ms 187ms 250ms
曲调值 调4/4 调3/4 调2/4
DELAY 62ms 94ms 125ms
对于不同的曲调我们也可以用单片机的另外一个定时/计数器来完成。
下面就用ATS51单片机产生一首“生日快乐”歌曲来说明单片机如何产生的。
在这个程序中用到了两个定时/计数器来完成的。其中T0用来产生音符频率,T1用来产生音拍。 5.程序框图
6.汇编源程序 KEYBUF EQU 30H STH0 EQU 31H STL0 EQU 32H TEMP EQU 33H ORG 00H LJMP START ORG 0BH LJMP INT_T0
START: MOV TMOD,#01H SETB ET0 SETB EA WAIT:
MOV P3,#0FFH CLR P3.4 MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY1 LCALL DELY10MS MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY1 MOV A,P3 ANL A,#0FH CJNE A,#0EH,NK1 MOV KEYBUF,#0 LJMP DK1 NK1: CJNE A,#0DH,NK2 MOV KEYBUF,#1 LJMP DK1 NK2: CJNE A,#0BH,NK3 MOV KEYBUF,#2 LJMP DK1 1NK3: CJNE A,#07H,NK4 MOV KEYBUF,#3 LJMP DK1 NK4: NOP DK1:
MOV A,KEYBUF MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A MOV A,KEYBUF MOV B,#2 MUL AB MOV TEMP,A MOV DPTR,#TABLE1 MOVC A,@A+DPTR MOV STH0,A MOV TH0,A INC TEMP
MOV A,TEMP MOVC A,@A+DPTR MOV STL0,A MOV TL0,A SETB TR0 DK1A: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ DK1A CLR TR0 NOKEY1:
MOV P3,#0FFH CLR P3.5 MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY2 LCALL DELY10MS MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY2 MOV A,P3 ANL A,#0FH CJNE A,#0EH,NK5 MOV KEYBUF,#4 LJMP DK2 NK5: CJNE A,#0DH,NK6 MOV KEYBUF,#5 LJMP DK2 NK6: CJNE A,#0BH,NK7 MOV KEYBUF,#6 LJMP DK2 NK7: CJNE A,#07H,NK8 MOV KEYBUF,#7 LJMP DK2 NK8: NOP DK2:
MOV A,KEYBUF MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A MOV A,KEYBUF MOV B,#2
MUL AB MOV TEMP,A MOV DPTR,#TABLE1 MOVC A,@A+DPTR MOV STH0,A MOV TH0,A INC TEMP MOV A,TEMP MOVC A,@A+DPTR MOV STL0,A MOV TL0,A SETB TR0 DK2A: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ DK2A CLR TR0 NOKEY2:
MOV P3,#0FFH CLR P3.6 MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY3 LCALL DELY10MS MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY3 MOV A,P3 ANL A,#0FH CJNE A,#0EH,NK9 MOV KEYBUF,#8 LJMP DK3 NK9: CJNE A,#0DH,NK10 MOV KEYBUF,#9 LJMP DK3 NK10: CJNE A,#0BH,NK11 MOV KEYBUF,#10 LJMP DK3 NK11: CJNE A,#07H,NK12 MOV KEYBUF,#11 LJMP DK3 NK12: NOP
DK3:
MOV A,KEYBUF MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A MOV A,KEYBUF MOV B,#2 MUL AB MOV TEMP,A MOV DPTR,#TABLE1 MOVC A,@A+DPTR MOV STH0,A MOV TH0,A INC TEMP MOV A,TEMP MOVC A,@A+DPTR MOV STL0,A MOV TL0,A SETB TR0 DK3A: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ DK3A CLR TR0 NOKEY3:
MOV P3,#0FFH CLR P3.7 MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY4 LCALL DELY10MS MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY4 MOV A,P3 ANL A,#0FH CJNE A,#0EH,NK13 MOV KEYBUF,#12 LJMP DK4 NK13: CJNE A,#0DH,NK14 MOV KEYBUF,#13 LJMP DK4
NK14: CJNE A,#0BH,NK15 MOV KEYBUF,#14 LJMP DK4 NK15: CJNE A,#07H,NK16 MOV KEYBUF,#15 LJMP DK4 NK16: NOP DK4:
MOV A,KEYBUF MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A MOV A,KEYBUF MOV B,#2 MUL AB MOV TEMP,A MOV DPTR,#TABLE1 MOVC A,@A+DPTR MOV STH0,A MOV TH0,A INC TEMP MOV A,TEMP MOVC A,@A+DPTR MOV STL0,A MOV TL0,A SETB TR0 DK4A: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ DK4A CLR TR0 NOKEY4:
LJMP WAIT DELY10MS:
MOV R6,#10 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 RET INT_T0:
MOV TH0,STH0 MOV TL0,STL0 CPL P1.0 RETI
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H TABLE1: DW 021,103,260,400 DW 524,580,684,777 DW 820,8,968,65030 DW 65058,65110,65157,65178 END 7.C语言源程序 #include
unsigned char code table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; unsigned char temp; unsigned char key; unsigned char i,j; unsigned char STH0; unsigned char STL0;
unsigned int code tab[]={021,103,260,400, 524,580,684,777, 820,8,968,65030, 65058,65110,65157,65178}; void main(void) {
TMOD=0x01; ET0=1; EA=1; while(1) {
P3=0xff; P3_4=0; temp=P3;
temp=temp & 0x0f; if (temp!=0x0f) {
for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3;
temp=temp & 0x0f; if (temp!=0x0f) {
temp=P3;
temp=temp & 0x0f; switch(temp)
{
case 0x0e: key=0; break; case 0x0d: key=1; break; case 0x0b: key=2; break; case 0x07: key=3; break; } temp=P3; P1_0=~P1_0; P0=table[key]; STH0=tab[key]/256; STL0=tab[key]%6; TR0=1;
temp=temp & 0x0f; while(temp!=0x0f) {
temp=P3;
temp=temp & 0x0f; } TR0=0; } } P3=0xff; P3_5=0; temp=P3;
temp=temp & 0x0f; if (temp!=0x0f) {
for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3;
temp=temp & 0x0f; if (temp!=0x0f) {
temp=P3;
temp=temp & 0x0f; switch(temp)
{
case 0x0e: key=4; break; case 0x0d: key=5; break; case 0x0b: key=6; break; case 0x07: key=7; break; } temp=P3; P1_0=~P1_0; P0=table[key]; STH0=tab[key]/256; STL0=tab[key]%6; TR0=1;
temp=temp & 0x0f; while(temp!=0x0f) {
temp=P3;
temp=temp & 0x0f; } TR0=0; } } P3=0xff; P3_6=0; temp=P3;
temp=temp & 0x0f; if (temp!=0x0f) {
for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3;
temp=temp & 0x0f; if (temp!=0x0f) {
temp=P3;
temp=temp & 0x0f; switch(temp)
{
case 0x0e: key=8; break; case 0x0d: key=9; break; case 0x0b: key=10; break; case 0x07: key=11; break; } temp=P3; P1_0=~P1_0; P0=table[key]; STH0=tab[key]/256; STL0=tab[key]%6; TR0=1;
temp=temp & 0x0f; while(temp!=0x0f) {
temp=P3;
temp=temp & 0x0f; } TR0=0; } }
P3=0xff; P3_7=0; temp=P3;
temp=temp & 0x0f; if (temp!=0x0f) {
for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3;
temp=temp & 0x0f; if (temp!=0x0f) {
temp=P3;
temp=temp & 0x0f;
switch(temp) {
case 0x0e: key=12; break; case 0x0d: key=13; break; case 0x0b: key=14; break; case 0x07: key=15; break; } temp=P3; P1_0=~P1_0; P0=table[key]; STH0=tab[key]/256; STL0=tab[key]%6; TR0=1;
temp=temp & 0x0f; while(temp!=0x0f) {
temp=P3;
temp=temp & 0x0f; } TR0=0; } } } }
void t0(void) interrupt 1 using 0 {
TH0=STH0; TL0=STL0; P1_0=~P1_0; }
用PIC16F676制作声控彩灯,PIC16F676 LIGHT CONTROOLER
关键字:用PIC16F676制作声控彩灯 用PIC16F676制作声控彩灯 作者:崔月 一、电路原理
电路原理如附图所示。发光二极管L1l—L4显示声音的频率。当声频为低、中、高、特高时,分别点亮L1~L4。若无声。L1—L4均熄灭。
声音幅度显示在L5~L7上。3只发光管在无声时以15秒为周期循环点亮。即每只发光管依次点亮5秒。当有声时。循环点亮周期减少,声越大周期越短。
IC2为PICl6F676单片机。主时钟采用内部的自带4MHz振荡器。Ic2的⑩脚为计数输入。
把IC1l放大的声音信号经R4、V1送入该脚。在单位时间里,IC2计数越多,表示声频越高,反之,声频就低。同时,声音经Dl检波,C2、R3积分,在IC2的(12)脚得到的电压便可反映出声幅的大小。此电压经单片机内部A/D转换成数据处理后,去改变L5~L7的循环点亮周期。由于IC2的(12)脚只需要声音的上半周,所以,用于将驻极体话筒MIC的信号放大的运放IC1在电路设计时,只放大上半周声音信号。为了使IC1的⑦脚在无信号时,能有0.6V电压,以便给D1一个起始导通电压。所以加入了D2。这样,小信号时,IC2的(12)脚也能采集到信号电压。
二、编程思路
TMR1为计时器。TMR0在TMR1计时时,开始对IC2的⑩脚计数,所计值多少,反映出声频的高低。L5~L7依次点亮的时间用软件查询,查询次数又受控于A/D值的大小。为增强L5~L7点亮的动感。在程序中还插入一段程序。用于判别目前A/D值与前一次MD值的大小。若值大。则将下一个灯点亮。并让软件查询重新开始。 三、调试步骤
在确保IC2外围电路正常后。通电几十秒,保持外界无声音,将图中的“调试点”短路。让IC2复位
脚与GND短路一下。此时,L1~L4全部点亮;拆除“调试点”短路,重新上电,调试完成。以上调试过程,是让IC2记住在无信号时其(12)脚的电压值,并将此值存进内部的EEPROM中。以后IC2所测的A/D值都将减去该电压值后才去进行数据处理。 四、视听感受
L1~L4采用超高亮发光二极管。颜色分别为白、红、绿、蓝。L5~L7只为了调试时用。所以颜色可随便选择。RL1~RL3为彩灯串,将彩灯串摆成“T”字形。让音乐响起,超高亮发光二极管照在室内的白色墙面上,其颜色随音乐节奏而变,很有动感;3串彩灯随音乐相互追逐,很好看。如果亮度不够,可以增加几个。附图中采用4只三极管作射随。就是为增加发光二极管准备的。
ATC2051设计的无线防盗报警器,ATC2051 wireless burglar alarm
关键字:ATC2051,无线防盗报警电路
本站向网友介绍无线防盗报警系统中主机的制作,采用了ATC2051单片机作为处理芯片,使得该系统的功能扩展比较方便,对于整个系统如需改变某种设置,只要更改相应的软件即可。对学习单片机有很大的帮助。 一、硬件设计
电路原理图如下图所示,主要由无线接收、数据解码、数据处理、报警电路、输出显示、断电报警和电源电路组成。整机接收频率315M,数据解码采用市面上用得较多的PT2272专用解码芯片,可靠性及稳定性较好;数据处理的任务由单片机完成,用于区分报警信号,同时接受各种操作指令,完成相应的操作,当接收到报警信号后一方面驱动报警电路,发出响亮的警车报警声,另一方面输出具体的地址信息,确定是哪一路发送了报警信号;断电报警功能则实时监控电源状况,当市电断电后,能发出嘟嘟的报警声,提配使用者注意,外供电已被切断,若为不法分子破坏所致,可提早进行防范。
二、软件设计
该报警器的软件设计较为简单,有兴趣的网友可根据自己的实际需要进行相应功能的开发,这里把基本的程序列出来,供需要的网友参考。 ORG 0000H ; CLR P1.6 ; CLR P1.2 ; ACALL DYS ; SETB P1.6 ACALL YS ; SETB P1.2 ; CLR P1.3 ; CLR P1.6 ; ACALL DYS ; SETB P1.6 ; ACALL YS ; SETB P1.3 ; CLR P1.4 ; CLR P1.6 ; ACALL DYS ; SETB P1.6 ; ACALL YS ; SETB P1.4 ;
CLR P1.5 ; CLR P1.6 ; ACALL DYS ; SETB P1.6 ; ACALL YS ; ; MOV P1, #0FFH ; MOV P3, #0FFH ; AGARN: MOV R6, #34H ;
JB P3.6, TINDIAN ;检查是否停电
JNB P3.0, AGARN ;是否有有效无线信号输入 ACALL DYS ; JNB P3.0, AGARN ; MOV A, P3 ;读入无线信号值 ANL A, #3CH ;0011,1100
CJNE A,#20H, XH ;20H=00(10,00)00 B ;撤防程序 CLR P3.1 ;
CLR P1.6 ;撤防成功响应 CLR P1.4 ;指示灯 CLR P1.5 ; SETB P3.7 ; ACALL YS ; SETB P1.6 ; AJMP AGARN ;
XH: CJNE A,#30H, ONE ;判断是否为布防信号 SETB P3.1 ;
CLR P1.6 ;布防成功响应 SETB P1.4 ;指示灯 SETB P1.5 ; SETB P3.7 ; ACALL YS ; SETB P1.6 ; AJMP AGARN ;
ONE: JNB P3.1, AGARN ;
CJNE A,#4H, TWO ;1H=00(00,01)00B MOV P1, #0FBH ; AJMP BJ ;
TWO: CJNE A,#8H, THREE ;2H= 00(00,10)00B MOV P1, #0F7H ; AJMP BJ ;
THREE: CJNE A,#0CH, FOUR ;3H=00(00,11)00B MOV P1, #0EFH ; AJMP BJ ;
FOUR: CJNE A,#10H, FIVE ;00(01,00)00B
MOV P1, #0DFH ; AJMP BJ ; FIVE: NOP ; NOP ; NOP ; AJMP AGARN ;
BJ: CLR P3.7 ;启动报警信号 ACALL YS ;延时34秒 JB P3.0, AGARN ; DJNZ R6, BJ ;
SETB P3.7 ;关闭报警信号 AJMP AGARN ;
TINDIAN: MOV P1, #0FFH ;停电程序 CLR P1.6 ; CLR P1.5 ; ACALL YS ; SETB P1.6 ; SETB P1.5 ; ACALL YS ; CLR P1.6 ; CLR P1.5 ; ACALL YS ; SETB P1.6 ; SETB P1.5 ; ACALL YS ; AJMP AGARN ; DYS: MOV R0, #14H ; L1: MOV R1, #0F1H ; L2: NOP ; NOP ; NOP ; DJNZ R1, L2 ; DJNZ R0, L1 ; RET
YS: MOV R0, 0FFH ; L3: MOV R1, 0F1H ; L4: NOP ; NOP ; NOP ; DJNZ R1, L4 ; DJNZ R0, L3 ; RET ; END ;
这款无线报警主机对任何发射频率为315M,编码采用PT2262的无线探头都可适用,如无线人体探测
器,无线门磁传感器、无线微波探测器等,由于实际使用的环境不同,所需主机与之相配套的设置也不同,网友可以根据自己的发辉,通过编写不同的软件,从而实现不同的功能,这里不再详述。
LED——飘在空中的文字,Flying text
关键字:旋转LED——飘在空中的文字 旋转LED——飘在空中的文字 一.效果:
二.整体结构:
三.制作方法: 1.电机的改装
电路的供电和LED 的定位是本制作的一个难点。装在电机上的电路始终在高速旋转,我们就无法使用通常的方法来给电路供电。但我们可以通过对电机的改造来解决。我们都知道,一般的直流电机是线圈作为转子,而永磁体作为定子的。他是通过电刷来实现给线圈供电的,而且直流电机的旋转需要交变的电流,这是由固定在转子轴上的换向器来巧妙的实现直流变为交流的。我们的电路是固定在电机的转子上的,它和转子是保持相对静止的。因此,我们可以从电机的转子中取得电源。方法很简单,也就是从电机的换向器上用漆包线把电引到电路板上,经整流,滤波后给单片机电路供电。换向器上的每个电极什么时候变化,是和电机转子的位子有关的,我们正好可以使用其中的一路信号来给LED 显示的起始位置定位。 具体改装过程如下:
1)拆开电机(我使用的是录音机上的12V直流电机),注意拆的时候别弄坏了电机的电刷!
2)小心地从电机换向器上的三个电极引出三条漆包线 (由于我改装到这步时忘了拍照了,此图略) 3)取下电机外壳的含油轴承
4)我用原来装在电机上的皮带轮试了一下,正好可以放进拆掉含油轴承的地方,而且可以和外壳之间灵活旋转(运气不错!大家也可以试试别的)。于是我在这个上面钻了几个小孔,把那三条漆包线从小孔里穿出来。从而可以用来保护漆包线在转子和定子结合出的安全。(注意:替代上去的部分是和转子保持固定,和外壳之间是可以旋转的)。
5)组装回整个电机,电机改装至此结束
2.电路
电路结构的安排见上面整体结构图,需要注意的是要安排好电机轴两边的电路重量尽量相近。 3.程序
程序很简单,我这里给出一个C51 的示例程序,大家可以按自己的需要来改,做成旋转时钟等什么的。 /******************************************************************* 名称:旋转LED 作者:章健 日期:2006.1.5
*******************************************************************/ #include
#define uchar unsigned char void delay();
uchar zimo[16]={0xff,0x7d,0x00,0x7d,0xff, //字母“I” 0xc7,0x83,0xc1,0x83,0xc7, //心形图案 0xff, //用来搁开心形图案和字母U 0x03,0xfd,0xfd,0xfd,0x03}; //字母“U” //0xc9,0xb6,0xb6,0xb6,0xc9}; void main()
{TCON|=0x01; //外部中断0 下降沿触发 IE=0x81; //开中断 while(1); }
void delay() //延时子程序,延时长短请根据的你的电机转速进行调整 {uchar j;
for(j=0;j<255;j++) {;} }
void display() interrupt 0 //中断处理
{uchar i;
for(i=0;i<16;i++) {P1=zimo[i]; delay();} P1=0xff; }
经济、安全的电子密码锁,Password Lock
关键字:经济、安全的电子密码锁制作
一种能防止多次试探密码的基于单片机的密码锁设计方案,根据用户的10条总体要求,给出了该单片机密码锁的硬件电路和软件程序,同时给出了单片机型号的选择、硬件设计、软件流程图、单片机存储单元的分配、汇编语言源程序及详细注释等内容。很多行业的许多地方都需要密码锁,但普通密码锁的密码容易被多次试探而破译。本文给出了一种能防止多次试探密码的密码锁设计方法,从而有效地克服了上述缺点。
硬件电路
图1所示是笔者设计的一种密码锁电路。该密码锁主要 是以下10条特点: (1)总共可以设置8位密码,每位的取值范围为1~8。 (2)用户可以自行设定和修改密码。 (3)按每个密码键时都有声音提示。
(4)若键入的8位开锁密码不完全正确,则报警5秒钟,以提醒他人注意。
(5)开锁密码连续错3次要报警1分钟,报警期间输入密码无效,以防窃贼多次试探密码。 (6)键入的8位开锁密码完全正确才能开锁,开锁时要有1秒的提示音。 (7)电磁锁的电磁线圈每次通电5秒,然后恢复初态。
(8)密码键盘上只允许有8个密码按键。锁内有备用电池,只有内部上电复位时才能设置或修改密码,因此,仅在门外按键是不能修改或设置密码的。 (9)密码设定完毕后要有2秒的提示音。
(10)成本低,硬件和软件都很简洁可靠,易于批量生产。
根据总体要求分析,该密码锁电路所需要的I/O口线少于15个,若设计得当,程序不会超过200条指令,所以可选择质优价廉的AT89C1051/2051或者GMS1051/2051,而且不需要外接程序存储器和数据存储器及其它扩展部件,所以成本很经济。
图1 电磁锁原理图
在图1所示电路中,P1口连接8个密码按键AN1~AN8,开锁 信号由P3.2输出,报警和提示音由P3.7输出。BL是用于报警与声音提示的喇叭,K是继电器控制电磁线圈。
软件设计
图2给出了该单片机密码锁电路的软件流程图。图中AA1~AA8以及START、SET、SAVE是程序中的标号,是为了理解程序而专门标在流程图的对应位置的,分析程序时可以仔细对照参考。 3.1 存储单元的分配
该密码锁中RAM存储单元的分配方案如下:
31H~38H:依次存放8位设定的密码,首位密码存放在31H单元; R0:指向密码地址; R2:已经键入密码的位数;
R3:存放允许的错码次数3与实际错码次数的差值; R4至R7:延时用; 00H:错码标志位。
对于ROM存储单元的分配,由于程序比较短,而且占用的存储空间比较少,因此,在无特殊要求时,可以从0030H单元(其它地址也可以)开始存放主程序。
图2 电磁锁程序流程图
源程序
下面是该电子密码锁的软件源程序代码: ORG 0000H
AJMP START ORG 0030H
START:ACALL BP MOV R0,#31H MOV R2,#8
SET: MOV P1,#0FFH MOV A,P1
CJNE A,#0FFH,L8 AJMP SET
L8: ACALL DELAY CJNE A,#0FFH,SAVE AJMP SET
SAVE: ACALL BP MOV @R0A INC R0
DJNZ R2,SET MOV R5,#16 D2S: ACALL BP DJNZ R5,D2S MOV R0,#31H MOV R3,#3
AA1: MOV R2,#8 AA2: MOV P1,#0FFH MOV A,P1
CJNE A,#0FFH, L9 AJMP AA2
L9 ACALL DELAY CJNE A,#0FFH,AA3 AJMP AA2
AA3: ACALL BP CLR C
SUBB A, @R0 INC R0
CJNE A,#00H,AA4 AJMP AA5
AA4: SETB 00H AA5: DJNZ R2,AA2 JB 00HAA6 CLR P3.5
L3 MOV R5,#8 ACALL BP DJNZ R4,L3 MOV R3,#3 SETB P3.5 AJMP AA1
AA6: DJNZ R3,AA7 MOV R5,#24
L5: MOV R4,#200
L4: ACALL BP DJNZ R4,L4 DJNZ R5,L5 MOV R3,#3
AA7: MOV R5,#40 ACALL BP DJNZ R5,AA7 AA8: CLR 00H AJMP AA1 BP: CLR P3.7 MOV R7,#250 L2: MOV R6,#124 L1: DJNZ R6,L1 CPL P3.7 DJNZ R7,L2 SETB P3.7 RET
DELAYMOV R7,#20 L7: MOV R6,#125 L6: DJNZ R6,L6 DJNZ R7,L7 RET END 应用说明
若按键AN1~AN7分别代表数码1~7,按键AN0代表数码8。在没有键按下时,P1.0~P1.7全是高电平1,若某个键被按下,相应的口线就变为低电平0。假如设定的密码是61234578,当按键AN6被按下时,P1.6变为低电平,P1端口其余口线为高电平,此时从P1端口读入的数值为10111111,存到31H单元的密码值就是10111111,也就是BFH。依此类推,存到32H至38H单元的密码值分别是FDH、FBH、F7H、EFH、DFH、7FH、FEH。开锁时必须先按AN6,使从P1口读入的第一个密码值与31H单元存储的设定值相同,再顺序按AN1、AN2、AN3、AN4、AN5、AN7、AN0才能开锁。否则不能开锁,同时开始报
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- ryyc.cn 版权所有 湘ICP备2023022495号-3
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务