【精品】动态数码显示技术91
13( 动态数码显示技术
1( 实验任务
如图4.13.1所示,P0端口接动态数码管的字形码笔段,P2端口接动态数码
管的数位选择端,P1.7接一个开关,当开关接高电平时,显示“12345”字
样;当开关接低电平时,显示“HELLO”字样。
2( 电路原理图
图4.13.1
3( 系统板上硬件连线
(1( 把“单片机系统”区域中的P0.0/AD0,P0.7/AD7用8芯排线连接到“动
态数码显示”区域中的a,h端口上;
(2( 把“单片机系统”区域中的P2.0/A8,P2.7/A15用8芯排线连接到“动态
数码显示”区域中的S1,S8端口上;
(3( 把“单片机系统”区域中的P1.7端口用导线连接到“独立式键盘”区域
中的SP1端口上;
4( 程序
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
(1( 动态扫描方法
动态接口采用各数码管循环轮流显示的方法,当循环显示频率较高时,利用人眼的暂留特性,看不出闪烁显示现象,这种显示需要一个接口完成字形码的输出(字形选择),另一接口完成各数码管的轮流点亮(数位选择)。 (2( 在进行数码显示的时候,要对显示单元开辟8个显示缓冲区,每个显示缓
冲区装有显示的不同数据即可。
(3( 对于显示的字形码数据我们采用查
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
方法来完成。
5( 程序框图
图4.13.2
6( 汇编源程序
ORG 00H
START: JB P1.7,DIR1 MOV DPTR,#TABLE1 SJMP DIR
DIR1: MOV DPTR,#TABLE2 DIR: MOV R0,#00H MOV R1,#01H
NEXT: MOV A,R0
MOVC A,@A+DPTR
MOV P0,A
MOV A,R1
MOV P2,A
LCALL DAY
INC R0
RL A
MOV R1,A
CJNE R1,#0DFH,NEXT SJMP START
DAY: MOV R6,#4
D1: MOV R7,#248 DJNZ R7,$
DJNZ R6,D1
RET
TABLE1: DB 06H,5BH,4FH,66H,6DH
TABLE2: DB 78H,79H,38H,38H,3FH
END
7( C语言源程序
#include
unsigned char code table1[]={0x06,0x5b,0x4f,0x66,0x6d};
unsigned char code table2[]={0x78,0x79,0x38,0x38,0x3f};
unsigned char i; unsigned char a,b; unsigned char temp;
void main(void)
{
while(1)
{
temp=0xfe;
for(i=0;i<5;i++) {
if(P1_7==1)
{
P0=table1[i]; }
else
{
P0=table2[i]; }
P2=temp;
a=temp<<(i+1); b=temp>>(7-i); temp=a|b;
for(a=4;a>0;a--)
for(b=248;b>0;b--);
}
}
}
14( 4×4矩阵式键盘识别技术
1( 实验任务
如图4.14.2所示,用AT89S51的并行口P1接4×4矩阵键盘,以P1.0,P1.3
作输入线,以P1.4,P1.7作输出线;在数码管上显示每个按键的“0,F”序
号。对应的按键的序号排列如图4.14.1所示
图4.14.1
2( 硬件电路原理图
图4.14.2
3( 系统板上硬件连线
(1( 把“单片机系统“区域中的P3.0,P3.7端口用8芯排线连接到“4X4行
列式键盘”区域中的C1,C4 R1,R4端口上;
(2( 把“单片机系统”区域中的P0.0/AD0,P0.7/AD7端口用8芯排线连接到
“四路静态数码显示模块”区域中的任一个a,h端口上;
要求
对教师党员的评价套管和固井爆破片与爆破装置仓库管理基本要求三甲医院都需要复审吗
:P0.0/AD0
对应着a,P0.1/AD1对应着b,„„,P0.7/AD7对应着h。 4( 程序设计内容
(1( 4×4矩阵键盘识别处理
(2( 每个按键有它的行值和列值 ,行值和列值的组合就是识别这个按键
的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。每个按
键的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过
电阻接VCC,而接地是通过程序输出数字“0”实现的。键盘处理程序
的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;
还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描
码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值
和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的
功能。
5( 程序框图
图4.14.3
6( 汇编源程序
KEYBUF EQU 30H ORG 00H
START: MOV KEYBUF,#2
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
NK3: 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
DK1A: MOV A,P3 ANL A,#0FH
XRL A,#0FH
JNZ DK1A
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
DK2A: MOV A,P3 ANL A,#0FH
XRL A,#0FH
JNZ DK2A
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
DK3A: MOV A,P3 ANL A,#0FH
XRL A,#0FH
JNZ DK3A
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
DK4A: MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ DK4A
NOKEY4:
LJMP WAIT
DELY10MS:
MOV R6,#10
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
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;
void main(void)
{
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=7;
break;
case 0x0d:
key=8;
break;
case 0x0b:
key=9;
break;
case 0x07:
key=10;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key]; temp=temp & 0x0f; while(temp!=0x0f) {
temp=P3;
temp=temp & 0x0f; }
}
}
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=11;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key]; temp=temp & 0x0f; while(temp!=0x0f) {
temp=P3;
temp=temp & 0x0f; }
}
}
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=1;
break;
case 0x0d:
key=2;
break;
case 0x0b:
key=3;
break;
case 0x07:
key=12;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key]; temp=temp & 0x0f; while(temp!=0x0f) {
temp=P3;
temp=temp & 0x0f; }
}
}
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=0;
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]; temp=temp & 0x0f; while(temp!=0x0f) {
temp=P3;
temp=temp & 0x0f; }
}
}
}
}
15( 定时计数器T0作定时应用技术(一) 1( 实验任务
用AT89S51单片机的定时/计数器T0产生一秒的定时时间,作为秒计数时间,当一秒产生时,秒计数加1,秒计数到60时,自动从0开始。硬件电路如下图所示
2( 电路原理图
图4.15.1
3( 系统板上硬件连线
(1( 把“单片机系统”区域中的P0.0/AD0,P0.7/AD7端口用8芯排线连接到
“四路静态数码显示模块”区域中的任一个a,h端口上;要求:P0.0/AD0
对应着a,P0.1/AD1对应着b,„„,P0.7/AD7对应着h。 (2( 把“单片机系统”区域中的P2.0/A8,P2.7/A15端口用8芯排线连接到
“四路静态数码显示模块”区域中的任一个a,h端口上;要求:P2.0/A8
对应着a,P2.1/A9对应着b,„„,P2.7/A15对应着h。 4( 程序设计内容
AT89S51单片机的内部16位定时/计数器是一个可编程定时/计数器,它既可以工作在13位定时方式,也可以工作在16位定时方式和8位定时方式。只要通过设置特殊功能寄存器TMOD,即可完成。定时/计数器何时工作也是通过软件来设定TCON特殊功能寄存器来完成的。
现在我们选择16位定时工作方式,对于T0来说,最大定时也只有65536us,即65.536ms,无法达到我们所需要的1秒的定时,因此,我们必须通过软件来处理这个问题,假设我们取T0的最大定时为50ms,即要定时1秒需要经过20次的50ms的定时。对于这20次我们就可以采用软件的方法来统计了。
因此,我们设定TMOD,00000001B,即TMOD,01H
下面我们要给T0定时/计数器的TH0,TL0装入预置初值,通过下面的公式可以计算出
TH0,(216,50000) / 256
TL0,(216,50000) MOD 256
当T0在工作的时候,我们如何得知50ms的定时时间已到,这回我们通过
检测
工程第三方检测合同工程防雷检测合同植筋拉拔检测方案传感器技术课后答案检测机构通用要求培训
TCON特殊功能寄存器中的TF0标志位,如果TF0,1表示定时时间已到。 5( 程序框图
图4.15.2
6( 汇编源程序(查询法)
SECOND EQU 30H
TCOUNT EQU 31H
ORG 00H
START: MOV SECOND,#00H MOV TCOUNT,#00H
MOV TMOD,#01H
MOV TH0,#(65536-50000) / 256
MOV TL0,#(65536-50000) MOD 256
SETB TR0
DISP: MOV A,SECOND MOV B,#10
DIV AB
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
MOV A,B
MOVC A,@A+DPTR
MOV P2,A
WAIT: JNB TF0,WAIT CLR TF0
MOV TH0,#(65536-50000) / 256
-50000) MOD 256 MOV TL0,#(65536
INC TCOUNT
MOV A,TCOUNT
CJNE A,#20,NEXT
MOV TCOUNT,#00H
INC SECOND
MOV A,SECOND
CJNE A,#60,NEX
MOV SECOND,#00H
NEX: LJMP DISP
NEXT: LJMP WAIT
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
7( C语言源程序(查询法)
#include
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x00}; unsigned char second; unsigned char tcount;
void main(void)
{
TMOD=0x01;
TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=1;
tcount=0;
second=0;
P0=dispcode[second/10]; P2=dispcode[second%10]; while(1)
{
if(TF0==1)
{
tcount++;
if(tcount==20)
{
tcount=0;
second++;
if(second==60)
{
second=0;
}
P0=dispcode[second/10]; P2=dispcode[second%10]; }
TF0=0;
TH0=(65536-50000)/256; TL0=(65536-50000)%256; }
}
}
1( 汇编源程序(中断法)
SECOND EQU 30H
TCOUNT EQU 31H
ORG 00H
LJMP START
ORG 0BH
LJMP INT0X
START: MOV SECOND,#00H MOV A,SECOND
MOV B,#10
DIV AB
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
MOV A,B
MOVC A,@A+DPTR
MOV P2,A
MOV TCOUNT,#00H
MOV TMOD,#01H
MOV TH0,#(65536-50000) / 256
MOV TL0,#(65536-50000) MOD 256
SETB TR0
SETB ET0
SETB EA
SJMP $
INT0X:
MOV TH0,#(65536-50000) / 256
MOV TL0,#(65536-50000) MOD 256
INC TCOUNT
MOV A,TCOUNT
CJNE A,#20,NEXT
MOV TCOUNT,#00H
INC SECOND
MOV A,SECOND
CJNE A,#60,NEX
MOV SECOND,#00H
NEX: MOV A,SECOND MOV B,#10
DIV AB
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
MOV A,B
MOVC A,@A+DPTR
MOV P2,A
NEXT: RETI
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
2( C语言源程序(中断法)
#include
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x00}; unsigned char second; unsigned char tcount;
void main(void)
{
TMOD=0x01;
TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=1;
ET0=1;
EA=1;
tcount=0;
second=0;
P0=dispcode[second/10]; P2=dispcode[second%10]; while(1);
}
void t0(void) interrupt 1 using 0
{
tcount++;
if(tcount==20)
{
tcount=0;
second++;
if(second==60)
{
second=0;
}
P0=dispcode[second/10]; P2=dispcode[second%10]; }
TH0=(65536-50000)/256; TL0=(65536-50000)%256; }
16( 定时计数器T0作定时应用技术(二) 1( 实验任务
用AT89S51的定时/计数器T0产生2秒钟的定时,每当2秒定时到来时,更换指示灯闪烁,每个指示闪烁的频率为0.2秒,也就是说,开始L1指示灯以0.2秒的速率闪烁,当2秒定时到来之后,L2开始以0.2秒的速率闪烁,如此循环下去。0.2秒的闪烁速率也由定时/计数器T0来完成。
2( 电路原理图
图4.16.1
3( 系统板硬件连线
(1( 把“单片机系统”区域中的P1.0,P1.3用导线连接到“八路发光二极管
指示模块”区域中的L1,L4上
4( 程序设计内容
(1( 由于采用中断方式来完成,因此,对于中断源必须它的中断入口地址,
对于定时/计数器T0来说,中断入口地址为000BH,因此在中断入口
地方加入长跳转指令来执行中断服务程序。书写汇编源程序格式如下
所示:
ORG 00H
LJMP START
ORG 0BH ;定时/计数器T0中断入口地址
LJMP INT_T0
START: NOP ;主程序开始
.
.
INT_T0: PUSH ACC ;定时/计数器T0中断服务程序
PUSH PSW
.
.
POP PSW
POP ACC
RETI ;中断服务程序返回
END
(2( 定时2秒,采用16位定时50ms,共定时40次才可达到2秒,每50ms
产生一中断,定时的40次数在中断服务程序中完成,同样0.2秒的
定时,需要4次才可达到0.2秒。对于中断程序,在主程序中要对中
断开中断。
(3( 由于每次2秒定时到时,L1,L4要交替闪烁。采用ID来号来识别。
当ID,0时,L1在闪烁,当ID,1时,L2在闪烁;当ID,2时,L3
在闪烁;当ID,3时,L4在闪烁
5( 程序框图
T0中断服务程序框图
主程序框图
图4.16.2
6( 汇编源程序
6( 汇编源程序
TCOUNT2S EQU 30H TCNT02S EQU 31H ID EQU 32H
ORG 00H
LJMP START
ORG 0BH
LJMP INT_T0
START: MOV TCOUNT2S,#00H MOV TCNT02S,#00H
MOV ID,#00H
MOV TMOD,#01H
MOV TH0,#(65536-50000) / 256
-50000) MOD 256 MOV TL0,#(65536
SETB TR0
SETB ET0
SETB EA
SJMP $
INT_T0: MOV TH0,#(65536-50000) / 256
MOV TL0,#(65536-50000) MOD 256
INC TCOUNT2S
MOV A,TCOUNT2S
CJNE A,#40,NEXT
MOV TCOUNT2S,#00H
INC ID
MOV A,ID
CJNE A,#04H,NEXT
MOV ID,#00H
NEXT: INC TCNT02S
MOV A,TCNT02S
CJNE A,#4,DONE
MOV TCNT02S,#00H
MOV A,ID
CJNE A,#00H,SID1
CPL P1.0
SJMP DONE
SID1: CJNE A,#01H,SID2 CPL P1.1
SJMP DONE
SID2: CJNE A,#02H,SID3 CPL P1.2
SJMP DONE
SID3: CJNE A,#03H,SID4 CPL P1.3
SID4: SJMP DONE
DONE: RETI
END
7( C语言源程序
#include
unsigned char tcount2s;
unsigned char tcount02s;
unsigned char ID;
void main(void) {
TMOD=0x01;
TH0=(65536-50000)/256;
-50000)%256; TL0=(65536
TR0=1;
ET0=1;
EA=1;
while(1);
}
void t0(void) interrupt 1 using 0
{
tcount2s++; if(tcount2s==40) {
tcount2s=0; ID++;
if(ID==4)
{
ID=0;
}
}
tcount02s++; if(tcount02s==4) {
tcount02s=0; switch(ID)
{
case 0:
P1_0=~P1_0; break;
case 1:
P1_1=~P1_1; break;
case 2:
P1_2=~P1_2; break;
case 3:
P1_3=~P1_3;
break; }
}
}
17( 99秒马表设计
1( 实验任务
(1( 开始时,显示“00”,第1次按下SP1后就开始计时。 (2( 第2次按SP1后,计时停止。
(3( 第3次按SP1后,计时归零。
2( 电路原理图
图4.17.1
3( 系统板上硬件连线
(1( 把“单片机系统”区域中的P0.0/AD0,P0.7/AD7端口用8芯排线连接到
“四路静态数码显示模块”区域中的任一个a,h端口上;要求:P0.0/AD0
对应着a,P0.1/AD1对应着b,„„,P0.7/AD7对应着h。 (2( 把“单片机系统”区域中的P2.0/A8,P2.7/A15端口用8芯排线连接到
“四路静态数码显示模块”区域中的任一个a,h端口上;要求:P2.0/A8
对应着a,P2.1/A9对应着b,„„,P2.7/A15对应着h。
(3( 把“单片机系统“区域中的P3.5/T1用导线连接到”独立式键盘“区域中
的SP1端口上;
4( 程序框图
主程序框图
T0中断服务程序框图
图4.17.2
5( 汇编源程序
TCNTA EQU 30H TCNTB EQU 31H SEC EQU 32H KEYCNT EQU 33H SP1 BIT P3.5 ORG 00H
LJMP START
ORG 0BH
LJMP INT_T0 START: MOV KEYCNT,#00H
MOV SEC,#00H MOV A,SEC
MOV B,#10
DIV AB
MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A
MOV A,B
MOV DPTR,#TABLE
MOVC A,@A+DPTR MOV P2,A
MOV TMOD,#02H SETB ET0
SETB EA
WT: JB SP1,WT LCALL DELY10MS JB SP1,WT
INC KEYCNT
MOV A,KEYCNT CJNE A,#01H,KN1 SETB TR0
MOV TH0,#06H MOV TL0,#06H MOV TCNTA,#00H MOV TCNTB,#00H LJMP DKN
KN1: CJNE A,#02H,KN2
CLR TR0
LJMP DKN
KN2: CJNE A,#03H,DKN
MOV SEC,#00H MOV A,SEC
MOV B,#10
DIV AB
MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A
MOV A,B
MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P2,A
MOV KEYCNT,#00H DKN: JNB SP1,$ LJMP WT
DELY10MS:
MOV R6,#20
D1: MOV R7,#248 DJNZ R7,$
DJNZ R6,D1
RET
INT_T0:
INC TCNTA
MOV A,TCNTA
CJNE A,#100,NEXT
MOV TCNTA,#00H
INC TCNTB
MOV A,TCNTB
CJNE A,#4,NEXT
MOV TCNTB,#00H
INC SEC
MOV A,SEC
CJNE A,#100,DONE
MOV SEC,#00H
DONE: MOV A,SEC
MOV B,#10
DIV AB
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
MOV A,B
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P2,A
NEXT: RETI
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
6( C语言源程序
#include
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x00};
unsigned char second; unsigned char keycnt; unsigned int tcnt;
void main(void)
{
unsigned char i,j;
TMOD=0x02;
ET0=1;
EA=1;
second=0;
P0=dispcode[second/10]; P2=dispcode[second%10];
while(1)
{
if(P3_5==0)
{
for(i=20;i>0;i--)for(j=248;j>0;j--);
if(P3_5==0)
{
keycnt++;
switch(keycnt) {
case 1:
TH0=0x06;
TL0=0x06;
TR0=1;
break;
case 2:
TR0=0;
break;
case 3:
keycnt=0;
second=0;
P0=dispcode[second/10];
P2=dispcode[second%10];
break;
}
while(P3_5==0); }
}
}
}
void t0(void) interrupt 1 using 0
{
tcnt++;
if(tcnt==400) {
tcnt=0;
second++;
if(second==100) {
second=0;
}
P0=dispcode[second/10];
P2=dispcode[second%10];
}
}
18( “嘀、嘀、„„”报警声
1( 实验任务
用AT89S51单片机产生“嘀、嘀、„”报警声从P1.0端口输出,产生频率为1KHz,根据上面图可知:1KHZ方波从P1.0输出0.2秒,接着0.2秒从P1.0输出电平信号,如此循环下去,就形成我们所需的报警声了。
2( 电路原理图
图4.18.1
3( 系统板硬件连线
(1( 把“单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”区
域中的SPK IN端口上,
(2( 在“音频放大模块”区域中的SPK OUT端口上接上一个8欧或者是16欧
的喇叭;
4( 程序设计方法
(1(生活中我们常常到各种各样的报警声,例如“嘀、嘀、„”就是常见的一种声音报警声,但对于这种报警声,嘀0.2秒钟,然后断0.2秒钟,如此循环下去,假设嘀声的频率为1KHz,则报警声时序图如下图所示:
上述波形信号如何用单片机来产生呢,
( 由于要产生上面的信号,我们把上面的信号分成两部分,一部分为1KHZ(2
方波,占用时间为0.2秒;另一部分为电平,也是占用0.2秒;因此,我
们利用单片机的定时/计数器T0作为定时,可以定时0.2秒;同时,也要
,高电平占用单片机产生1KHZ的方波,对于1KHZ的方波信号周期为1ms
用0.5ms,低电平占用0.5ms,因此也采用定时器T0来完成0.5ms的定时;
计数器T0的定时时间为0.5ms,而要定时0.2秒则最后,可以选定定时/
是0.5ms的400倍,也就是说以0.5ms定时400次就达到0.2秒的定时时
间了。
5( 程序框图
主程序框图
中断服务程序框图
图4.18.2
6( 汇编源程序
T02SA EQU 30H
T02SB EQU 31H
FLAG BIT 00H
ORG 00H
LJMP START
ORG 0BH
LJMP INT_T0
START: MOV T02SA,#00H MOV T02SB,#00H
CLR FLAG
MOV TMOD,#01H
MOV TH0,#(65536-500) / 256 MOV TL0,#(65536-500) MOD 256 SETB TR0
SETB ET0
SETB EA
SJMP $
INT_T0:
MOV TH0,#(65536-500) / 256 MOV TL0,#(65536-500) MOD 256 INC T02SA
MOV A,T02SA
CJNE A,#100,NEXT INC T02SB
MOV A,T02SB
CJNE A,#04H,NEXT MOV T02SA,#00H
MOV T02SB,#00H
CPL FLAG
NEXT: JB FLAG,DONE CPL P1.0
DONE: RETI
END
7( C语言源程序
#include unsigned int t02s; unsigned char t05ms; bit flag;
void main(void)
{
TMOD=0x01;
TH0=(65536-500)/256; TL0=(65536-500)%256; TR0=1;
ET0=1;
EA=1;
while(1);
}
void t0(void) interrupt 1 using 0
{
TH0=(65536-500)/256; TL0=(65536-500)%256; t02s++;
if(t02s==400)
{
t02s=0;
flag=~flag;
}
if(flag==0)
{
P1_0=~P1_0;
}
}
19( “叮咚”门铃
1( 实验任务
当按下开关SP1,AT89S51单片机产生“叮咚”声从P1.0端口输出到LM386,经过放大之后送入喇叭。
2( 电路原理图
图4.19.1
3( 系统板上硬件连线
(1( 把“单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”区
域中的SPK IN端口上;
(2( 在“音频放大模块”区域中的SPK OUT端口上接上一个8欧或者是16欧
的喇叭;
(3( 把“单片机系统”区域中的P3.7/RD端口用导线连接到“独立式键盘”区
域中的SP1端口上;
4( 程序设计方法
(1( 我们用单片机实定时/计数器T0来产生700HZ和500HZ的频率,根据定时
/计数器T0,我们取定时250us,因此,700HZ的频率要经过3次250us
的定时,而500HZ的频率要经过4次250us的定时。
(2( 在设计过程,只有当按下SP1之后,才启动T0开始工作,当T0工作完毕,
回到最初状态。
(3( “叮”和“咚”声音各占用0.5秒,因此定时/计数器T0要完成0.5秒的
定时,对于以250us为基准定时2000次才可以。
5( 程序框图
主程序框图
T0中断服务程序框图
图4.19.2
6( 汇编源程序
T5HZ EQU 30H T7HZ EQU 31H T05SA EQU 32H T05SB EQU 33H FLAG BIT 00H STOP BIT 01H SP1 BIT P3.7 ORG 00H
LJMP START
ORG 0BH
LJMP INT_T0 START: MOV TMOD,#02H
MOV TH0,#06H MOV TL0,#06H SETB ET0
SETB EA
NSP: JB SP1,NSP
LCALL DELY10MS JB SP1,NSP
SETB TR0
MOV T5HZ,#00H MOV T7HZ,#00H MOV T05SA,#00H MOV T05SB,#00H CLR FLAG
CLR STOP
JNB STOP,$
LJMP NSP
DELY10MS: MOV R6,#20
D1: MOV R7,#248 DJNZ R7,$
DJNZ R6,D1
RET
INT_T0: INC T05SA MOV A,T05SA
CJNE A,#100,NEXT MOV T05SA,#00H INC T05SB
MOV A,T05SB
CJNE A,#20,NEXT MOV T05SB,#00H JB FLAG,STP
CPL FLAG
LJMP NEXT
STP: SETB STOP CLR TR0
LJMP DONE
NEXT: JB FLAG,S5HZ INC T7HZ
MOV A,T7HZ
CJNE A,#03H,DONE MOV T7HZ,#00H CPL P1.0
LJMP DONE
S5HZ: INC T5HZ MOV A,T5HZ
CJNE A,#04H,DONE MOV T5HZ,#00H CPL P1.0
LJMP DONE
DONE: RETI
END
7( C语言源程序
#include unsigned char t5hz; unsigned char t7hz; unsigned int tcnt;
bit stop;
bit flag;
void main(void) {
unsigned char i,j;
TMOD=0x02;
TH0=0x06;
TL0=0x06;
ET0=1;
EA=1;
while(1)
{
if(P3_7==0)
{
for(i=10;i>0;i--) for(j=248;j>0;j--); if(P3_7==0)
{
t5hz=0;
t7hz=0;
tcnt=0;
flag=0;
stop=0;
TR0=1;
while(stop==0); }
}
}
}
void t0(void) interrupt 1 using 0
{
tcnt++;
if(tcnt==2000)
{
tcnt=0;
if(flag==0) {
flag=~flag; }
else
{
stop=1;
TR0=0;
}
}
if(flag==0) {
t7hz++;
if(t7hz==3) {
t7hz=0;
P1_0=~P1_0; }
}
else
{
t5hz++;
if(t5hz==4) {
t5hz=0;
P1_0=~P1_0; }
}
}