<4D F736F F D20B8F8B3F5D1A7B5A5C6ACBBFAB5C43430B8F6CAB5D1E92E646F63>

Size: px
Start display at page:

Download "<4D F736F F D20B8F8B3F5D1A7B5A5C6ACBBFAB5C43430B8F6CAB5D1E92E646F63>"

Transcription

1 1. 闪烁灯 1. 实验任务 如图 所示 : 在 P1.0 端口上接一个发光二极管 L1, 使 L1 在不停地一亮一灭, 一亮一灭的时间间隔为 0.2 秒 2. 电路原理图 3. 系统板上硬件连线 图 把 单片机系统 区域中的 P1.0 端口用导线连接到 八路发光二极管指示模块 区域中的 L1 端口上 4. 程序设计内容 (1). 延时程序的设计方法 作为单片机的指令的执行的时间是很短, 数量大微秒级, 因此, 我们要求的闪烁时间间隔为 0.2 秒, 相对于微秒来说, 相差太大, 所以我们在执行某一指令时, 插入延时程序, 来达到我们的要求, 但这样的延时程序是如何设计呢? 下面具体介绍其原理 :

2 如图 所示的石英晶体为 12MHz, 因此,1 个机器周期为 1 微秒 机器周期微秒 MOV R6,#20 2 个机器周期 2 D1: MOV R7,#248 2 个机器周期 = DJNZ R7,$ 2 个机器周期 DJNZ R6,D1 2 个机器周期 2 20= 因此, 上面的延时程序时间为 ms 由以上可知, 当 R6=10 R7=248 时, 延时 5ms,R6=20 R7=248 时, 延时 10ms, 以此为基本的计时单位 如本实验要求 0.2 秒 =200ms, 10ms R5=200ms, 则 R5=20, 延时子程序如下 : DELAY: MOV R5,#20 D1: MOV R6,#20 D2: MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET (2). 输出控制 5. 程序框图 如图 1 所示, 当 P1.0 端口输出高电平, 即 P1.0=1 时, 根据发光二极管的单向导电性可知, 这时发光二极管 L1 熄灭 ; 当 P1.0 端口输出低电平, 即 P1.0=0 时, 发光二极管 L1 亮 ; 我们可以使用 SETB P1.0 指令使 P1.0 端口输出高电平, 使用 CLR P1.0 指令使 P1.0 端口输出低电平 如图 所 示

3 图 汇编源程序 ORG 0 START: CLR P1.0 LCALL DELAY SETB P1.0 LCALL DELAY LJMP START DELAY: MOV R5,#20 ; 延时子程序, 延时 0.2 秒 D1: MOV R6,#20 D2: MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET END 7. C 语言源程序 #include <AT89X51.H> sbit L1=P1^0; void delay02s(void) // 延时 0.2 秒子程序 unsigned char i,j,k; for(i=20;i>0;i--) for(j=20;j>0;j--) for(k=248;k>0;k--); void main(void) while(1) L1=0; delay02s();

4 L1=1; delay02s(); 2. 模拟开关灯 1. 实验任务 如图 所示, 监视开关 K1( 接在 P3.0 端口上 ), 用发光二极管 L1( 接在单片机 P1.0 端口上 ) 显示开关状态, 如果开关合上,L1 亮, 开关打开, L1 熄灭 2. 电路原理图 3. 系统板上硬件连线 图 (1). 把 单片机系统 区域中的 P1.0 端口用导线连接到 八路发光二极管指示模块 区域中的 L1 端口上 ; (2). 把 单片机系统 区域中的 P3.0 端口用导线连接到 四路拨动开关 区域中的 K1 端口上 ; 4. 程序设计内容

5 (1). 开关状态的检测过程 单片机对开关状态的检测相对于单片机来说, 是从单片机的 P3.0 端口输入信号, 而输入的信号只有高电平和低电平两种, 当拨开开关 K1 拨上去, 即输入高电平, 相当开关断开, 当拨动开关 K1 拨下去, 即输入低电平, 相当开关闭合 单片机可以采用 JB BIT,REL 或者是 JNB BIT,REL 指令来完成对开关状态的检测即可 (2). 输出控制 如图 3 所示, 当 P1.0 端口输出高电平, 即 P1.0=1 时, 根据发光二极管的单向导电性可知, 这时发光二极管 L1 熄灭 ; 当 P1.0 端口输出低电平, 即 P1.0=0 时, 发光二极管 L1 亮 ; 我们可以使用 SETB P1.0 指令使 P1.0 端口输出高电平, 使用 CLR P1.0 指令使 P1.0 端口输出低电平 5. 程序框图 6. 汇编源程序 ORG 00H START: JB P3.0,LIG CLR P1.0 SJMP START LIG: SETB P1.0 SJMP START END 7. C 语言源程序 #include <AT89X51.H> sbit K1=P3^0; sbit L1=P1^0; 图 4.2.2

6 void main(void) while(1) if(k1==0) L1=0; // 灯亮 else L1=1; // 灯灭 3. 多路开关状态指示 1. 实验任务 如图 所示,AT89S51 单片机的 P1.0-P1.3 接四个发光二极管 L1-L4, P1.4-P1.7 接了四个开关 K1-K4, 编程将开关的状态反映到发光二极管上 ( 开关闭合, 对应的灯亮, 开关断开, 对应的灯灭 ) 2. 电路原理图

7 图 系统板上硬件连线 (1. 把 单片机系统 区域中的 P1.0-P1.3 用导线连接到 八路发光二极管指示模块 区域中的 L1-L4 端口上 ; (2. 把 单片机系统 区域中的 P1.4-P1.7 用导线连接到 四路拨动开关 区域中的 K1-K4 端口上 ; 4. 程序设计内容 (1. 开关状态检测 对于开关状态检测, 相对单片机来说, 是输入关系, 我们可轮流检测每个开关状态, 根据每个开关的状态让相应的发光二极管指示, 可以采用 JB P1.X,REL 或 JNB P1.X,REL 指令来完成 ; 也可以一次性检测四路开关状态, 然后让其指示, 可以采用 MOV A,P1 指令一次把 P1 端口的状态全部读入, 然后取高 4 位的状态来指示

8 (2. 输出控制 根据开关的状态, 由发光二极管 L1-L4 来指示, 我们可以用 SETB P1.X 和 CLR P1.X 指令来完成, 也可以采用 MOV P1,#1111XXXXB 方法一次指示 5. 程序框图 读 P1 口数据到 A CC 中 <![endif]--> A CC 内容右移 4 次 A CC 内容与 F0H 相或 A CC 内容送入 P1 口 图 方法一 ( 汇编源程序 ) ORG 00H START: MOV A,P1 ANL A,#0F0H RR A RR A RR A RR A ORl A,#0F0H MOV P1,A SJMP START END 7. 方法一 (C 语言源程序 )

9 #include <AT89X51.H> unsigned char temp; void main(void) while(1) temp=p1>>4; temp=temp 0xf0; P1=temp; 8. 方法二 ( 汇编源程序 ) ORG 00H START: JB P1.4,NEXT1 CLR P1.0 SJMP NEX1 NEXT1: SETB P1.0 NEX1: JB P1.5,NEXT2 CLR P1.1 SJMP NEX2 NEXT2: SETB P1.1 NEX2: JB P1.6,NEXT3 CLR P1.2 SJMP NEX3 NEXT3: SETB P1.2 NEX3: JB P1.7,NEXT4 CLR P1.3 SJMP NEX4 NEXT4: SETB P1.3 NEX4: SJMP START END 9. 方法二 (C 语言源程序 ) #include <AT89X51.H> void main(void) while(1) if(p1_4==0) P1_0=0; else

10 P1_0=1; if(p1_5==0) P1_1=0; else P1_1=1; if(p1_6==0) P1_2=0; else P1_2=1; if(p1_7==0) P1_3=0; else P1_3=1; 4. 广告灯的左移右移 1. 实验任务 做单一灯的左移右移, 硬件电路如图 所示, 八个发光二极管 L1-L8 分别接在单片机的 P1.0-P1.7 接口上, 输出 0 时, 发光二极管亮, 开始时 P1.0 P1.1 P1.2 P1.3 P1.7 P1.6 P1.0 亮, 重复循环 2. 电路原理图

11 图 系统板上硬件连线 把 单片机系统 区域中的 P1.0-P1.7 用 8 芯排线连接到 八路发光二极管指示模块 区域中的 L1-L8 端口上, 要求 :P1.0 对应着 L1,P1.1 对应着 L2,, P1.7 对应着 L8 4. 程序设计内容 我们可以运用输出端口指令 MOV P1,A 或 MOV P1,#DATA, 只要给累加器值或常数值, 然后执行上述的指令, 即可达到输出控制的动作 每次送出的数据是不同, 具体的数据如下表 1 所示 : P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0 说明 L8 L7 L6 L5 L4 L3 L2 L L1 亮 L2 亮 L3 亮 L4 亮 L5 亮

12 L6 亮 L7 亮 L8 亮 5. 程序框图 表 1 6. 汇编源程序 ORG 0 START: MOV R2,#8 MOV A,#0FEH SETB C LOOP: MOV P1,A LCALL DELAY RLC A DJNZ R2,LOOP MOV R2,#8 LOOP1: MOV P1,A LCALL DELAY RRC A DJNZ R2,LOOP1 LJMP START DELAY: MOV R5,#20 ; D1: MOV R6,#20 D2: MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 图 4.4.2

13 RET END 7. C 语言源程序 #include <AT89X51.H> unsigned char i; unsigned char temp; unsigned char a,b; void delay(void) unsigned char m,n,s; for(m=20;m>0;m--) for(n=20;n>0;n--) for(s=248;s>0;s--); void main(void) while(1) temp=0xfe; P1=temp; delay(); for(i=1;i<8;i++) a=temp<<i; b=temp>>(8-i); P1=a b; delay(); for(i=1;i<8;i++) a=temp>>i; b=temp<<(8-i); P1=a b; delay(); 5. 广告灯 ( 利用取表方式 ) 1. 实验任务

14 利用取表的方法, 使端口 P1 做单一灯的变化 : 左移 2 次, 右移 2 次, 闪烁 2 次 ( 延时的时间 0.2 秒 ) 2. 电路原理图 3. 系统板上硬件连线 图 把 单片机系统 区域中的 P1.0-P1.7 用 8 芯排线连接到 八路发光二极管指示模块 区域中的 L1-L8 端口上, 要求 :P1.0 对应着 L1,P1.1 对应着 L2,,P1.7 对应着 L8 4. 程序设计内容 在用表格进行程序设计的时候, 要用以下的指令来完成 (1). 利用 MOV DPTR,#DATA16 的指令来使数据指针寄存器指到表的开头 (2). 利用 MOVC A,@A+DPTR 的指令, 根据累加器的值再加上 DPTR 的值, 就可以使程序计数器 PC 指到表格内所要取出的数据

15 因此, 只要把控制码建成一个表, 而利用 MOVC 做取码的操作, 就可方便地处理一些复杂的控制动作, 取表过程如下图所示 : 5. 程序框图 6. 汇编源程序 ORG 0 START: MOV DPTR,#TABLE LOOP: CLR A MOVC A,@A+DPTR CJNE A,#01H,LOOP1 JMP START LOOP1: MOV P1,A MOV R3,#20 LCALL DELAY INC DPTR JMP LOOP DELAY: MOV R4,#20 D1: MOV R5,#248 DJNZ R5,$ DJNZ R4,D1 DJNZ R3,DELAY 图 4.5.2

16 RET TABLE: DB 0FEH,0FDH,0FBH,0F7H DB 0EFH,0DFH,0BFH,07FH DB 0FEH,0FDH,0FBH,0F7H DB 0EFH,0DFH,0BFH,07FH DB 07FH,0BFH,0DFH,0EFH DB 0F7H,0FBH,0FDH,0FEH DB 07FH,0BFH,0DFH,0EFH DB 0F7H,0FBH,0FDH,0FEH DB 00H, 0FFH,00H, 0FFH DB 01H END 7. C 语言源程序 #include <AT89X51.H> unsigned char code table[]=0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f, 0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f, 0x7f,0xbf,0xdf,0xef, 0xf7,0xfb,0xfd,0xfe, 0x7f,0xbf,0xdf,0xef, 0xf7,0xfb,0xfd,0xfe, 0x00,0xff,0x00,0xff, 0x01; unsigned char i; void delay(void) unsigned char m,n,s; for(m=20;m>0;m--) for(n=20;n>0;n--) for(s=248;s>0;s--); void main(void) while(1) if(table[i]!=0x01) P1=table[i]; i++; delay();

17 else i=0; 6. 报警产生器 1. 实验任务 用 P1.0 输出 1KHz 和 500Hz 的音频信号驱动扬声器, 作报警信号, 要求 1KHz 信号响 100ms,500Hz 信号响 200ms, 交替进行,P1.7 接一开关进行控制, 当开关合上响报警信号, 当开关断开告警信号停止, 编出程序 2. 电路原理图 3. 系统板上硬件连线 图 4.6.1

18 (1. 把 单片机系统 区域中的 P1.0 端口用导线连接到 音频放大模块 区域中的 SPK IN 端口上 ; (2. 在 音频放大模块 区域中的 SPK OUT 端口上接上一个 8 欧的或者是 16 欧的喇叭 ; (3. 把 单片机系统 区域中的 P1.7/RD 端口用导线连接到 四路拨动开关 区域中的 K1 端口上 ; 4. 程序设计内容 (1. 信号产生的方法 500Hz 信号周期为 2ms, 信号电平为每 1ms 变反 1 次,1KHz 的信号周期为 1ms, 信号电平每 500us 变反 1 次 ; 5. 程序框图 图 4.6.2

19 6. 汇编源程序 FLAG BIT 00H ORG 00H START: JB P1.7,START JNB FLAG,NEXT MOV R2,#200 DV: CPL P1.0 LCALL DELY500 LCALL DELY500 DJNZ R2,DV CPL FLAG NEXT: MOV R2,#200 DV1: CPL P1.0 LCALL DELY500 DJNZ R2,DV1 CPL FLAG SJMP START DELY500: MOV R7,#250 LOOP: NOP DJNZ R7,LOOP RET END 7. C 语言源程序 #include <AT89X51.H> #include <INTRINS.H> bit flag; unsigned char count; void dely500(void) unsigned char i; for(i=250;i>0;i--) _nop_(); void main(void) while(1) if(p1_7==0)

20 for(count=200;count>0;count--) P1_0=~P1_0; dely500(); for(count=200;count>0;count--) P1_0=~P1_0; dely500(); dely500(); 1. 实验任务 7. I/O 并行口直接驱动 LED 显示 如图 13 所示, 利用 AT89S51 单片机的 P0 端口的 P0.0-P0.7 连接到一个共阴数码管的 a-h 的笔段上, 数码管的公共端接地 在数码管上循环显示 0-9 数字, 时间间隔 0.2 秒 2. 电路原理图

21 图 系统板上硬件连线 把 单片机系统 区域中的 P0.0/AD0-P0.7/AD7 端口用 8 芯排线连接到 四路静态数码显示模块 区域中的任一个数码管的 a-h 端口上 ; 要求 :P0.0/AD0 与 a 相连,P0.1/AD1 与 b 相连,P0.2/AD2 与 c 相连,,P0.7/AD7 与 h 相连 4. 程序设计内容 (1. LED 数码显示原理 七段 LED 显示器内部由七个条形发光二极管和一个小圆点发光二极管组成, 根据各管的极管的接线形式, 可分成共阴极型和共阳极型 LED 数码管的 g~a 七个发光二极管因加正电压而发亮, 因加零电压而不以发亮, 不同亮暗的组合就能形成不同的字形, 这种组合称之为字形码, 下面给出共阴极的字形码见表 2 0 3FH 8 7FH 1 06H 9 6FH 2 5BH A 77H

22 3 4FH b 7CH 4 66H C 39H 5 6DH d 5EH 6 7DH E 79H 7 07H F 71H (2. 由于显示的数字 0-9 的字形码没有规律可循, 只能采用查表的方式来完成我们所需的要求了 这样我们按着数字 0-9 的顺序, 把每个数字的笔段代码按顺序排好! 建立的表格如下所示 :TABLE DB 3FH,06H,5BH,4FH,66H,6DH, 7DH,07H,7FH,6FH 5. 程序框图 6. 汇编源程序 ORG 0 START: MOV R1,#00H NEXT: MOV A,R1 MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A LCALL DELAY INC R1 CJNE R1,#10,NEXT LJMP START DELAY: MOV R5,#20 D2: MOV R6,#20 D1: MOV R7,#248 图 4.7.2

23 DJNZ R7,$ DJNZ R6,D1 DJNZ R5,D2 RET TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END 7. C 语言源程序 #include <AT89X51.H> unsigned char code table[]=0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f; unsigned char dispcount; void delay02s(void) unsigned char i,j,k; for(i=20;i>0;i--) for(j=20;j>0;j--) for(k=248;k>0;k--); void main(void) while(1) for(dispcount=0;dispcount<10;dispcount++) P0=table[dispcount]; delay02s(); 1. 实验任务 8. 按键识别方法之一 每按下一次开关 SP1, 计数值加 1, 通过 AT89S51 单片机的 P1 端口的 P1.0 到 P1.3 显示出其的二进制计数值 2. 电路原理图

24 图 系统板上硬件连线 (1. 把 单片机系统 区域中的 P3.7/RD 端口连接到 独立式键盘 区域中的 SP1 端口上 ; (2. 把 单片机系统 区域中的 P1.0-P1.4 端口用 8 芯排线连接到 八路发光二极管指示模块 区域中的 L1-L8 端口上 ; 要求,P1.0 连接到 L1, P1.1 连接到 L2,P1.2 连接到 L3,P1.3 连接到 L4 上 4. 程序设计方法 (1. 其实, 作为一个按键从没有按下到按下以及释放是一个完整的过程, 也就是说, 当我们按下一个按键时, 总希望某个命令只执行一次, 而在按键按下的过程中, 不要有干扰进来, 因为, 在按下的过程中, 一旦有干扰过来, 可能造成误触发过程, 这并不是我们所想要的 因此在按键按下的时候,

25 图 要把我们手上的干扰信号以及按键的机械接触等干扰信号给滤除掉, 一般情况下, 我们可以采用电容来滤除掉这些干扰信号, 但实际上, 会增加硬件成本及硬件电路的体积, 这是我们不希望, 总得有个办法解决这个问题, 因此我们可以采用软件滤波的方法去除这些干扰 信号, 一般情况下, 一个按键按下的时候, 总是在按下的时刻存在着一定的干扰信号, 按下之后就基本上进入了稳定的状态 具体的一个按键从按下到释放的全过程的信号图如上图所示 : 从图中可以看出, 我们在程序设计时, 从按键被识别按下之后, 延时 5ms 以上, 从而避开了干扰信号区域, 我们再来检测一次, 看按键是否真得已经按下, 若真得已经按下, 这时肯定输出为低电平, 若这时检测到的是高电平, 证明刚才是由于干扰信号引起的误触发,CPU 就认为是误触发信号而舍弃这次的按键识别过程 从而提高了系统的可靠性 由于要求每按下一次, 命令被执行一次, 直到下一次再按下的时候, 再执行一次命令, 因此从按键被识别出来之后, 我们就可以执行这次的命令, 所以要有一个等待按键释放的过程, 显然释放的过程, 就是使其恢复成高电平状态 (1. 对于按键识别的指令, 我们依然选择如下指令 JB BIT,REL 指令是用来检测 BIT 是否为高电平, 若 BIT=1, 则程序转向 REL 处执行程序, 否则就继续向下执行程序 或者是 JNB BIT,REL 指令是用来检测 BIT 是否为低电平, 若 BIT=0, 则程序转向 REL 处执行程序, 否则就继续向下执行程序

26 (2. 但对程序设计过程中按键识别过程的框图如右图所示 : 5. 程序框图 图 图 汇编源程序 ORG 0 START: MOV R1,#00H ; 初始化 R1 为 0, 表示从 0 开始计数 MOV A,R1 ; CPL A ; 取反指令 MOV P1,A ; 送出 P1 端口由发光二极管显示 REL: JNB P3.7,REL ; 判断 SP1 是否按下

27 LCALL DELAY10MS ; 若按下, 则延时 10ms 左右 JNB P3.7,REL ; 再判断 SP1 是否真得按下 INC R1 ; 若真得按下, 则进行按键处理, 使 MOV A,R1 ; 计数内容加 1, 并送出 P1 端口由 CPL A ; 发光二极管显示 MOV P1,A ; JNB P3.7,$ ; 等待 SP1 释放 SJMP REL ; 继续对 K1 按键扫描 DELAY10MS: MOV R6,#20 ; 延时 10ms 子程序 L1: MOV R7,#248 DJNZ R7,$ DJNZ R6,L1 RET END 7. C 语言源程序 #include <AT89X51.H> unsigned char count; void delay10ms(void) unsigned char i,j; for(i=20;i>0;i--) for(j=248;j>0;j--); void main(void) while(1) if(p3_7==0) delay10ms(); if(p3_7==0) count++; if(count==16) count=0;

28 P1=~count; while(p3_7==0); 9. 一键多功能按键识别技术 1. 实验任务 如图 所示, 开关 SP1 接在 P3.7/RD 管脚上, 在 AT89S51 单片机的 P1 端口接有四个发光二极管, 上电的时候,L1 接在 P1.0 管脚上的发光二极管在闪烁, 当每一次按下开关 SP1 的时候,L2 接在 P1.1 管脚上的发光二极管在闪烁, 再按下开关 SP1 的时候,L3 接在 P1.2 管脚上的发光二极管在闪烁, 再按下开关 SP1 的时候,L4 接在 P1.3 管脚上的发光二极管在闪烁, 再按下开关 SP1 的时候, 又轮到 L1 在闪烁了, 如此轮流下去 2. 电路原理图 图 4.9.1

29 3. 系统板上硬件连线 (1. 把 单片机系统 区域中的 P3.7/RD 端口连接到 独立式键盘 区域中的 SP1 端口上 ; (2. 把 单片机系统 区域中的 P1.0-P1.4 端口用 8 芯排线连接到 八路发光二极管指示模块 区域中的 L1-L8 端口上 ; 要求, P1.0 连接到 L1,P1.1 连接到 L2,P1.2 连接到 L3,P1.3 连接到 L4 上 4. 程序设计方法 (1. 设计思想由来 在我们生活中, 我们很容易通过这个叫张三, 那个叫李四, 另外一个是王五 ; 那是因为每个人有不同的名子, 我们就很快认出, 同样, 对于要通过一个按键来识别每种不同的功能, 我们给每个不同的功能模块用不同的 ID 号标识, 这样, 每按下一次按键,ID 的值是不相同的, 所以单片机就很容易识别不同功能的身份了 (2. 设计方法 从上面的要求我们可以看出,L1 到 L4 发光二极管在每个时刻的闪烁的时间是受开关 SP1 来控制, 我们给 L1 到 L4 闪烁的时段定义出不同的 ID 号, 当 L1 在闪烁时,ID=0; 当 L2 在闪烁时,ID=1; 当 L3 在闪烁时,ID=2; 当 L4 在闪烁时, ID=3; 很显然, 只要每次按下开关 K1 时, 分别给出不同的 ID 号我们就能够完成上面的任务了 下面给出有关程序设计的框图 5. 程序框图

30 6. 汇编源程序 ID EQU 30H SP1 BIT P3.7 L1 BIT P1.0 L2 BIT P1.1 L3 BIT P1.2 L4 BIT P1.3 ORG 0 MOV ID,#00H START: JB K1,REL LCALL DELAY10MS JB K1,REL INC ID MOV A,ID CJNE A,#04,REL MOV ID,#00H REL: JNB K1,$ MOV A,ID 图 4.9.2

31 CJNE A,#00H,IS0 CPL L1 LCALL DELAY SJMP START IS0: CJNE A,#01H,IS1 CPL L2 LCALL DELAY SJMP START IS1: CJNE A,#02H,IS2 CPL L3 LCALL DELAY SJMP START IS2: CJNE A,#03H,IS3 CPL L4 LCALL DELAY SJMP START IS3: LJMP START DELAY10MS: MOV R6,#20 LOOP1: MOV R7,#248 DJNZ R7,$ DJNZ R6,LOOP1 RET DELAY: MOV R5,#20 LOOP2: LCALL DELAY10MS DJNZ R5,LOOP2 RET END 7. C 语言源程序 #include <AT89X51.H> unsigned char ID; void delay10ms(void) unsigned char i,j; for(i=20;i>0;i--) for(j=248;j>0;j--); void delay02s(void) unsigned char i; for(i=20;i>0;i--) delay10ms();

32 void main(void) while(1) if(p3_7==0) delay10ms(); if(p3_7==0) ID++; if(id==4) ID=0; while(p3_7==0); switch(id) case 0: P1_0=~P1_0; delay02s(); break; case 1: P1_1=~P1_1; delay02s(); break; case 2: P1_2=~P1_2; delay02s(); break; case 3: P1_3=~P1_3; delay02s(); break; 计数器 1. 实验任务 利用 AT89S51 单片机来制作一个手动计数器, 在 AT89S51 单片机的 P3.7 管脚接一个轻触开关, 作为手动计数的按钮, 用单片机的 P2.0-P2.7 接一个共阴数码管, 作为 计数的个位数显示, 用单片机的 P0.0-P0.7 接一个共阴数码管, 作为 计数的十位数显示 ; 硬件电路图如图 19 所示

33 2. 电路原理图 图 系统板上硬件连线 (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 端口上 ; (3. 把 单片机系统 区域中的 P3.7/RD 端口用导线连接到 独立式键盘 区域中的 SP1 端口上 ; 4. 程序设计内容 (1. 单片机对按键的识别的过程处理 (2. 单片机对正确识别的按键进行计数, 计数满时, 又从零开始计数 ;

34 (3. 单片机对计的数值要进行数码显示, 计得的数是十进数, 含有十位和个位, 我们要把十位和个位拆开分别送出这样的十位和个位数值到对应的数码管上显示 如何拆开十位和个位我们可以把所计得的数值对 10 求余, 即可得个位数字, 对 10 整除, 即可得到十位数字了 (4. 通过查表方式, 分别显示出个位和十位数字 5. 程序框图 6. 汇编源程序 Count EQU 30H SP1 BIT P3.7 ORG 0 START: MOV Count,#00H NEXT: MOV A,Count 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 WT: JNB SP1,WT WAIT: JB SP1,WAIT LCALL DELY10MS JB SP1,WAIT INC Count MOV A,Count 图

35 CJNE A,#100,NEXT LJMP START DELY10MS: MOV R6,#20 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 RET TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END 7. C 语言源程序 #include <AT89X51.H> unsigned char code table[]=0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f; unsigned char Count; void delay10ms(void) unsigned char i,j; for(i=20;i>0;i--) for(j=248;j>0;j--); void main(void) Count=0; P0=table[Count/10]; P2=table[Count%10]; while(1) if(p3_7==0) delay10ms(); if(p3_7==0) Count++; if(count==100) Count=0; P0=table[Count/10]; P2=table[Count%10]; while(p3_7==0);

36 秒计时器 ( 利用软件延时 ) 1. 实验任务 如下图所示, 在 AT89S51 单片机的 P0 和 P2 端口分别接有两个共阴数码管, P0 口驱动显示秒时间的十位, 而 P2 口驱动显示秒时间的个位 2. 电路原理图 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. 程序设计内容

37 (1. 在设计过程中我们用一个存储单元作为秒计数单元, 当一秒钟到来时, 就让秒计数单元加 1, 当秒计数达到 60 时, 就自动返回到 0, 重新秒计数 (2. 对于秒计数单元中的数据要把它十位数和个数分开, 方法仍采用对 10 整除和对 10 求余 (3. 在数码上显示, 仍通过查表的方式完成 (4. 一秒时间的产生在这里我们采用软件精确延时的方法来完成, 经过精确计算得到 1 秒时间为 秒 DELY1S: MOV R5,#100 D2: MOV R6,#20 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 DJNZ R5,D2 RET 5. 程序框图

38 图 汇编源程序 Second EQU 30H ORG 0 START: MOV Second,#00H NEXT: 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 LCALL DELY1S INC Second MOV A,Second CJNE A,#60,NEXT LJMP START DELY1S: MOV R5,#100 D2: MOV R6,#20 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 DJNZ R5,D2 RET TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END 7. C 语言源程序 #include <AT89X51.H> unsigned char code table[]=0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f; unsigned char Second; void delay1s(void) unsigned char i,j,k; for(k=100;k>0;k--) for(i=20;i>0;i--) for(j=248;j>0;j--);

39 void main(void) Second=0; P0=table[Second/10]; P2=table[Second%10]; while(1) delay1s(); Second++; if(second==60) Second=0; P0=table[Second/10]; P2=table[Second%10]; 12. 可预置可逆 4 位计数器 1. 实验任务 利用 AT89S51 单片机的 P1.0-P1.3 接四个发光二极管 L1-L4, 用来指示当前计数的数据 ; 用 P1.4-P1.7 作为预置数据的输入端, 接四个拨动开关 K1-K4, 用 P3.6/WR 和 P3.7/RD 端口接两个轻触开关, 用来作加计数和减计数开关 具体的电路原理图如下图所示 2. 电路原理图

40 图 系统板上硬件连线 (1. 把 单片机系统 区域中的 P1.0-P1.3 端口用 8 芯排线连接到 八路发光二极管指示模块 区域中的 L1-L4 上 ; 要求 :P1.0 对应着 L1,P1.1 对应着 L2,P1.2 对应着 L3,P1.3 对应着 L4; (2. 把 单片机系统 区域中的 P3.0/RXD,P3.1/TXD,P3.2/INT0,P3.3/INT1 用导线连接到 四路拨动开关 区域中的 K1-K4 上 ; (3. 把 单片机系统 区域中的 P3.6/WR,P3.7/RD 用导线连接到 独立式键盘 区域中的 SP1 和 SP2 上 ; 4. 程序设计内容 (1. 两个独立式按键识别的处理过程 ;

41 (2. 预置初值读取的问题 (3. LED 输出指示 5. 程序框图 图 汇编源程序 COUNT EQU 30H ORG 00H START: MOV A,P3 ANL A,#0FH MOV COUNT,A MOV P1,A SK2: JB P3.6,SK1 LCALL DELY10MS JB P3.6,SK1 INC COUNT MOV A,COUNT CJNE A,#16,NEXT MOV A,P3

42 ANL A,#0FH MOV COUNT,A NEXT: MOV P1,A WAIT: JNB P3.6,WAIT LJMP SK2 SK1: JB P3.7,SK2 LCALL DELY10MS JB P3.7,SK2 DEC COUNT MOV A,COUNT CJNE A,#0FFH,NEX MOV A,P3 ANL A,#0FH MOV COUNT,A NEX: MOV P1,A WAIT2: JNB P3.7,WAIT2 LJMP SK2 DELY10MS: MOV R6,#20 MOV R7,#248 D1: DJNZ R7,$ DJNZ R6,D1 RET END 7. C 语言源程序 #include <AT89X51.H> unsigned char curcount; void delay10ms(void) unsigned char i,j; for(i=20;i>0;i--) for(j=248;j>0;j--); void main(void) curcount=p3 & 0x0f; P1=~curcount; while(1) if(p3_6==0)

43 delay10ms(); if(p3_6==0) if(curcount>=15) curcount=15; else curcount++; P1=~curcount; while(p3_6==0); if(p3_7==0) delay10ms(); if(p3_7==0) if(curcount<=0) curcount=0; else curcount--; P1=~curcount; while(p3_7==0); 13. 动态数码显示技术 1. 实验任务 如图 所示,P0 端口接动态数码管的字形码笔段,P2 端口接动态数码管的数位选择端,P1.7 接一个开关, 当开关接高电平时, 显示 字样 ; 当开关接低电平时, 显示 HELLO 字样 2. 电路原理图

44 图 系统板上硬件连线 (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. 程序设计内容 (1. 动态扫描方法

45 动态接口采用各数码管循环轮流显示的方法, 当循环显示频率较高时, 利用人眼的暂留特性, 看不出闪烁显示现象, 这种显示需要一个接口完成字形码的输出 ( 字形选择 ), 另一接口完成各数码管的轮流点亮 ( 数位选择 ) (2. 在进行数码显示的时候, 要对显示单元开辟 8 个显示缓冲区, 每个显示缓冲区装有显示的不同数据即可 (3. 对于显示的字形码数据我们采用查表方法来完成 5. 程序框图 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 图

46 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 <AT89X51.H> 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);

47 temp=a b; for(a=4;a>0;a--) for(b=248;b>0;b--); 1. 实验任务 矩阵式键盘识别技术 如图 所示, 用 AT89S51 的并行口 P1 接 4 4 矩阵键盘, 以 P1.0-P1.3 作输入线, 以 P1.4-P1.7 作输出线 ; 在数码管上显示每个按键的 0-F 序号 对应的按键的序号排列如图 所示 2. 硬件电路原理图 图

48 图 系统板上硬件连线 (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. 程序设计内容 ( 矩阵键盘识别处理 (2. 每个按键有它的行值和列值, 行值和列值的组合就是识别这个按键的编码 矩阵的行线和列线分别通过两并行接口和 CPU 通信 每个按键的状态同样需变成数字量 0 和 1, 开关的一端 ( 列线 ) 通过电阻接 VCC, 而接地是通过程序输出数字 0 实现的 键盘处理程序的任务是 : 确定有无键按下, 判断哪一个键按下, 键的功能是什么 ; 还要消除按键在闭合或断开时的抖动 两个并行口中, 一个输出扫描码, 使按键逐行动态接地, 另一个并行口输入按键状态, 由行扫描值和回馈信号共同形成键编码而识别按键, 通过软件查表, 查出该键的功能

49 5. 程序框图 图 汇编源程序 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

50 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 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

51 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 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

52 LJMP DK3 NK11: CJNE A,#07H,NK12 MOV KEYBUF,#11 LJMP DK3 NK12: NOP DK3: MOV A,KEYBUF MOV DPTR,#TABLE MOVC 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

53 MOV DPTR,#TABLE MOVC 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 <AT89X51.H> 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;

54 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;

55 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)

56 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;

57 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; 1. 实验任务 15. 定时计数器 T0 作定时应用技术 ( 一 ) 用 AT89S51 单片机的定时 / 计数器 T0 产生一秒的定时时间, 作为秒计数时间, 当一秒产生时, 秒计数加 1, 秒计数到 60 时, 自动从 0 开始 硬件电路如下图所示 2. 电路原理图

58 图 系统板上硬件连线 (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, 即 ms, 无法达到我们所需要的 1 秒的定时, 因此, 我们必须通过软件来处理这个问题, 假设我们取 T0 的最大定时为 50ms, 即要定时 1 秒需要经过 20 次的 50ms 的定时 对于这 20 次我们就可以采用软件的方法来统计了

59 因此, 我们设定 TMOD= B, 即 TMOD=01H 下面我们要给 T0 定时 / 计数器的 TH0,TL0 装入预置初值, 通过下面的公式可以计算出 TH0=( ) / 256 TL0=( ) MOD 256 当 T0 在工作的时候, 我们如何得知 50ms 的定时时间已到, 这回我们通过检测 TCON 特殊功能寄存器中的 TF0 标志位, 如果 TF0=1 表示定时时间已到 5. 程序框图 6. 汇编源程序 ( 查询法 ) SECOND EQU 30H TCOUNT EQU 31H ORG 00H START: MOV SECOND,#00H MOV TCOUNT,#00H 图

60 MOV TMOD,#01H MOV TH0,#( ) / 256 MOV TL0,#( ) 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,#( ) / 256 MOV TL0,#( ) 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: LJMP DISP NEXT: LJMP WAIT TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END 7. C 语言源程序 ( 查询法 ) #include <AT89X51.H> 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=( )/256; TL0=( )%256;

61 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=( )/256; TL0=( )%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

62 MOV TCOUNT,#00H MOV TMOD,#01H MOV TH0,#( ) / 256 MOV TL0,#( ) MOD 256 SETB TR0 SETB ET0 SETB EA SJMP $ INT0X: MOV TH0,#( ) / 256 MOV TL0,#( ) 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 <AT89X51.H> 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)

63 TMOD=0x01; TH0=( )/256; TL0=( )%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=( )/256; TL0=( )%256; 1. 实验任务 16. 定时计数器 T0 作定时应用技术 ( 二 ) 用 AT89S51 的定时 / 计数器 T0 产生 2 秒钟的定时, 每当 2 秒定时到来时, 更换指示灯闪烁, 每个指示闪烁的频率为 0.2 秒, 也就是说, 开始 L1 指示灯以 0.2 秒的速率闪烁, 当 2 秒定时到来之后,L2 开始以 0.2 秒的速率闪烁, 如此循环下去 0.2 秒的闪烁速率也由定时 / 计数器 T0 来完成 2. 电路原理图

64 图 系统板硬件连线 (1. 把 单片机系统 区域中的 P1.0-P1.3 用导线连接到 八路发光二极管指示模块 区域中的 L1-L4 上 4. 程序设计内容 (1. 由于采用中断方式来完成, 因此, 对于中断源必须它的中断入口地址, 对于定时 / 计数器 T0 来说, 中断入口地址为 000BH, 因此在中断入口地方加入长跳转指令来执行中断服务程序 书写汇编源程序格式如下所示 : ORG 00H LJMP START ORG 0BH ; 定时 / 计数器 T0 中断入口地址 LJMP INT_T0 START: NOP ; 主程序开始.

65 . 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 中断服务程序框图 主程序框图

66 图 汇编源程序 6. 汇编源程序 TCOUNT2S EQU 30H TCNT02S EQU 31H ID EQU 32H ORG 00H LJMP START ORG 0BH

67 LJMP INT_T0 START: MOV TCOUNT2S,#00H MOV TCNT02S,#00H MOV ID,#00H MOV TMOD,#01H MOV TH0,#( ) / 256 MOV TL0,#( ) MOD 256 SETB TR0 SETB ET0 SETB EA SJMP $ INT_T0: MOV TH0,#( ) / 256 MOV TL0,#( ) 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 <AT89X51.H> unsigned char tcount2s;

68 unsigned char tcount02s; unsigned char ID; void main(void) TMOD=0x01; TH0=( )/256; TL0=( )%256; 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;

69 break; 秒马表设计 1. 实验任务 (1. 开始时, 显示 00, 第 1 次按下 SP1 后就开始计时 (2. 第 2 次按 SP1 后, 计时停止 (3. 第 3 次按 SP1 后, 计时归零 2. 电路原理图 图 系统板上硬件连线 (1. 把 单片机系统 区域中的 P0.0/AD0-P0.7/AD7 端口用 8 芯排线连接到 四路静态数码显示模块 区域中的任一个 a-h 端口上 ; 要求 :P0.0/AD0 对应着 a,p0.1/ad1 对应着 b,,p0.7/ad7 对应着 h

70 (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 中断服务程序框图

71 图 汇编源程序 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 MOV P0,A MOV A,B MOV DPTR,#TABLE

72 MOVC 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 MOV P0,A MOV A,B MOV DPTR,#TABLE MOVC 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

73 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 MOV P0,A MOV A,B MOV DPTR,#TABLE MOVC MOV P2,A NEXT: RETI TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END 6. C 语言源程序 #include <AT89X51.H> 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];

74 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];

75 P2=dispcode[second%10]; 1. 实验任务 18. 嘀 嘀 报警声 用 AT89S51 单片机产生 嘀 嘀 报警声从 P1.0 端口输出, 产生频率为 1KHz, 根据上面图可知 :1KHZ 方波从 P1.0 输出 0.2 秒, 接着 0.2 秒从 P1.0 输出电平信号, 如此循环下去, 就形成我们所需的报警声了 2. 电路原理图 3. 系统板硬件连线 图 (1. 把 单片机系统 区域中的 P1.0 端口用导线连接到 音频放大模块 区域中的 SPK IN 端口上, (2. 在 音频放大模块 区域中的 SPK OUT 端口上接上一个 8 欧或者是 16 欧的喇叭 ;

76 4. 程序设计方法 (1. 生活中我们常常到各种各样的报警声, 例如 嘀 嘀 就是常见的一种声音报警声, 但对于这种报警声, 嘀 0.2 秒钟, 然后断 0.2 秒钟, 如此循环下去, 假设嘀声的频率为 1KHz, 则报警声时序图如下图所示 : 上述波形信号如何用单片机来产生呢? (2. 由于要产生上面的信号, 我们把上面的信号分成两部分, 一部分为 1KHZ 方波, 占用时间为 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. 程序框图 主程序框图 中断服务程序框图

77 图 汇编源程序 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,#( ) / 256 MOV TL0,#( ) MOD 256 SETB TR0 SETB ET0 SETB EA SJMP $ INT_T0: MOV TH0,#( ) / 256 MOV TL0,#( ) MOD 256 INC T02SA

78 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 <AT89X51.H> unsigned int t02s; unsigned char t05ms; bit flag; void main(void) TMOD=0x01; TH0=( )/256; TL0=( )%256; TR0=1; ET0=1; EA=1; while(1); void t0(void) interrupt 1 using 0 TH0=( )/256; TL0=( )%256; t02s++; if(t02s==400) t02s=0; flag=~flag; if(flag==0) P1_0=~P1_0;

79 19. 叮咚 门铃 1. 实验任务 当按下开关 SP1,AT89S51 单片机产生 叮咚 声从 P1.0 端口输出到 LM386, 经过放大之后送入喇叭 2. 电路原理图 3. 系统板上硬件连线 图 (1. 把 单片机系统 区域中的 P1.0 端口用导线连接到 音频放大模块 区域中的 SPK IN 端口上 ; (2. 在 音频放大模块 区域中的 SPK OUT 端口上接上一个 8 欧或者是 16 欧的喇叭 ; (3. 把 单片机系统 区域中的 P3.7/RD 端口用导线连接到 独立式键盘 区域中的 SP1 端口上 ; 4. 程序设计方法

80 (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 中断服务程序框图

81 图 汇编源程序 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

82 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

83 END 7. C 语言源程序 #include <AT89X51.H> 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++;

84 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; 20. 数字钟 1. 实验任务 (1. 开机时, 显示 12:00:00 的时间开始计时 ; (2. P0.0/AD0 控制 秒 的调整, 每按一次加 1 秒 ; (3. P0.1/AD1 控制 分 的调整, 每按一次加 1 分 ; (4. P0.2/AD2 控制 时 的调整, 每按一次加 1 个小时 ;

85 2. 电路原理图 图 系统板上硬件连线 (1. 把 单片机系统 区域中的 P1.0-P1.7 端口用 8 芯排线连接到 动态数码显示 区域中的 A-H 端口上 ; (2. 把 单片机系统 : 区域中的 P3.0-P3.7 端口用 8 芯排线连接到 动态数码显示 区域中的 S1-S8 端口上 ; (3. 把 单片机系统 区域中的 P0.0/AD0 P0.1/AD1 P0.2/AD2 端口分别用导线连接到 独立式键盘 区域中的 SP3 SP2 SP1 端口上 ; 4. 相关基本知识

86 (1. 动态数码显示的方法 (2. 独立式按键识别过程 (3. 时, 分, 秒 数据送出显示处理方法 5. 程序框图

87

88 6. 汇编源程序 SECOND EQU 30H MINITE EQU 31H HOUR EQU 32H HOURK BIT P0.0 MINITEK BIT P0.1 SECONDK BIT P0.2 DISPBUF EQU 40H DISPBIT EQU 48H T2SCNTA EQU 49H T2SCNTB EQU 4AH TEMP EQU 4BH ORG 00H LJMP START ORG 0BH LJMP INT_T0 START: MOV SECOND,#00H MOV MINITE,#00H MOV HOUR,#12 MOV DISPBIT,#00H MOV T2SCNTA,#00H MOV T2SCNTB,#00H MOV TEMP,#0FEH LCALL DISP MOV TMOD,#01H MOV TH0,#( ) / 256 MOV TL0,#( ) MOD 256 SETB TR0 SETB ET0 SETB EA WT: JB SECONDK,NK1 LCALL DELY10MS JB SECONDK,NK1 INC SECOND MOV A,SECOND CJNE A,#60,NS60 MOV SECOND,#00H NS60: LCALL DISP JNB SECONDK,$ NK1: JB MINITEK,NK2 LCALL DELY10MS JB MINITEK,NK2 INC MINITE

89 MOV A,MINITE CJNE A,#60,NM60 MOV MINITE,#00H NM60: LCALL DISP JNB MINITEK,$ NK2: JB HOURK,NK3 LCALL DELY10MS JB HOURK,NK3 INC HOUR MOV A,HOUR CJNE A,#24,NH24 MOV HOUR,#00H NH24: LCALL DISP JNB HOURK,$ NK3: LJMP WT DELY10MS: MOV R6,#10 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 RET DISP: MOV A,#DISPBUF ADD A,#8 DEC A MOV R1,A MOV A,HOUR MOV B,#10 DIV AB DEC R1 MOV A,B DEC R1 MOV A,#10 MOV@R1,A DEC R1 MOV A,MINITE MOV B,#10 DIV AB DEC R1 MOV A,B

90 DEC R1 MOV A,#10 DEC R1 MOV A,SECOND MOV B,#10 DIV AB DEC R1 MOV A,B DEC R1 RET INT_T0: MOV TH0,#( ) / 256 MOV TL0,#( ) MOD 256 MOV A,#DISPBUF ADD A,DISPBIT MOV R0,A MOV A,@R0 MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P1,A MOV A,DISPBIT MOV DPTR,#TAB MOVC A,@A+DPTR MOV P3,A INC DISPBIT MOV A,DISPBIT CJNE A,#08H,KNA MOV DISPBIT,#00H KNA: INC T2SCNTA MOV A,T2SCNTA CJNE A,#100,DONE MOV T2SCNTA,#00H INC T2SCNTB MOV A,T2SCNTB CJNE A,#05H,DONE MOV T2SCNTB,#00H INC SECOND MOV A,SECOND CJNE A,#60,NEXT MOV SECOND,#00H INC MINITE

91 MOV A,MINITE CJNE A,#60,NEXT MOV MINITE,#00H INC HOUR MOV A,HOUR CJNE A,#24,NEXT MOV HOUR,#00H NEXT: LCALL DISP DONE: RETI TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H TAB: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH END 7. C 语言源程序 #include <AT89X51.H> unsigned char code dispcode[]=0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x00; unsigned char dispbitcode[]=0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f; unsigned char dispbuf[8]=0,0,16,0,0,16,0,0; unsigned char dispbitcnt; unsigned char second; unsigned char minite; unsigned char hour; unsigned int tcnt; unsigned char mstcnt; unsigned char i,j; void main(void) TMOD=0x02; TH0=0x06; TL0=0x06; TR0=1; ET0=1; EA=1; while(1) if(p0_0==0)

92 for(i=5;i>0;i--) for(j=248;j>0;j--); if(p0_0==0) second++; if(second==60) second=0; dispbuf[0]=second%10; dispbuf[1]=second/10; while(p0_0==0); if(p0_1==0) for(i=5;i>0;i--) for(j=248;j>0;j--); if(p0_1==0) minite++; if(minite==60) minite=0; dispbuf[3]=minite%10; dispbuf[4]=minite/10; while(p0_1==0); if(p0_2==0) for(i=5;i>0;i--) for(j=248;j>0;j--); if(p0_2==0) hour++; if(hour==24) hour=0; dispbuf[6]=hour%10; dispbuf[7]=hour/10;

93 while(p0_2==0); void t0(void) interrupt 1 using 0 mstcnt++; if(mstcnt==8) mstcnt=0; P1=dispcode[dispbuf[dispbitcnt]]; P3=dispbitcode[dispbitcnt]; dispbitcnt++; if(dispbitcnt==8) dispbitcnt=0; tcnt++; if(tcnt==4000) tcnt=0; second++; if(second==60) second=0; minite++; if(minite==60) minite=0; hour++; if(hour==24) hour=0; dispbuf[0]=second%10; dispbuf[1]=second/10; dispbuf[3]=minite%10; dispbuf[4]=minite/10; dispbuf[6]=hour%10; dispbuf[7]=hour/10;

94 21. 拉幕式数码显示技术 1. 实验任务 用 AT89S51 单片机的 P0.0/AD0-P0.7/AD7 端口接数码管的 a-h 端,8 位数码管的 S1-S8 通过 74LS138 译码器的 Y0-Y7 来控制选通每个数码管的位选端 AT89S51 单片机的 P1.0-P1.2 控制 74LS138 的 A,B,C 端子 在 8 位数码管上从右向左循环显示 能够比较平滑地看到拉幕的效果 2. 电路原理图 3. 系统板上硬件连线 图

95 (1. 把 单片机系统 区域中的 P0.0/AD0-P0.7/AD7 用 8 芯排线连接到 动态数码显示 区域中的 a-h 端口上 ; (2. 把 三八译码模块 区域中的 Y0-Y7 用 8 芯排线连接到 动态数码显示 区域中的 S1-S8 端口上 ; (3. 把 单片机系统 区域中的 P1.0-P1.2 端口用 3 根导线连接到 三八译码模块 区域中的 A B C 端口上 ; 4. 程序设计方法 (1. 动态数码显示技术 ; 如何进行动态扫描, 由于一次只能让一个数码管显示, 因此, 要显示 8 位的数据, 必须经过让数码管一个一个轮流显示才可以, 同时每个数码管显示的时间大约在 1ms 到 4ms 之间, 所以为了保证正确显示, 我必须每隔 1ms, 就得刷新一个数码管 而这刷新时间我们采用单片机的定时 / 计数器 T0 来控制, 每定时 1ms 对数码管刷新一次,T0 采用方式 2 (2. 在进行数码显示的时候, 要对显示单元开辟 8 个显示缓冲区, 每个显示缓冲区装有显示的不同数据即可 5. 程序框图 主程序框图 中断服务程序框图

96 图 汇编源程序 DISPBUF EQU 30H DISPCNT EQU 38H DISPBIT EQU 39H T1CNTA EQU 3AH T1CNTB EQU 3BH CNT EQU 3CH ORG 00H LJMP START ORG 0BH LJMP INT_T0

97 START: MOV DISPCNT,#8 MOV A,#10 MOV R1,#DISPBUF LP: INC R1 DJNZ DISPCNT,LP MOV DISPBIT,#00H MOV T1CNTA,#00H MOV T1CNTB,#00H MOV CNT,#00H MOV TMOD,#01H MOV TH0,#( ) / 256 MOV TL0,#( ) MOD 256 SETB TR0 SETB ET0 SETB EA SJMP $ INT_T0: MOV TH0,#( ) / 256 MOV TL0,#( ) MOD 256 MOV A,DISPBIT ADD A,#DISPBUF MOV R0,A MOV A,@R0 MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A MOV A,P1 ANL A,#0F8H ADD A,DISPBIT MOV P1,A INC DISPBIT MOV A,DISPBIT CJNE A,#08H,NEXT MOV DISPBIT,#00H NEXT: INC T1CNTA MOV A,T1CNTA CJNE A,#50,LL1 MOV T1CNTA,#00H INC T1CNTB MOV A,T1CNTB CJNE A,#8,LL1 MOV T1CNTB,#00H

98 INC CNT MOV A,CNT CJNE A,#9,LLX MOV CNT,#00H MOV A,CNT LLX: CJNE A,#01H,NEX1 MOV 30H,#8 LL1: LJMP DONE NEX1: CJNE A,#02H,NEX2 MOV 31H,#8 MOV 30H,#8 LJMP DONE NEX2: CJNE A,#03H,NEX3 MOV 32H,#8 MOV 31H,#8 MOV 30H,#8 LJMP DONE NEX3: CJNE A,#04H,NEX4 MOV 33H,#8 MOV 32H,#8 MOV 31H,#8 MOV 30H,#8 LJMP DONE NEX4: CJNE A,#05H,NEX5 MOV 34H,#8 MOV 33H,#8 MOV 32H,#8 MOV 31H,#8 MOV 30H,#8 LJMP DONE NEX5: CJNE A,#06H,NEX6 MOV 35H,#8 MOV 34H,#8 MOV 33H,#8 MOV 32H,#8 MOV 31H,#8 MOV 30H,#8 LJMP DONE NEX6: CJNE A,#07H,NEX7 MOV 36H,#8 MOV 35H,#8 MOV 34H,#8 MOV 33H,#8 MOV 32H,#8

99 MOV 31H,#8 MOV 30H,#8 LJMP DONE NEX7: CJNE A,#08H,NEX8 MOV 37H,#8 MOV 36H,#8 MOV 35H,#8 MOV 34H,#8 MOV 33H,#8 MOV 32H,#8 MOV 31H,#8 MOV 30H,#8 LJMP DONE NEX8: CJNE A,#00H,DONE MOV 37H,#10 MOV 36H,#10 MOV 35H,#10 MOV 34H,#10 MOV 33H,#10 MOV 32H,#10 MOV 31H,#10 MOV 30H,#10 LL: LJMP DONE DONE: RETI TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H END 7. C 语言源程序 #include <AT89X51.H> unsigned char code dispcode[]=0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x00; unsigned char dispbitcode[]=0xf8,0xf9,0xfa,0xfb, 0xfc,0xfd,0xfe,0xff; unsigned char dispbuf[8]=16,16,16,16,16,16,16,16; unsigned char dispbitcnt; unsigned int t02scnt; unsigned char t5mscnt; unsigned char u; unsigned char i; void main(void) TMOD=0x02;

100 TH0=0x06; TL0=0x06; TR0=1; ET0=1; EA=1; while(1); void t0(void) interrupt 1 using 0 t5mscnt++; if(t5mscnt==4) t5mscnt=0; P0=dispcode[dispbuf[dispbitcnt]]; P1=dispbitcode[dispbitcnt]; dispbitcnt++; if(dispbitcnt==8) dispbitcnt=0; t02scnt++; if(t02scnt==1600) t02scnt=0; u++; if(u==9) u=0; for(i=0;i<8;i++) dispbuf[i]=16; for(i=0;i<u;i++) dispbuf[i]=8; 22. 电子琴

101 1. 实验任务 (1. 由 4X4 组成 16 个按钮矩阵, 设计成 16 个音 (2. 可随意弹奏想要表达的音乐 2. 电路原理图 3. 系统板硬件连线 图 (1. 把 单片机系统 区域中的 P1.0 端口用导线连接到 音频放大模块 区域中的 SPK IN 端口上 ;

102 (2. 把 单片机系统 区域中的 P3.0-P3.7 端口用 8 芯排线连接到 4X4 行列式键盘 区域中的 C1-C4 R1-R4 端口上 ; 4. 相关程序内容 (1. 4X4 行列式键盘识别 ; (2. 音乐产生的方法 ; 一首音乐是许多不同的音阶组成的, 而每个音阶对应着不同的频率, 这样我们就可以利用不同的频率的组合, 即可构成我们所想要的音乐了, 当然对于单片机来产生不同的频率非常方便, 我们可以利用单片机的定时 / 计数器 T0 来产生这样方波频率信号, 因此, 我们只要把一首歌曲的音阶对应频率关系弄正确即可 现在以单片机 12MHZ 晶振为例, 例出高中低音符与单片机计数 T0 相关的计数值如下表所示 音符 频率 (HZ) 简谱码 (T 值 ) 音符 频率 (HZ) 简谱码 (T 值 ) 低 1 DO # 4 FA# #1 DO# 中 5 SO 低 2 RE # 5 SO# #2 RE# 中 6 LA 低 3 M # 低 4 FA 中 7 SI # 4 FA# 高 1 DO 低 5 SO # 1 DO# # 5 SO# 高 2 RE 低 6 LA # 2 RE# # 高 3 M 低 7 SI 高 4 FA 中 1 DO # 4 FA# # 1 DO# 高 5 SO 中 2 RE # 5 SO# # 2 RE# 高 6 LA 中 3 M # 中 4 FA 高 7 SI 下面我们要为这个音符建立一个表格, 有助于单片机通过查表的方式来获得相应的数据 低音 0-19 之间, 中音在 之间, 高音在 之间 TABLE: DW 0,63628,63835,64021,64103,64260,64400,64524,0,0 DW 0,63731,63928,0,64185,64331,64463,0,0,0

103 DW 0,64580,64684,64777,64820,64898,64968,65030,0,0 DW 0,64633,64732,0,64860,64934,64994,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 调 ) 曲调值 DELAY 曲调值 DELAY 调 4/4 125ms 调 4/4 62ms 调 3/4 187ms 调 3/4 94ms 调 2/4 250ms 调 2/4 125ms 对于不同的曲调我们也可以用单片机的另外一个定时 / 计数器来完成 下面就用 AT89S51 单片机产生一首 生日快乐 歌曲来说明单片机如何产生的 在这个程序中用到了两个定时 / 计数器来完成的 其中 T0 用来产生音符频率,T1 用来产生音拍 5. 程序框图 6. 汇编源程序 KEYBUF EQU 30H STH0 EQU 31H STL0 EQU 32H TEMP EQU 33H 图

104 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 NK3: CJNE A,#07H,NK4 MOV KEYBUF,#3 LJMP DK1 NK4: NOP DK1: MOV A,KEYBUF MOV DPTR,#TABLE MOVC MOV P0,A MOV A,KEYBUF MOV B,#2 MUL AB MOV TEMP,A MOV DPTR,#TABLE1

105 MOVC MOV STH0,A MOV TH0,A INC TEMP MOV A,TEMP MOVC 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

106 MOV DPTR,#TABLE MOVC MOV P0,A MOV A,KEYBUF MOV B,#2 MUL AB MOV TEMP,A MOV DPTR,#TABLE1 MOVC MOV STH0,A MOV TH0,A INC TEMP MOV A,TEMP MOVC 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

107 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 MOV P0,A MOV A,KEYBUF MOV B,#2 MUL AB MOV TEMP,A MOV DPTR,#TABLE1 MOVC MOV STH0,A MOV TH0,A INC TEMP MOV A,TEMP MOVC 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

108 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 MOV P0,A MOV A,KEYBUF MOV B,#2 MUL AB MOV TEMP,A MOV DPTR,#TABLE1 MOVC MOV STH0,A MOV TH0,A INC TEMP MOV A,TEMP MOVC 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

109 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 64021,64103,64260,64400 DW 64524,64580,64684,64777 DW 64820,64898,64968,65030 DW 65058,65110,65157,65178 END 7. C 语言源程序 #include <AT89X51.H> 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[]=64021,64103,64260,64400, 64524,64580,64684,64777, 64820,64898,64968,65030, 65058,65110,65157,65178; void main(void) TMOD=0x01; ET0=1; EA=1; while(1) P3=0xff; P3_4=0; temp=p3;

110 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]%256; TR0=1; temp=temp & 0x0f; while(temp!=0x0f) temp=p3; temp=temp & 0x0f; TR0=0; P3=0xff; P3_5=0;

111 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]%256; TR0=1; temp=temp & 0x0f; while(temp!=0x0f) temp=p3; temp=temp & 0x0f; TR0=0; P3=0xff;

112 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]%256; TR0=1; temp=temp & 0x0f; while(temp!=0x0f) temp=p3; temp=temp & 0x0f; TR0=0;

113 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]%256; TR0=1; temp=temp & 0x0f; while(temp!=0x0f) temp=p3; temp=temp & 0x0f; TR0=0;

114 void t0(void) interrupt 1 using 0 TH0=STH0; TL0=STL0; P1_0=~P1_0; 1. 实验任务 (1. 开机时, 显示 模拟计算器数字输入及显示 (2. 第一次按下时, 显示 D1 ; 第二次按下时, 显示 D1D2 ; 第三按下时, 显示 D1D2D3,8 个全显示完毕, 再按下按键下时, 给出 嘀 提示音 2. 电路原理图

115 图 系统板上硬件连线 (1. 把 单片机系统 区域中的 P1.0 端口用导线连接到 音频放大模块 区域中的 SPK IN 端口上 ; (2. 把 单片机系统 区域中的 P3.0-P3.7 端口用 8 芯排线连接到 4X4 行列式键盘 区域中的 C1-C4 R1-R4 端口上 ; (3. 把 单片机系统 区域中的 P0.0-P0.7 端口用 8 芯排线连接到 动态数码显示 区域中的 A-H 端口上 ; (4. 把 单片机系统 : 区域中的 P2.0-P2.7 端口用 8 芯排线连接到 动态数码显示 区域中的 S1-S8 端口上 ; 4. 相关程序设计内容 (1. 行列式键盘输入及按键功能设定 ; (2. 动态数码显示 ; (3. 数码显示方式处理 ; 5. 汇编源程序 ( 略 ) 6. C 语言源程序 #include <AT89X51.H> unsigned char code dispcode[]=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00; unsigned char code dispbitcode[]=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f; unsigned char dispbuf[8]=0,16,16,16,16,16,16,16; unsigned char dispbitcount; unsigned char temp; unsigned char i,j; unsigned char key; unsigned char keypos; bit alarmflag; void change(unsigned char *p,unsigned char count) while(count>0) *(p+count)=*(p+count-1);

116 count--; void main(void) TMOD=0x01; TH0=( ) / 256; TL0=( ) % 256; TR0=1; 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=7; break; case 0x0d: key=8; break; case 0x0b: key=9; break; case 0x07: key=10; break;

117 if ((key>=0) && (key<10)) keypos++; if(keypos<8) change(dispbuf,keypos); dispbuf[0]=key; else keypos=8; alarmflag=1; temp=p3; P1_0=~P1_0; temp=temp & 0x0f; while(temp!=0x0f) temp=p3; temp=temp & 0x0f; alarmflag=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;

118 break; case 0x0d: key=5; break; case 0x0b: key=6; break; case 0x07: key=11; break; if ((key>=0) && (key<10)) keypos++; if(keypos<8) change(dispbuf,keypos); dispbuf[0]=key; else keypos=8; alarmflag=1; temp=p3; P1_0=~P1_0; temp=temp & 0x0f; while(temp!=0x0f) temp=p3; temp=temp & 0x0f; alarmflag=0; P3=0xff; P3_6=0; temp=p3; temp=temp & 0x0f; if (temp!=0x0f) for(i=50;i>0;i--)

119 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; if ((key>=0) && (key<10)) keypos++; if(keypos<8) change(dispbuf,keypos); dispbuf[0]=key; else keypos=8; alarmflag=1; temp=p3; P1_0=~P1_0; temp=temp & 0x0f; while(temp!=0x0f) temp=p3; temp=temp & 0x0f;

120 alarmflag=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=0; break; case 0x0d: key=13; break; case 0x0b: key=14; break; case 0x07: key=15; break; if ((key>=0) && (key<10)) keypos++; if(keypos<8) change(dispbuf,keypos); dispbuf[0]=key; else keypos=8;

121 alarmflag=1; temp=p3; P1_0=~P1_0; temp=temp & 0x0f; while(temp!=0x0f) temp=p3; temp=temp & 0x0f; alarmflag=0; void t0(void) interrupt 1 using 0 TH0=( ) / 256; TL0=( ) % 256; P0=dispcode[dispbuf[dispbitcount]]; P2=dispbitcode[dispbitcount]; dispbitcount++; if (dispbitcount==8) dispbitcount=0; if (alarmflag==1) P1_1=~P1_1; 1. 实验任务 24. 8X8 LED 点阵显示技术 在 8X8 LED 点阵上显示柱形, 让其先从左到右平滑移动三次, 其次从右到左平滑移动三次, 再次从上到下平滑移动三次, 最后从下到上平滑移动三次, 如此循环下去 2. 电路原理图

122 图 硬件电路连线 (1). 把 单片机系统 区域中的 P1 端口用 8 芯排芯连接到 点阵模块 区域中的 DR1-DR8 端口上 ; (2). 把 单片机系统 区域中的 P3 端口用 8 芯排芯连接到 点阵模块 区域中的 DC1-DC8 端口上 ; 4. 程序设计内容 (1). 8X8 点阵 LED 工作原理说明

123 8X8 点阵 LED 结构如下图所示 图 从图 中可以看出,8X8 点阵共需要 64 个发光二极管组成, 且每个发光二极管是放置在行线和列线的交叉点上, 当对应的某一列置 1 电平, 某一行置 0 电平, 则相应的二极管就亮 ; 因此要实现一根柱形的亮法, 如图 49 所示, 对应的一列为一根竖柱, 或者对应的一行为一根横柱, 因此实现柱的亮的方法如下所述 : 一根竖柱 : 对应的列置 1, 而行则采用扫描的方法来实现 一根横柱 : 对应的行置 0, 而列则采用扫描的方法来实现 5. 汇编源程序 ORG 00H START: NOP MOV R3,#3 LOP2: MOV R4,#8

124 MOV R2,#0 LOP1: MOV P1,#0FFH MOV DPTR,#TABA MOV A,R2 MOVC MOV P3,A INC R2 LCALL DELAY DJNZ R4,LOP1 DJNZ R3,LOP2 MOV R3,#3 LOP4: MOV R4,#8 MOV R2,#7 LOP3: MOV P1,#0FFH MOV DPTR,#TABA MOV A,R2 MOVC MOV P3,A DEC R2 LCALL DELAY DJNZ R4,LOP3 DJNZ R3,LOP4 MOV R3,#3 LOP6: MOV R4,#8 MOV R2,#0 LOP5: MOV P3,#00H MOV DPTR,#TABB MOV A,R2 MOVC MOV P1,A INC R2 LCALL DELAY DJNZ R4,LOP5 DJNZ R3,LOP6 MOV R3,#3 LOP8: MOV R4,#8 MOV R2,#7 LOP7: MOV P3,#00H MOV DPTR,#TABB MOV A,R2 MOVC

125 MOV P1,A DEC R2 LCALL DELAY DJNZ R4,LOP7 DJNZ R3,LOP8 LJMP START DELAY: MOV R5,#10 D2: MOV R6,#20 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 DJNZ R5,D2 RET TABA: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH TABB: DB 01H,02H,04H,08H,10H,20H,40H,80H END 6. C 语言源程序 #include <AT89X52.H> unsigned char code taba[]=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f; unsigned char code tabb[]=0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80; void delay(void) unsigned char i,j; for(i=10;i>0;i--) for(j=248;j>0;j--); void delay1(void) unsigned char i,j,k; for(k=10;k>0;k--) for(i=20;i>0;i--) for(j=248;j>0;j--);

126 void main(void) unsigned char i,j; while(1) for(j=0;j<3;j++) for(i=0;i<8;i++) P3=taba[i]; P1=0xff; delay1(); for(j=0;j<3;j++) for(i=0;i<8;i++) P3=taba[7-i]; P1=0xff; delay1(); for(j=0;j<3;j++) for(i=0;i<8;i++) P3=0x00; P1=tabb[7-i]; delay1(); for(j=0;j<3;j++) for(i=0;i<8;i++) P3=0x00; P1=tabb[i]; delay1(); //from left to right 3 time //from right to left 3 time //from top to bottom 3 time //from bottom to top 3 time

127 25. 点阵式 LED 0-9 数字显示技术 1. 实验任务 利用 8X8 点阵显示数字 0 到 9 的数字 2. 电路原理图 3. 硬件系统连线 图 (1). 把 单片机系统 区域中的 P1 端口用 8 芯排芯连接到 点阵模块 区域中的 DR1-DR8 端口上 ;

128 (2). 把 单片机系统 区域中的 P3 端口用 8 芯排芯连接到 点阵模块 区域中的 DC1-DC8 端口上 ; 4. 程序设计内容 (1). 数字 0-9 点阵显示代码的形成 如下图所示, 假设显示数字 E E 00 因此, 形成的列代码为 00H,00H,3EH,41H,41H,3EH,00H,00H; 只要把这些代码分别送到相应的列线上面, 即可实现 0 的数字显示 送显示代码过程如下所示 送第一列线代码到 P3 端口, 同时置第一行线为 0, 其它行线为 1, 延时 2ms 左右, 送第二列线代码到 P3 端口, 同时置第二行线为 0, 其它行线为 1, 延时 2ms 左右, 如此下去, 直到送完最后一列代码, 又从头开始送 数字 1 代码建立如下图所示 其显示代码为 00H,00H,00H,00H,21H,7FH,01H,00H

129 数字 2 代码建立如下图所示 H,00H,27H,45H,45H,45H,39H,00H 数字 3 代码建立如下图所示 H,00H,22H,49H,49H,49H,36H,00H 数字 4 代码建立如下图所示 H,00H,0CH,14H,24H,7FH,04H,00H

130 数字 5 代码建立如下图所示 H,00H,72H,51H,51H,51H,4EH,00H 数字 6 代码建立如下图所示 H,00H,3EH,49H,49H,49H,26H,00H 数字 7 代码建立如下图所示 H,00H,40H,40H,40H,4FH,70H,00H

131 数字 8 代码建立如下图所示 H,00H,36H,49H,49H,49H,36H,00H 数字 9 代码建立如下图所示 H,00H,32H,49H,49H,49H,3EH,00H 5. 汇编源程序 TIM EQU 30H CNTA EQU 31H CNTB EQU 32H ORG 00H LJMP START ORG 0BH LJMP T0X ORG 30H START: MOV TIM,#00H MOV CNTA,#00H MOV CNTB,#00H MOV TMOD,#01H

132 MOV TH0,#( )/256 MOV TL0,#( ) MOD 256 SETB TR0 SETB ET0 SETB EA SJMP $ T0X: MOV TH0,#( )/256 MOV TL0,#( ) MOD 256 MOV DPTR,#TAB MOV A,CNTA MOVC A,@A+DPTR MOV P3,A MOV DPTR,#DIGIT MOV A,CNTB MOV B,#8 MUL AB ADD A,CNTA MOVC A,@A+DPTR MOV P1,A INC CNTA MOV A,CNTA CJNE A,#8,NEXT MOV CNTA,#00H NEXT: INC TIM MOV A,TIM CJNE A,#250,NEX MOV TIM,#00H INC CNTB MOV A,CNTB CJNE A,#10,NEX MOV CNTB,#00H NEX: RETI TAB: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH DIGIT: DB 00H,00H,3EH,41H,41H,41H,3EH,00H DB 00H,00H,00H,00H,21H,7FH,01H,00H DB 00H,00H,27H,45H,45H,45H,39H,00H DB 00H,00H,22H,49H,49H,49H,36H,00H DB 00H,00H,0CH,14H,24H,7FH,04H,00H DB 00H,00H,72H,51H,51H,51H,4EH,00H DB 00H,00H,3EH,49H,49H,49H,26H,00H DB 00H,00H,40H,40H,40H,4FH,70H,00H

133 DB 00H,00H,36H,49H,49H,49H,36H,00H DB 00H,00H,32H,49H,49H,49H,3EH,00H END 6. C 语言源程序 #include <AT89X52.H> unsigned char code tab[]=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f; unsigned char code digittab[10][8]= 0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00, //0 0x00,0x00,0x00,0x00,0x21,0x7f,0x01,0x00, //1 0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00, //2 0x00,0x00,0x22,0x49,0x49,0x49,0x36,0x00, //3 0x00,0x00,0x0c,0x14,0x24,0x7f,0x04,0x00, //4 0x00,0x00,0x72,0x51,0x51,0x51,0x4e,0x00, //5 0x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00, //6 0x00,0x00,0x40,0x40,0x40,0x4f,0x70,0x00, //7 0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00, //8 0x00,0x00,0x32,0x49,0x49,0x49,0x3e,0x00 //9 ; unsigned int timecount; unsigned char cnta; unsigned char cntb; void main(void) TMOD=0x01; TH0=( )/256; TL0=( )%256; TR0=1; ET0=1; EA=1; while(1) ; void t0(void) interrupt 1 using 0 TH0=( )/256; TL0=( )%256; P3=tab[cnta]; P1=digittab[cntb][cnta]; cnta++;

134 if(cnta==8) cnta=0; timecount++; if(timecount==333) timecount=0; cntb++; if(cntb==10) cntb=0; 26. 点阵式 LED 简单图形显示技术 1. 实验任务 在 8X8 点阵式 LED 显示 和心形图, 通过按键来选择要显示的图形 2. 电路原理图

135 图 硬件系统连线 (1). 把 单片机系统 区域中的 P1 端口用 8 芯排芯连接到 点阵模块 区域中的 DR1-DR8 端口上 ; (2). 把 单片机系统 区域中的 P3 端口用 8 芯排芯连接到 点阵模块 区域中的 DC1-DC8 端口上 ; (3). 把 单片机系统 区域中的 P2.0/A8 端子用导线连接到 独立式键盘 区域中的 SP1 端子上 ; 4. 程序设计内容 (1). 在 8X8LED 点阵上显示图如下图所示

136 H,14H,3CH,48H,3CH,14H,12H,00H (2). 在 8X8LED 点阵上显示图如下图所示 H,00H,38H,44H,44H,44H,38H,00H (3). 心形图在 8X8LED 点阵上显示图如下图所示 H,48H,44H,22H,44H,48H,30H,00H

137 5. 汇编源程序 CNTA EQU 30H COUNT EQU 31H ORG 00H LJMP START ORG 0BH LJMP T0X ORG 30H START: MOV CNTA,#00H MOV COUNT,#00H MOV TMOD,#01H MOV TH0,#( ) / 256 MOV TL0,#( ) MOD 256 SETB TR0 SETB ET0 SETB EA WT: JB P2.0,WT MOV R6,#5 MOV R7,#248 D1: DJNZ R7,$ DJNZ R6,D1 JB P2.0,WT INC COUNT MOV A,COUNT CJNE A,#03H,NEXT MOV COUNT,#00H NEXT: JNB P2.0,$ SJMP WT T0X: NOP MOV TH0,#( ) / 256 MOV TL0,#( ) MOD 256 MOV DPTR,#TAB MOV A,CNTA MOVC A,@A+DPTR MOV P3,A MOV DPTR,#GRAPH MOV A,COUNT MOV B,#8 MUL AB ADD A,CNTA MOVC A,@A+DPTR MOV P1,A

138 INC CNTA MOV A,CNTA CJNE A,#8,NEX MOV CNTA,#00H NEX: RETI TAB: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH GRAPH: DB 12H,14H,3CH,48H,3CH,14H,12H,00H DB 00H,00H,38H,44H,44H,44H,38H,00H DB 30H,48H,44H,22H,44H,48H,30H,00H END 6. C 语言源程序 #include <AT89X52.H> unsigned char code tab[]=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f; unsigned char code graph[3][8]=0x12,0x14,0x3c,0x48,0x3c,0x14,0x12,0x00, 0x00,0x00,0x38,0x44,0x44,0x44,0x38,0x00, 0x30,0x48,0x44,0x22,0x44,0x48,0x30,0x00 ; unsigned char count; unsigned char cnta; void main(void) unsigned char i,j; TMOD=0x01; TH0=( )/256; TL0=( )%256; TR0=1; ET0=1; EA=1; while(1) if(p2_0==0) for(i=5;i>0;i--) for(j=248;j>0;j--); if(p2_0==0) count++;

139 if(count==3) count=0; while(p2_0==0); void t0(void) interrupt 1 using 0 TH0=( )/256; TL0=( )%256; P3=tab[cnta]; P1=graph[count][cnta]; cnta++; if(cnta==8) cnta=0; 1. 基本知识 27. ADC0809A/D 转换器基本应用技术 ADC0809 是带有 8 位 A/D 转换器 8 路多路开关以及微处理机兼容的控制逻辑的 CMOS 组件 它是逐次逼近式 A/D 转换器, 可以和单片机直接接口 (1). ADC0809 的内部逻辑结构

140 由上图可知,ADC0809 由一个 8 路模拟开关 一个地址锁存与译码器 一个 A/D 转换器和一个三态输出锁存器组成 多路开关可选通 8 个模拟通道, 允许 8 路模拟量分时输入, 共用 A/D 转换器进行转换 三态输出锁器用于锁存 A/D 转换完的数字量, 当 OE 端为高电平时, 才可以从三态输出锁存器取走转换完的数据 (2). 引脚结构 IN0-IN7:8 条模拟量输入通道 ADC0809 对输入模拟量要求 : 信号单极性, 电压范围是 0-5V, 若信号太小, 必须进行放大 ; 输入的模拟量在转换过程中应该保持不变, 如若模拟量变化太快, 则需在输入前增加采样保持电路 地址输入和控制线 :4 条 ALE 为地址锁存允许输入线, 高电平有效 当 ALE 线为高电平时, 地址锁存与译码器将 A,B,C 三条地址线的地址信号进行锁存, 经译码后被选中的通道的模拟量进转换器进行转换 A,B 和 C 为地址输入线, 用于选通 IN0-IN7 上的一路模拟量输入 通道选择表如下表所示 C B A 选择的通道 IN IN IN IN IN IN IN6

141 1 1 1 IN7 数字量输出及控制线 :11 条 ST 为转换启动信号 当 ST 上跳沿时, 所有内部寄存器清零 ; 下跳沿时, 开始进行 A/D 转换 ; 在转换期间,ST 应保持低电平 EOC 为转换结束信号 当 EOC 为高电平时, 表明转换结束 ; 否则, 表明正在进行 A/D 转换 OE 为输出允许信号, 用于控制三条输出锁存器向单片机输出转换得到的数据 OE=1, 输出转换得到的数据 ;OE=0, 输出数据线呈高阻状态 D7-D0 为数字量输出线 CLK 为时钟输入信号线 因 ADC0809 的内部没有时钟电路, 所需时钟信号必须由外界提供, 通常使用频率为 500KHZ, VREF(+),VREF(-) 为参考电压输入 2. ADC0809 应用说明 (1). ADC0809 内部带有输出锁存器, 可以与 AT89S51 单片机直接相连 (2). 初始化时, 使 ST 和 OE 信号全为低电平 (3). 送要转换的哪一通道的地址到 A,B,C 端口上 (4). 在 ST 端给出一个至少有 100ns 宽的正脉冲信号 (5). 是否转换完毕, 我们根据 EOC 信号来判断 (6). 当 EOC 变为高电平时, 这时给 OE 为高电平, 转换的数据就输出给单片机了 3. 实验任务 如下图所示, 从 ADC0809 的通道 IN3 输入 0-5V 之间的模拟量, 通过 ADC0809 转换成数字量在数码管上以十进制形成显示出来 ADC0809 的 VREF 接 +5V 电压 4. 电路原理图

142 图 系统板上硬件连线 (1). 把 单片机系统板 区域中的 P1 端口的 P1.0-P1.7 用 8 芯排线连接到 动态数码显示 区域中的 A B C D E F G H 端口上, 作为数码管的笔段驱动 (2). 把 单片机系统板 区域中的 P2 端口的 P2.0-P2.7 用 8 芯排线连接到 动态数码显示 区域中的 S1 S2 S3 S4 S5 S6 S7 S8 端口上, 作为数码管的位段选择 (3). 把 单片机系统板 区域中的 P0 端口的 P0.0-P0.7 用 8 芯排线连接到 模数转换模块 区域中的 D0D1D2D3D4D5D6D7 端口上,A/D 转换完毕的数据输入到单片机的 P0 端口 (4). 把 模数转换模块 区域中的 VREF 端子用导线连接到 电源模块 区域中的 VCC 端子上 ; (5). 把 模数转换模块 区域中的 A2A1A0 端子用导线连接到 单片机系统 区域中的 P3.4 P3.5 P3.6 端子上 ; (6). 把 模数转换模块 区域中的 ST 端子用导线连接到 单片机系统 区域中的 P3.0 端子上 ;

143 (7). 把 模数转换模块 区域中的 OE 端子用导线连接到 单片机系统 区域中的 P3.1 端子上 ; (8). 把 模数转换模块 区域中的 EOC 端子用导线连接到 单片机系统 区域中的 P3.2 端子上 ; (9). 把 模数转换模块 区域中的 CLK 端子用导线连接到 分频模块 区域中的 /4 端子上 ; (10). 把 分频模块 区域中的 CK IN 端子用导线连接到 单片机系统 区域中的 ALE 端子上 ; (11). 把 模数转换模块 区域中的 IN3 端子用导线连接到 三路可调压模块 区域中的 VR1 端子上 ; 6. 程序设计内容 7. 汇编源程序 CH EQU 30H DPCNT EQU 31H DPBUF EQU 33H GDATA EQU 32H ST BIT P3.0 OE BIT P3.1 EOC BIT P3.2 (1). 进行 A/D 转换时, 采用查询 EOC 的标志信号来检测 A/D 转换是否完毕, 若完毕则把数据通过 P0 端口读入, 经过数据处理之后在数码管上显示 (2). 进行 A/D 转换之前, 要启动转换的方法 : ORG 00H LJMP START ORG 0BH LJMP T0X ORG 30H START: MOV CH,#0BCH MOV DPCNT,#00H MOV R1,#DPCNT MOV R7,#5 ABC=110 选择第三通道 ST=0,ST=1,ST=0 产生启动转换的正脉冲信号

144 MOV A,#10 MOV R0,#DPBUF LOP: INC R0 DJNZ R7,LOP INC R0 INC R0 MOV TMOD,#01H MOV TH0,#( )/256 MOV TL0,#( ) MOD 256 SETB TR0 SETB ET0 SETB EA WT: CLR ST SETB ST CLR ST WAIT: JNB EOC,WAIT SETB OE MOV GDATA,P0 CLR OE MOV A,GDATA MOV B,#100 DIV AB MOV 33H,A MOV A,B MOV B,#10 DIV AB MOV 34H,A MOV 35H,B SJMP WT T0X: NOP MOV TH0,#( )/256 MOV TL0,#( ) MOD 256 MOV DPTR,#DPCD MOV A,DPCNT ADD A,#DPBUF MOV R0,A MOV MOVC MOV P1,A MOV DPTR,#DPBT

145 MOV A,DPCNT MOVC MOV P2,A INC DPCNT MOV A,DPCNT CJNE A,#8,NEXT MOV DPCNT,#00H NEXT: RETI DPCD: DB 3FH,06H,5BH,4FH,66H DB 6DH,7DH,07H,7FH,6FH,00H DPBT: DB 0FEH,0FDH,0FBH,0F7H DB 0EFH,0DFH,0BFH,07FH END 8. C 语言源程序 #include <AT89X52.H> unsigned char code dispbitcode[]=0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f; unsigned char code dispcode[]=0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x00; unsigned char dispbuf[8]=10,10,10,10,10,0,0,0; unsigned char dispcount; sbit ST=P3^0; sbit OE=P3^1; sbit EOC=P3^2; unsigned char channel=0xbc;//in3 unsigned char getdata; void main(void) TMOD=0x01; TH0=( )/256; TL0=( )%256; TR0=1; ET0=1; EA=1; P3=channel; while(1) ST=0; ST=1;

146 ST=0; while(eoc==0); OE=1; getdata=p0; OE=0; dispbuf[2]=getdata/100; getdata=getdata%10; dispbuf[1]=getdata/10; dispbuf[0]=getdata%10; void t0(void) interrupt 1 using 0 TH0=( )/256; TL0=( )%256; P1=dispcode[dispbuf[dispcount]]; P2=dispbitcode[dispcount]; dispcount++; if(dispcount==8) dispcount=0; 1. 实验任务 28. 数字电压表 利用单片机 AT89S51 与 ADC0809 设计一个数字电压表, 能够测量 0-5V 之间的直流电压值, 四位数码显示, 但要求使用的元器件数目最少 2. 电路原理图

147 图 系统板上硬件连线 a) 把 单片机系统 区域中的 P1.0-P1.7 与 动态数码显示 区域中的 ABCDEFGH 端口用 8 芯排线连接 b) 把 单片机系统 区域中的 P2.0-P2.7 与 动态数码显示 区域中的 S1S2S3S4S5S6S7S8 端口用 8 芯排线连接 c) 把 单片机系统 区域中的 P3.0 与 模数转换模块 区域中的 ST 端子用导线相连接 d) 把 单片机系统 区域中的 P3.1 与 模数转换模块 区域中的 OE 端子用导线相连接 e) 把 单片机系统 区域中的 P3.2 与 模数转换模块 区域中的 EOC 端子用导线相连接

148 f) 把 单片机系统 区域中的 P3.3 与 模数转换模块 区域中的 CLK 端子用导线相连接 g) 把 模数转换模块 区域中的 A2A1A0 端子用导线连接到 电源模块 区域中的 GND 端子上 h) 把 模数转换模块 区域中的 IN0 端子用导线连接到 三路可调电压模块 区域中的 VR1 端子上 i) 把 单片机系统 区域中的 P0.0-P0.7 用 8 芯排线连接到 模数转换模块 区域中的 D0D1D2D3D4D5D6D7 端子上 4. 程序设计内容 i. 由于 ADC0809 在进行 A/D 转换时需要有 CLK 信号, 而此时的 ADC0809 的 CLK 是接在 AT89S51 单片机的 P3.3 端口上, 也就是要求从 P3.3 输出 CLK 信号供 ADC0809 使用 因此产生 CLK 信号的方法就得用软件来产生了 ii. 由于 ADC0809 的参考电压 VREF=VCC, 所以转换之后的数据要经过数据处理, 在数码管上显示出电压值 实际显示的电压值 (D/256*VREF) 5. 汇编源程序 ( 略 ) 6. C 语言源程序 #include <AT89X52.H> unsigned char code dispbitcode[]=0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f; unsigned char code dispcode[]=0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x00; unsigned char dispbuf[8]=10,10,10,10,0,0,0,0; unsigned char dispcount; unsigned char getdata; unsigned int temp; unsigned char i; sbit ST=P3^0; sbit OE=P3^1; sbit EOC=P3^2; sbit CLK=P3^3; void main(void)

149 ST=0; OE=0; ET0=1; ET1=1; EA=1; TMOD=0x12; TH0=216; TL0=216; TH1=( )/256; TL1=( )%256; TR1=1; TR0=1; ST=1; ST=0; while(1) if(eoc==1) OE=1; getdata=p0; OE=0; temp=getdata*235; temp=temp/128; i=5; dispbuf[0]=10; dispbuf[1]=10; dispbuf[2]=10; dispbuf[3]=10; dispbuf[4]=10; dispbuf[5]=0; dispbuf[6]=0; dispbuf[7]=0; while(temp/10) dispbuf[i]=temp%10; temp=temp/10; i++; dispbuf[i]=temp; ST=1; ST=0;

150 void t0(void) interrupt 1 using 0 CLK=~CLK; void t1(void) interrupt 3 using 0 TH1=( )/256; TL1=( )%256; P1=dispcode[dispbuf[dispcount]]; P2=dispbitcode[dispcount]; if(dispcount==7) P1=P1 0x80; dispcount++; if(dispcount==8) dispcount=0; 1. 实验任务 29. 两点间温度控制 用可调电阻调节电压值作为模拟温度的输入量, 当温度低于 30 时, 发出长嘀报警声和光报警, 当温度高于 60 时, 发出短嘀报警声和光报警 测量的温度范围在 电路原理图

151 图 系统板上硬件连线 a) 把 单片机系统 区域中的 P1.0-P1.7 与 动态数码显示 区域中的 ABCDEFGH 端口用 8 芯排线连接 b) 把 单片机系统 区域中的 P2.0-P2.7 与 动态数码显示 区域中的 S1S2S3S4S5S6S7S8 端口用 8 芯排线连接 c) 把 单片机系统 区域中的 P3.0 与 模数转换模块 区域中的 ST 端子用导线相连接

152 d) 把 单片机系统 区域中的 P3.1 与 模数转换模块 区域中的 OE 端子用导线相连接 e) 把 单片机系统 区域中的 P3.2 与 模数转换模块 区域中的 EOC 端子用导线相连接 f) 把 单片机系统 区域中的 P3.3 与 模数转换模块 区域中的 CLK 端子用导线相连接 g) 把 模数转换模块 区域中的 A2A1A0 端子用导线连接到 电源模块 区域中的 GND 端子上 h) 把 模数转换模块 区域中的 IN0 端子用导线连接到 三路可调电压模块 区域中的 VR1 端子上 i) 把 单片机系统 区域中的 P0.0-P0.7 用 8 芯排线连接到 模数转换模块 区域中的 D0D1D2D3D4D5D6D7 端子上 j) 把 单片机系统 区域中的 P3.6 P3.7 用导线分别连接到 八路发光二极管指示模块 区域中的 L1 L2 上 k) 把 单片机系统 区域中的 P3.5 用导线连接到 音频放大模块 区域中的 SPK IN 端口上 l) 把 音频放大模块 区域中的 SPK OUT 插入音频喇叭 4. 汇编源程序 ( 略 ) 5.C 语言源程序 #include <AT89X52.H> unsigned char code dispbitcode[]=0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f; unsigned char code dispcode[]=0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x00; unsigned char dispbuf[8]=10,10,10,10,10,10,0,0; unsigned char dispcount; unsigned char getdata; unsigned int temp; unsigned char i; sbit ST=P3^0; sbit OE=P3^1; sbit EOC=P3^2; sbit CLK=P3^3;

153 sbit LED1=P3^6; sbit LED2=P3^7; sbit SPK=P3^5; bit lowflag; bit highflag; unsigned int cnta; unsigned int cntb; bit alarmflag; void main(void) ST=0; OE=0; TMOD=0x12; TH0=0x216; TL0=0x216; TH1=( )/256; TL1=( )%256; TR1=1; TR0=1; ET0=1; ET1=1; EA=1; ST=1; ST=0; while(1) if((lowflag==1) &&(highflag==0)) LED1=0; LED2=1; else if((highflag==1) && (lowflag==0)) LED1=1; LED2=0; else LED1=1; LED2=1;

154 void t0(void) interrupt 1 using 0 CLK=~CLK; void t1(void) interrupt 3 using 0 TH1=( )/256; TL1=( )%256; if(eoc==1) OE=1; getdata=p0; OE=0; temp=getdata*25; temp=temp/64; i=6; dispbuf[0]=10; dispbuf[1]=10; dispbuf[2]=10; dispbuf[3]=10; dispbuf[4]=10; dispbuf[5]=10; dispbuf[6]=0; dispbuf[7]=0; while(temp/10) dispbuf[i]=temp%10; temp=temp/10; i++; dispbuf[i]=temp; if(getdata<77) lowflag=1; highflag=0; else if(getdata>153) lowflag=0;

155 highflag=1; else lowflag=0; highflag=0; ST=1; ST=0; P1=dispcode[dispbuf[dispcount]]; P2=dispbitcode[dispcount]; dispcount++; if(dispcount==8) dispcount=0; if((lowflag==1) && (highflag==0)) cnta++; if(cnta==800) cnta=0; alarmflag=~alarmflag; if(alarmflag==1) SPK=~SPK; else if((lowflag==0) && (highflag==1)) cntb++; if(cntb==400) cntb=0; alarmflag=~alarmflag; if(alarmflag==1) SPK=~SPK;

156 else alarmflag=0; cnta=0; cntb=0; 1. 温度传感器 AD590 基本知识 30. 四位数数字温度计 AD590 产生的电流与绝对温度成正比, 它可接收的工作电压为 4V-30V, 检测的温度范围为 , 它有非常好的线性输出性能, 温度每增加 1, 其电流增加 1uA AD590 温度与电流的关系如下表所示 摄氏温度 AD590 电流 经 10KΩ 电压 ua 2.732V ua V ua V ua V ua V ua V ua V ua V AD590 引脚图 2. 实验任务 利用 AD590 温度传感器完成温度的测量, 把转换的温度值的模拟量送入 ADC0809 的其中一个通道进行 A/D 转换, 将转换的结果进行温度值变换之后送入数码管显示 3. 电路原理图

157 图 系统板上硬件连线 (1). 把 单片机系统 区域中的 P1.0-P1.7 与 动态数码显示 区域中的 ABCDEFGH 端口用 8 芯排线连接 (2). 把 单片机系统 区域中的 P2.0-P2.7 与 动态数码显示 区域中的 S1S2S3S4S5S6S7S8 端口用 8 芯排线连接 (3). 把 单片机系统 区域中的 P3.0 与 模数转换模块 区域中的 ST 端子用导线相连接 (4). 把 单片机系统 区域中的 P3.1 与 模数转换模块 区域中的 OE 端子用导线相连接 (5). 把 单片机系统 区域中的 P3.2 与 模数转换模块 区域中的 EOC 端子用导线相连接

158 (6). 把 单片机系统 区域中的 P3.3 与 模数转换模块 区域中的 CLK 端子用导线相连接 (7). 把 模数转换模块 区域中的 A2A1A0 端子用导线连接到 电源模块 区域中的 GND 端子上 (8). 把 模数转换模块 区域中的 IN0 端子用导线连接到自制的 AD590 电路上 (9). 把 单片机系统 区域中的 P0.0-P0.7 用 8 芯排线连接到 模数转换模块 区域中的 D0D1D2D3D4D5D6D7 端子上 5. 程序设计内容 (1). ADC0809 的 CLK 信号由单片机的 P3.3 管脚提供 (2). 由于 AD590 的温度变化范围在 之间, 经过 10KΩ 之后采样到的电压变化在 2.182V-4.232V 之间, 不超过 5V 电压所表示的范围, 因此参考电压取电源电压 VCC,( 实测 VCC=4.70V) 由此可计算出经过 A/D 转换之后的摄氏温度显示的数据为 : 如果 (D*2350/128)<2732, 则显示的温度值为 -(2732- (D*2350/128)) 如果 (D*2350/128) 2732, 则显示的温度值为 +((D*2350/128) -2732) 6. 汇编源程序 ( 略 ) 7.C 语言源程序 #include <AT89X52.H> #include <ctype.h> unsigned char code dispbitcode[]=0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f; unsigned char code dispcode[]=0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40; unsigned char dispbuf[8]=10,10,10,10,10,10,0,0; unsigned char dispcount; unsigned char getdata; unsigned long temp; unsigned char i; bit sflag; sbit ST=P3^0;

159 sbit OE=P3^1; sbit EOC=P3^2; sbit CLK=P3^3; sbit LED1=P3^6; sbit LED2=P3^7; sbit SPK=P3^5; void main(void) ST=0; OE=0; TMOD=0x12; TH0=0x216; TL0=0x216; TH1=( )/256; TL1=( )%256; TR1=1; TR0=1; ET0=1; ET1=1; EA=1; ST=1; ST=0; getdata=148; while(1) ; void t0(void) interrupt 1 using 0 CLK=~CLK; void t1(void) interrupt 3 using 0 TH1=( )/256; TL1=( )%256; if(eoc==1)

160 OE=1; getdata=p0; OE=0; temp=(getdata*2350); temp=temp/128; if(temp<2732) temp=2732-temp; sflag=1; else temp=temp-2732; sflag=0; i=3; dispbuf[0]=10; dispbuf[1]=10; dispbuf[2]=10; if(sflag==1) dispbuf[7]=11; else dispbuf[7]=10; dispbuf[3]=0; dispbuf[4]=0; dispbuf[5]=0; dispbuf[6]=0; while(temp/10) dispbuf[i]=temp%10; temp=temp/10; i++; dispbuf[i]=temp; ST=1; ST=0; P1=dispcode[dispbuf[dispcount]]; P2=dispbitcode[dispcount];

161 dispcount++; if(dispcount==8) dispcount=0; 位数显频率计数器 1. 实验任务 利用 AT89S51 单片机的 T0 T1 的定时计数器功能, 来完成对输入的信号进行频率计数, 计数的频率结果通过 8 位动态数码管显示出来 要求能够对 0-250KHZ 的信号频率进行准确计数, 计数误差不超过 ±1HZ 2. 电路原理图 图

162 3. 系统板上硬件连线 (1). 把 单片机系统 区域中的 P0.0-P0.7 与 动态数码显示 区域中的 ABCDEFGH 端口用 8 芯排线连接 (2). 把 单片机系统 区域中的 P2.0-P2.7 与 动态数码显示 区域中的 S1S2S3S4S5S6S7S8 端口用 8 芯排线连接 (3). 把 单片机系统 区域中的 P3.4(T0) 端子用导线连接到 频率产生器 区域中的 WAVE 端子上 4. 程序设计内容 (1). 定时 / 计数器 T0 和 T1 的工作方式设置, 由图可知,T0 是工作在计数状态下, 对输入的频率信号进行计数, 但对工作在计数状态下的 T0, 最大计数值为 fosc/24, 由于 fosc=12mhz, 因此 :T0 的最大计数频率为 250KHz 对于频率的概念就是在一秒只数脉冲的个数, 即为频率值 所以 T1 工作在定时状态下, 每定时 1 秒中到, 就停止 T0 的计数, 而从 T0 的计数单元中读取计数的数值, 然后进行数据处理 送到数码管显示出来 (2). T1 工作在定时状态下, 最大定时时间为 65ms, 达不到 1 秒的定时, 所以采用定时 50ms, 共定时 20 次, 即可完成 1 秒的定时功能 5. C 语言源程序 #include <AT89X52.H> unsigned char code dispbit[]=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f; unsigned char code dispcode[]=0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40; unsigned char dispbuf[8]=0,0,0,0,0,0,10,10; unsigned char temp[8]; unsigned char dispcount; unsigned char T0count; unsigned char timecount; bit flag; unsigned long x; void main(void) unsigned char i; TMOD=0x15; TH0=0; TL0=0; TH1=( )/256;

163 TL1=( )%256; TR1=1; TR0=1; ET0=1; ET1=1; EA=1; while(1) if(flag==1) flag=0; x=t0count*65536+th0*256+tl0; for(i=0;i<8;i++) temp[i]=0; i=0; while(x/10) temp[i]=x%10; x=x/10; i++; temp[i]=x; for(i=0;i<6;i++) dispbuf[i]=temp[i]; timecount=0; T0count=0; TH0=0; TL0=0; TR0=1; void t0(void) interrupt 1 using 0 T0count++; void t1(void) interrupt 3 using 0

164 TH1=( )/256; TL1=( )%256; timecount++; if(timecount==250) TR0=0; timecount=0; flag=1; P0=dispcode[dispbuf[dispcount]]; P2=dispbit[dispcount]; dispcount++; if(dispcount==8) dispcount=0; 1. 实验任务 32. 电子密码锁设计 根据设定好的密码, 采用二个按键实现密码的输入功能, 当密码输入正确之后, 锁就打开, 如果输入的三次的密码不正确, 就锁定按键 3 秒钟, 同时发现报警声, 直到没有按键按下 3 种后, 才打开按键锁定功能 ; 否则在 3 秒钟内仍有按键按下, 就重新锁定按键 3 秒时间并报警 2. 电路原理图

165 图 系统板上硬件连线 (1). 把 单片机系统 区域中的 P0.0/AD0 用导线连接到 音频放大模块 区域中的 SPK IN 端子上 ; (2). 把 音频放大模块 区域中的 SPK OUT 端子接喇叭和 ; (3). 把 单片机系统 区域中的 P2.0/A8-P2.7/A15 用 8 芯排线连接到 四路静态数码显示 区域中的任一个 ABCDEFGH 端子上 ; (4). 把 单片机系统 区域中的 P1.0 用导线连接到 八路发光二极管模块 区域中的 L1 端子上 ; (5). 把 单片机系统 区域中的 P3.6/WR P3.7/RD 用导线连接到 独立式键盘 区域中的 SP1 和 SP2 端子上 ; 4. 程序设计内容 (1). 密码的设定, 在此程序中密码是固定在程序存储器 ROM 中, 假设预设的密码为 共 5 位密码 (2). 密码的输入问题 :

166 由于采用两个按键来完成密码的输入, 那么其中一个按键为功能键, 另一个按键为数字键 在输入过程中, 首先输入密码的长度, 接着根据密码的长度输入密码的位数, 直到所有长度的密码都已经输入完毕 ; 或者输入确认功能键之后, 才能完成密码的输入过程 进入密码的判断比较处理状态并给出相应的处理过程 (3). 按键禁止功能 : 初始化时, 是允许按键输入密码, 当有按键按下并开始进入按键识别状态时, 按键禁止功能被激活, 但启动的状态在 3 次密码输入不正确的情况下发生的 5.C 语言源程序 #include <AT89X52.H> unsigned char code ps[]=1,2,3,4,5; unsigned char code dispcode[]=0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40; unsigned char pslen=9; unsigned char templen; unsigned char digit; unsigned char funcount; unsigned char digitcount; unsigned char psbuf[9]; bit cmpflag; bit hibitflag; bit errorflag; bit rightflag; unsigned int second3; unsigned int aa; unsigned int bb; bit alarmflag; bit exchangeflag; unsigned int cc; unsigned int dd; bit okflag; unsigned char oka; unsigned char okb; void main(void) unsigned char i,j; P2=dispcode[digitcount]; TMOD=0x01; TH0=( )/256; TL0=( )%256;

167 TR0=1; ET0=1; EA=1; while(1) if(cmpflag==0) if(p3_6==0) //function key for(i=10;i>0;i--) for(j=248;j>0;j--); if(p3_6==0) if(hibitflag==0) funcount++; if(funcount==pslen+2) funcount=0; cmpflag=1; P1=dispcode[funcount]; else second3=0; while(p3_6==0); if(p3_7==0) //digit key for(i=10;i>0;i--) for(j=248;j>0;j--); if(p3_7==0) if(hibitflag==0) digitcount++; if(digitcount==10) digitcount=0;

168 P2=dispcode[digitcount]; if(funcount==1) pslen=digitcount; templen=pslen; else if(funcount>1) psbuf[funcount-2]=digitcount; else second3=0; while(p3_7==0); else cmpflag=0; for(i=0;i<pslen;i++) if(ps[i]!=psbuf[i]) hibitflag=1; i=pslen; errorflag=1; rightflag=0; cmpflag=0; second3=0; goto a; cc=0; errorflag=0; rightflag=1; hibitflag=0; a: cmpflag=0;

169 void t0(void) interrupt 1 using 0 TH0=( )/256; TL0=( )%256; if((errorflag==1) && (rightflag==0)) bb++; if(bb==800) bb=0; alarmflag=~alarmflag; if(alarmflag==1) P0_0=~P0_0; aa++; if(aa==800) aa=0; P0_1=~P0_1; second3++; if(second3==6400) second3=0; hibitflag=0; errorflag=0; rightflag=0; cmpflag=0; P0_1=1; alarmflag=0; bb=0; aa=0; if((errorflag==0) && (rightflag==1)) P0_1=0; cc++;

170 if(cc<1000) okflag=1; else if(cc<2000) okflag=0; else errorflag=0; rightflag=0; hibitflag=0; cmpflag=0; P0_1=1; cc=0; oka=0; okb=0; okflag=0; P0_0=1; if(okflag==1) oka++; if(oka==2) oka=0; P0_0=~P0_0; else okb++; if(okb==3) okb=0; P0_0=~P0_0; 键盘及 8 位数码管显示构成的电子密码锁

171 1. 实验任务 用 4 4 组成 0-9 数字键及确认键 用 8 位数码管组成显示电路提示信息, 当输入密码时, 只显示 8., 当密码位数输入完毕按下确认键时, 对输入的密码与设定的密码进行比较, 若密码正确, 则门开, 此处用 LED 发光二极管亮一秒钟做为提示, 同时发出 叮咚 声 ; 若密码不正确, 禁止按键输入 3 秒, 同时发出 嘀 嘀 报警声 ; 若在 3 秒之内仍有按键按下, 则禁止按键输入 3 秒被重新禁止 2. 电路原理图 3. 系统板上硬件连线 图 (1). 把 单片机系统 区域中的 P0.0-P0.7 用 8 芯排线连接到 动态数码显示 区域中的 ABCDEFGH 端子上

172 (2). 把 单片机系统 区域中的 P2.0-P2.7 用 8 芯排线连接到 动态数码显示 区域中的 S1S2S3S4S5S6S7S8 端子上 (3). 把 单片机系统 区域中的 P3.0-P3.7 用 8 芯排线连接到 4 4 行列式键盘 区域中的 R1R2R3R4C1C2C3C4 端子上 (4). 把 单片机系统 区域中的 P1.0 用导线连接到 八路发光二极管模块 区域中的 L2 端子上 (5). 把 单片机系统 区域中的 P1.7 用导线连接到 音频放大模块 区域中的 SPK IN 端子上 (6). 把 音频放大模块 区域中的 SPK OUT 接到喇叭上 4. 程序设计内容 (1). 4 4 行列式键盘识别技术 : 有关这方面内容前面已经讨论过, 这里不再重复 (2). 8 位数码显示, 初始化时, 显示 P, 接着输入最大 6 位数的密码, 当密码输入完后, 按下确认键, 进行密码比较, 然后给出相应的信息 在输入密码过程中, 显示器只显示 8. 当数字输入超过 6 个时, 给出报警信息 在密码输入过程中, 若输入错误, 可以利用 DEL 键删除刚才输入的错误的数字 (3). 4 4 行列式键盘的按键功能分布图如图 所示 : 图 C 语言源程序 #include <AT89X52.H> unsigned char ps[]=1,2,3,4,5; unsigned char code dispbit[]=0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f;

173 unsigned char code dispcode[]=0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71, 0x00,0x40,0x73,0xff; unsigned char dispbuf[8]=18,16,16,16,16,16,16,16; unsigned char dispcount; unsigned char flashcount; unsigned char temp; unsigned char key; unsigned char keycount; unsigned char pslen=5; unsigned char getps[6]; bit keyoverflag; bit errorflag; bit rightflag; unsigned int second3; unsigned int aa,bb; unsigned int cc; bit okflag; bit alarmflag; bit hibitflag; unsigned char oka,okb; void main(void) unsigned char i,j; TMOD=0x01; TH0=( )/256; TL0=( )%256; TR0=1; ET0=1; EA=1; while(1) P3=0xff; P3_4=0; temp=p3; temp=temp & 0x0f; if (temp!=0x0f) for(i=10;i>0;i--) for(j=248;j>0;j--);

174 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_1=~P1_1; if((key>=0) && (key<10)) if(keycount<6) getps[keycount]=key; dispbuf[keycount+2]=19; keycount++; if(keycount==6) keycount=6; else if(keycount>6) keycount=6; keyoverflag=1;//key overflow else if(key==12)//delete key if(keycount>0)

175 keycount--; getps[keycount]=0; dispbuf[keycount+2]=16; else keyoverflag=1; else if(key==15)//enter key if(keycount!=pslen) errorflag=1; rightflag=0; second3=0; else for(i=0;i<keycount;i++) if(getps[i]!=ps[i]) i=keycount; errorflag=1; rightflag=0; second3=0; goto a; errorflag=0; rightflag=1; a: i=keycount; temp=temp & 0x0f; while(temp!=0x0f) temp=p3; temp=temp & 0x0f; keyoverflag=0;//?????????

176 P3=0xff; P3_5=0; temp=p3; temp=temp & 0x0f; if (temp!=0x0f) for(i=10;i>0;i--) for(j=248;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_1=~P1_1; if((key>=0) && (key<10)) if(keycount<6) getps[keycount]=key; dispbuf[keycount+2]=19; keycount++; if(keycount==6) keycount=6;

177 else if(keycount>6) keycount=6; keyoverflag=1;//key overflow else if(key==12)//delete key if(keycount>0) keycount--; getps[keycount]=0; dispbuf[keycount+2]=16; else keyoverflag=1; else if(key==15)//enter key if(keycount!=pslen) errorflag=1; rightflag=0; second3=0; else for(i=0;i<keycount;i++) if(getps[i]!=ps[i]) i=keycount; errorflag=1; rightflag=0; second3=0; goto a4; errorflag=0; rightflag=1; a4: i=keycount;

178 temp=temp & 0x0f; while(temp!=0x0f) temp=p3; temp=temp & 0x0f; keyoverflag=0;//????????? P3=0xff; P3_6=0; temp=p3; temp=temp & 0x0f; if (temp!=0x0f) for(i=10;i>0;i--) for(j=248;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_1=~P1_1; if((key>=0) && (key<10))

179 if(keycount<6) getps[keycount]=key; dispbuf[keycount+2]=19; keycount++; if(keycount==6) keycount=6; else if(keycount>6) keycount=6; keyoverflag=1;//key overflow else if(key==12)//delete key if(keycount>0) keycount--; getps[keycount]=0; dispbuf[keycount+2]=16; else keyoverflag=1; else if(key==15)//enter key if(keycount!=pslen) errorflag=1; rightflag=0; second3=0; else for(i=0;i<keycount;i++) if(getps[i]!=ps[i]) i=keycount;

180 errorflag=1; rightflag=0; second3=0; goto a3; errorflag=0; rightflag=1; a3: i=keycount; temp=temp & 0x0f; while(temp!=0x0f) temp=p3; temp=temp & 0x0f; keyoverflag=0;//????????? P3=0xff; P3_7=0; temp=p3; temp=temp & 0x0f; if (temp!=0x0f) for(i=10;i>0;i--) for(j=248;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:

181 key=14; break; case 0x07: key=15; break; temp=p3; P1_1=~P1_1; if((key>=0) && (key<10)) if(keycount<6) getps[keycount]=key; dispbuf[keycount+2]=19; keycount++; if(keycount==6) keycount=6; else if(keycount>6) keycount=6; keyoverflag=1;//key overflow else if(key==12)//delete key if(keycount>0) keycount--; getps[keycount]=0; dispbuf[keycount+2]=16; else keyoverflag=1; else if(key==15)//enter key if(keycount!=pslen) errorflag=1;

182 rightflag=0; second3=0; else for(i=0;i<keycount;i++) if(getps[i]!=ps[i]) i=keycount; errorflag=1; rightflag=0; second3=0; goto a2; errorflag=0; rightflag=1; a2: i=keycount; temp=temp & 0x0f; while(temp!=0x0f) temp=p3; temp=temp & 0x0f; keyoverflag=0;//????????? void t0(void) interrupt 1 using 0 TH0=( )/256; TL0=( )%256; flashcount++; if(flashcount==8) flashcount=0; P0=dispcode[dispbuf[dispcount]]; P2=dispbit[dispcount]; dispcount++;

183 if(dispcount==8) dispcount=0; if((errorflag==1) && (rightflag==0)) bb++; if(bb==800) bb=0; alarmflag=~alarmflag; if(alarmflag==1)//sound alarm signal P1_7=~P1_7; aa++; if(aa==800)//light alarm signal aa=0; P1_0=~P1_0; second3++; if(second3==6400) second3=0; errorflag=0; rightflag=0; alarmflag=0; bb=0; aa=0; else if((errorflag==0) && (rightflag==1)) P1_0=0; cc++; if(cc<1000) okflag=1;

184 else if(cc<2000) okflag=0; else errorflag=0; rightflag=0; P1_7=1; cc=0; oka=0; okb=0; okflag=0; P1_0=1; if(okflag==1) oka++; if(oka==2) oka=0; P1_7=~P1_7; else okb++; if(okb==3) okb=0; P1_7=~P1_7; if(keyoverflag==1) P1_7=~P1_7; 1. DS1624 基本原理 34. 带有存储器功能的数字温度计 -DS1624 技术应用

185 DS1624 是美国 DALLAS 公司生产的集成了测量系统和存储器于一体的芯片 数字接口电路简单, 与 I2C 总线兼容, 且可以使用一片控制器控制多达 8 片的 DS1624 其数字温度输出达 13 位, 精度为 DS1624 可工作在最低 2.7V 电压下, 适用于低功耗应用系统 (1). DS1624 基本特性 无需外围元件即可测量温度 测量范围为 -55 ~+125, 精度为 测量温度的结果以 13 位数字量 ( 两字节传输 ) 给出 测量温度的典型转换时间为 1 秒 集成了 256 字节的 E2PROM 非易性存储器 数据的读出和写入通过一个 2- 线 (I2C) 串行接口完成 采用 8 脚 DIP 或 SOIC 封装, 如图 图 (2). 引脚描述及功能方框图 其引脚描述如表 1 所示 : DS1624 的功能结构图如图 所示 :

186 图 (3). DS1624 工作原理 温度测量 图 是温度测量的原理结构图 图 温度测量的原理结构图 DS1624 在测量温度时使用了独有的在线温度测量技术 它通过在一个由对温度高度敏感的振荡器决定的计数周期内对温度低敏感的振荡器时钟脉冲的计数值的计算来测量温度 DS1624 在计数器中预置了一个初值, 它相当于 -55 如果计数周期结束之前计数器达到 0, 已预置了此初值的温度寄存器中的数字就会增加, 从而表明温度高于 -55 与此同时, 计数器斜坡累加电路被重新预置一个值, 然后计数器重新对时钟计数, 直到计数值为 0

187 通过改变增加的每 1 内的计数器的计数, 斜坡累加电路可以补偿振荡器的非线性误差, 以提高精度, 任意温度下计数器的值和每一斜坡累加电路的值对应的计数次数须为已知 DS1624 通过这些计算可以得到 的精度, 温度输出为 13 位, 在发出读温度值请求后还会输出两位补偿值 表 2 给出了所测的温度和输出数据的关系 这些数据可通过 2 线制串行口连续输出,MSB 在前,LSB 在后 表 2 温度与输出数据关系表 温度 数字量输出 ( 二进制 ) 数字量输出 ( 十六进制 ) ,1101,0000,0000 7D00H ,1001,0001, H ,0000,1000, H ,0000,0000, H ,1111,1000,0000 FF80H ,0110,1111,0000 E6F0H ,1001,0000,0000 C900H 由于数据在总线上传输时 MSB 在前, 所以 DS1624 读出的数据可以是一个字节 ( 分辨率为 1 ), 也可以是两个字节, 第二个字节包含的最低位为 表 2 是 13 位温度寄存器中存储温度值的数据格式 低八位字节 高八位字节 S B14 B13 B12 B11 B10 B9 B8 B7 B6 B5 B4 B 表 3 温度值的数据存储格式 其中 S- 为符号位, 当 S=0 时, 表示当前的测量的温度为正的温度 ; 当 S=1 时, 表示当前的测量的温度为负的温度 B14-B3 为当前测量的温度值 最低三位被设置为 0 DS1624 工作方式 DS1621 的工作方式是由片上的配置 / 状态寄存器来决定的, 如表 4, 该寄存器的定义如下 : 表 4 配置 / 状态寄存器格式 DONE SHOT

188 其中 DONE 为转换完成位, 温度转换结束时置 1, 正在进行转换时为 0;1SHOT 为温度转换模式选择 1SHOT 为 1 时为单次转换模式,DS1624 在收到启动温度转换命令 EEH 后进行一次温度转换 1SHOT 为 0 时为连续转换模式, 此时 DS1624 将连续进行温度转换, 并将最近一次的结果保存在温度寄存器中 该位为非易失性的 片内 256 字节存储器操作 控制器对 DS1624 的存储器编程有两种模式 : 一种是字节编程模式, 另一种是页编程模式 在字节编程模式中, 主控制器发送地址和一个字节的数据到 DS1624 在主器件发出开始 (START) 信号以后, 主器件发送写控制字节即 1001A2A1A00 ( 其中 R/W 控制位为低电平 0 ) 指示从接收器被寻址,DS1624 接收后应答, 再由主器件发送访问存储器指令 (17H) 后,DS1624 接收后应答, 接着由主器件发送的下一个字节字地址将被写入到 DS1624 的地址指针 主器件接收到来自 DS1624 的另一个确认信号以后, 发送数据字节, 并写入到寻址的存储地址 DS1624 再次发出确认信号, 同时主器件产生停止条件 STOP, 启动内部写周期 在内部写周期 DS1624 将不产生确认信号 在页编程模式中, 如同字节写方式, 先将控制字节 访问存储器指令 (17H) 字地址发送到 DS1624, 接着发 N 个数据字节, 其中以 8 个字节为一个页面 主器件发送不多于一个页面字节的数据字节到 DS1624, 这些数据字节暂存在片内页面缓存器中, 在主器件发送停止信号以后写入到存储器 接收每一个字节以后, 低位顺序地址指针在内部加 1 高位顺序字地址保持为常数 如果主器件在产生停止条件以前要发送多于一页字的数据, 地址计数器将会循环, 并且先接收到的数据将被覆盖 像字节写操作一样, 一旦停止条件被接收到, 则内部写周期将开始 存储器的读操作 在这种模式下, 主器件可以从 DS1624 的 EEPROM 中读取数据 主器件在发送开始信号之后, 主器件首先发送写控制字节 1001A2A1A00, 主器件接收到 DS1624 应答之后, 发送访问存储器的指令 (17H), 收到 DS1624 的应答之后, 接着发送字地址将被被写入到 DS1624 的地址指针 这时 DS1624 发送应答信号之后, 主器件并没有发送停止信号, 而是重新发送 START 开始信号, 接着又发送读控制字节 1001A2A1A01, 主器件接收到 DS1624 应答之后, 开始接收 DS1624 送出来的数据, 主器件每接收完一个字节的数据之后, 都要发送一个应答信号给 DS1624, 直到主器件发送一个非应答信号或停止条件来结束 DS1624 的数据发送过程 DS1624 的指令集 数据和控制信息的写入读出是以表 5 和表 6 所示的方式进行的 在写入信息时, 主器件输出从器件 ( 即 DS1624) 的地址, 同时 R/W 位置 0 接收到响应位后,

189 总线上的主器件发出一个命令地址,DS1624 接收此地址后, 产生响应位, 主器件就向它发送数据 如果要对它进行读操作, 主器件除了发出命令地址外, 还要产生一个重复的启动条件和命令字节, 此时 R/W 位为 1, 读操作开始 下面对它们的命令进行说明 访问存储器指令 [17H]: 该指令是对 DS1624 的 EEPROM 进行访问, 发送该指令之后, 下一个字节就是被访问存储器的字地址数据 访问设置寄存器指令 [ACH]: 如果 R/W 位置 0, 将写入数据到设置寄存器 发出请求后, 接下来的一个字节被写入 如果 R/W 位置 1, 将读出存在寄存器中的值 读温度值指令 [AAH]: 即读出最后一个测温结果 DS1624 产生两个字节, 即为寄存器内的结果 开始测温指令 [EEH]: 此命令将开始一次温度的测量, 不需再输入数据 在单次测量模式下, 可在进行转换的同时使 DS1624 保持闲置状态 在连续模式下, 将启动连续测温 停止测温指令 [22H]: 该命令将停止温度的测量, 不需再输入数据 此命令可用来停止连续测温模式 发出请求后, 当前温度测量结束, 然后 DS1624 保持闲置状态 直到下一个开始测温的请求发出才继续进行连续测量 表 5 主机对 DS1624 写操作通信格式 I2C 通信开始 主器件发送控制字节 (DS162 4 地址和写操作 ) DS1624 应答 主器件发送访问 DS1624 的指令 DS1624 应答 主器件发送的数据字节 DS1624 应答 I2 C 通信停止 表 6 主机对 DS1624 读操作通信格式 I2 C 通信开始 主器件发送控制字节 (DS16 24 地址和写操作 ) DS 应答 主器件发送访问 DS162 4 的指令 DS 应答 I2 C 通信开始 主器件发送控制字节 (DS1 624 地址和读操作 ) DS 应答 数据字节 0 主机应答 数据字节 1 主机非应答 I 2 C 通信停止

190 2. 实验任务 用一片 DS1624 完成本地数字温度的测量, 并通过 8 位数码管显示出测量的温度值 其硬件电路图如图 所示 3. 电路原理图 4. 系统板上硬件连线 图 (1). 把 单片机系统 区域中的 P0.0-P0.7 用 8 芯排线连接到 动态数码显示 区域中的 ABCDEFGH 端子上 (2). 把 单片机系统 区域中的 P2.0-P2.7 用 8 芯排线连接到 动态数码显示 区域中的 S1S2S3S4S5S6S7S8 端子上 (3). 把 DS1624 芯片插入到 二线总线模块 区域中的 8 脚集成座上, 注意芯片不插反 (4). 把 二线总线模块 区域中的 PIN1 PIN2 分别用导线连接到 单片机系统 区域中的 P1.6 和 P1.7 端子上 (5). 把 二线总线模块 区域中的 PIN4 PIN5 PIN6 分别用导线连接到 电源模块 区域中的 GND 端子上

191 5. 程序设计内容 (1). 由于 DS1624 是 I2C 总线结构的串行数据传送, 它只需要 SDA 和 SCL 两根线完成数据的传送过程 因此, 我们在进行程序设计的时候, 也得按着 I2C 协议来对 DS1624 芯片数据访问 有关 I2C 协议参看有关资料, 这里不详述 对于 AT89S51 单片机本身没有 I2C 硬件资源, 所以必须用软件来模拟 I2C 协议过程 (2). 要从 DS1624 中读取温度值, 首先启动 DS1624 的内部温度 A/D 开始转换, 对应着有相应的命令用来启动开始温度转换, 有关 DS1624 的指令集参考前面的叙述 一般情况下,DS1624 经过一次温度的变换, 需要经过 1 秒钟左右的时间, 所以等待 1 秒钟后, 即可读取内部的温度值, 对于读取的温度值, 仍然通过 DS1624 的指令集来完成温度的读取 但所有有数据的传送过程必须遵循 I2C 协议 6. C 语言源程序 #include <AT89X52.H> #include <INTRINS.H> unsigned char code displaybit[]=0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f; unsigned char code displaycode[]=0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x00; unsigned char code dotcode[32]=0,3,6,9,12,16,19,22, 25,28,31,34,38,41,44,48, 50,53,56,59,63,66,69,72, 75,78,81,84,88,91,94,97; sbit SDA=P1^6; sbit SCL=P1^7; unsigned char displaybuffer[8]=0,1,2,3,4,5,6,7; unsigned char eepromdata[8]; unsigned char temperdata[2]; unsigned char timecount; unsigned char displaycount; bit secondflag=0; unsigned char secondcount=0; unsigned char retn; unsigned int result; unsigned char x; unsigned int k;

192 unsigned int ks; void delay(void); void delay10ms(void); void i_start(void); void i_stop(void); void i_init(void); void i_ack(void); bit i_clock(void); bit i_send(unsigned char i_data); unsigned char i_receive(void); bit start_temperature_t(void); bit read_temperature_t(unsigned char *p); void delay(void) _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); void delay10ms(void) unsigned int i; for(i=0;i<1000;i++) delay(); void i_start(void) SCL=1; delay(); SDA=0; delay(); SCL=0; delay(); void i_stop(void)

193 SDA=0; delay(); SCL=1; delay(); SDA=1; delay(); SCL=0; delay(); void i_init(void) SCL=0; i_stop(); void i_ack(void) SDA=0; i_clock(); SDA=1; bit i_clock(void) bit sample; SCL=1; delay(); sample=sda; _nop_(); _nop_(); SCL=0; delay(); return(sample); bit i_send(unsigned char i_data) unsigned char i; for(i=0;i<8;i++) SDA=(bit)(i_data & 0x80); i_data=i_data<<1;

194 i_clock(); SDA=1; return(~i_clock()); unsigned char i_receive(void) unsigned char i_data=0; unsigned char i; for(i=0;i<8;i++) i_data*=2; if(i_clock()) i_data++; return(i_data); bit start_temperature_t(void) i_start(); if(i_send(0x90)) if(i_send(0xee)) i_stop(); delay(); return(1); else i_stop(); delay(); return(0); else i_stop(); delay(); return(0);

195 bit read_temperature_t(unsigned char *p) i_start(); if(i_send(0x90)) if(i_send(0xaa)) i_start(); if(i_send(0x91)) *(p+1)=i_receive(); i_ack(); *p=i_receive(); i_stop(); delay(); return(1); else i_stop(); delay(); return(0); else i_stop(); delay(); return(0); else i_stop(); delay(); return(0); void main(void) P1=0xff; timecount=0; displaycount=0;

196 TMOD=0x21; TH1=0x06; TL1=0x06; TR1=1; ET1=1; ET0=1; EA=1; if(start_temperature_t()) // 向 DS1624 发送启动 A/D 温度转换命令, 成功则启动 T0 定时 1s secondflag=0; secondcount=0; TH0=55536/256; TL0=55536%256; TR0=1; while(1) if(secondflag==1) secondflag=0; TR0=0; if(read_temperature_t(temperdata)) //T0 定时 1s 时间到, 读取 DS1624 的温度值 for(x=0;x<8;x++) displaybuffer[x]=16; x=2; result=temperdata[1]; // 将读取的温度值进行数据处理, 并送到显示缓冲区 while(result/10) displaybuffer[x]=result%10; result=result/10; x++; displaybuffer[x]=result; result=temperdata[0]; result=result>>3; displaybuffer[0]=(dotcode[result])%10; displaybuffer[1]=(dotcode[result])/10;

197 if(start_temperature_t()) // 温度值数据处理完毕, 重新启动 DS1624 开始温度转换 secondflag=0; secondcount=0; TH0=55536/256; TL0=55536%256; TR0=1; void t0(void) interrupt 1 using 0 //T0 用于定时 1s 时间到 secondcount++; if(secondcount==100) secondcount=0; secondflag=1; TH0=55536/256; TL0=55536%256; void t1(void) interrupt 3 using 0 //T1 定时 1ms 用数码管的动态刷新 timecount++; if(timecount==4) //T1 定时 1ms 到 timecount=0; if (displaycount==5) P0=(displaycode[displaybuffer[7-displaycount]] 0x80); // 在该位同时还要显示小数点 else P0=displaycode[displaybuffer[7-displaycount]]; P2=displaybit[displaycount]; displaycount++; if(displaycount==8) displaycount=0;

198 35. DS18B20 数字温度计使用 1.DS18B20 基本知识 DS18B20 数字温度计是 DALLAS 公司生产的 1-Wire, 即单总线器件, 具有线路简单, 体积小的特点 因此用它来组成一个测温系统, 具有线路简单, 在一根通信线, 可以挂很多这样的数字温度计, 十分方便 1 DS18B20 产品的特点 (1) 只要求一个端口即可实现通信 (2) 在 DS18B20 中的每个器件上都有独一无二的序列号 (3) 实际应用中不需要外部任何元器件即可实现测温 (4) 测量温度范围在 -55 C 到 +125 C 之间 (5) 数字温度计的分辨率用户可以从 9 位到 12 位选择 (6) 内部有温度上 下限告警设置 2 DS18B20 的引脚介绍 ( 底视图 ) 图 1 TO-92 封装的 DS18B20 的引脚排列见图 1, 其引脚功能描述见表 1 表 1 DS18B20 详细引脚功能描述 序号 名称 引脚功能描述 1 GND 地信号 2 DQ 数据输入 / 输出引脚 开漏单总线接口引脚 当被用着在寄生电源下, 也可以向器件提供电源 3 VDD 可选择的 VDD 引脚 当工作于寄生电源时, 此引脚必须接地 3. DS18B20 的使用方法

199 由于 DS18B20 采用的是 1-Wire 总线协议方式, 即在一根数据线实现数据的双向传输, 而对 AT89S51 单片机来说, 硬件上并不支持单总线协议, 因此, 我们必须采用软件的方法来模拟单总线的协议时序来完成对 DS18B20 芯片的访问 由于 DS18B20 是在一根 I/O 线上读写数据, 因此, 对读写的数据位有着严格的时序要求 DS18B20 有严格的通信协议来保证各位数据传输的正确性和完整性 该协议定义了几种信号的时序 : 初始化时序 读时序 写时序 所有时序都是将主机作为主设备, 单总线器件作为从设备 而每一次命令和数据的传输都是从主机主动启动写时序开始, 如果要求单总线器件回送数据, 在进行写命令后, 主机需启动读时序完成数据接收 数据和命令的传输都是低位在先 DS18B20 的复位时序 DS18B20 的读时序 对于 DS18B20 的读时序分为读 0 时序和读 1 时序两个过程 对于 DS18B20 的读时隙是从主机把单总线拉低之后, 在 15 秒之内就得释放单总线, 以让 DS18B20 把数据传输到单总线上 DS18B20 在完成一个读时序过程, 至少需要 60us 才能完成 DS18B20 的写时序 对于 DS18B20 的写时序仍然分为写 0 时序和写 1 时序两个过程 对于 DS18B20 写 0 时序和写 1 时序的要求不同, 当要写 0 时序时, 单总线要被拉低至少 60us, 保证 DS18B20 能够在 15us 到 45us 之间能够正确地采样 IO 总

200 线上的 0 电平, 当要写 1 时序时, 单总线被拉低之后, 在 15us 之内就得释放单总线 4. 实验任务 用一片 DS18B20 构成测温系统, 测量的温度精度达到 0.1 度, 测量的温度的范围在 -20 度到 +100 度之间, 用 8 位数码管显示出来 5. 电路原理图

微處理機期末專題

微處理機期末專題 微 處 理 機 期 末 專 題 自 動 鋼 琴 組 員 :b92611004 羅 鈞 瑋 b92611008 吳 妍 儂 b92611038 吳 韋 靜 b92611042 林 佳 穎 一 簡 介 本 組 的 主 題 是 自 動 鋼 琴 在 播 放 音 樂 的 同 時, 鋼 琴 會 自 動 按 下 琴 鍵, 被 按 下 的 琴 鍵 所 對 應 到 的 音 階, 就 是 正 在 撥 放 的 樂 曲 的

More information

Microsoft Word - P3.doc

Microsoft Word - P3.doc ;P3.3 警报器 ;* ( 程序转载请著明出处, 未声明可适应本站腾龙 /isp 开发套件 / 倚天版开发套件 * ;* E-mail:sxj1974@163.com (51c51 test web) 51 测试网, 自学单片机的网站 * ;* Create by : 石学军 www.51c51.com www.8951.com 更多例程请登陆网站 * org 00h ajmp dlv org 0030h

More information

DPJJX1.DOC

DPJJX1.DOC 8051 111 2K 1 2 3 ' ' 1 CPU RAM ROM / A/D D/A PC CPU 40 68 10 20 8 51 PIII 8051 2 MCS51 8051 8031 89C51 8051 8031 89C51? MCS51 INTEL INTEL 8031 8051 8751 8032 8052 8752 8051 8051 8051 MCS51 8031 8031

More information

12232A LED LED LED EL EL CCFL EL CCF

12232A LED LED LED EL EL CCFL EL CCF 12232A 0 50-20 +70-30 +85 LED LED LED EL EL CCFL EL CCF 122 x 32 1/32Duty 1/5Bias 6:00 STN( ), EL LED EL/100VAC 400HZ LED/4.2VDC 1 / VDD-VSS 0 6.5 V Ta=25 LCD VDD-V0 0 12.0 V V1 0 VDD V VDD-VSS - 4.75

More information

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit 6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C51 6.1 C51 6.1.1 C51 C51 ANSI C MCS-51 C51 ANSI C C51 6.1 6.1 C51 bit Byte bit sbit 1 0 1 unsigned char 8 1 0 255 Signed char 8 11 128

More information

<4D F736F F D20B3E6B4B9A4F930365F32A443AC71C5E3A5DCBEB9B1B1A8EE2E646F63>

<4D F736F F D20B3E6B4B9A4F930365F32A443AC71C5E3A5DCBEB9B1B1A8EE2E646F63> 七段顯示器控制電路四位數 _ 使用解碼器驅動 +5 V 10 uf 8.2 k 12 MHz 20 pf 1 2 3 4 5 6 7 8 9 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 RESET 10 P3.0 11 12 13 14 15 16 17 18 19 20 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7 XTAL2 XTAL1

More information

HD61202 HD HD61203 HD61202, HY HY HD61202 HD61202 HD61203 HD =4096 RAMRAM LCD 2HD HD HD /32--

HD61202 HD HD61203 HD61202, HY HY HD61202 HD61202 HD61203 HD =4096 RAMRAM LCD 2HD HD HD /32-- HD61202 C-7 1 HD61202 HD61202 8 HD61203 HD61202, HY-12864 HY-19264 HD61202 HD61202 HD61203 HD61202 1 6464=4096 RAMRAM LCD 2HD61202 64 3HD61202 68 68 4HD61202 1/32--1/64 HD61202 HD61202 2 CS1,CS2,CS3 CS1

More information

untitled

untitled EDM16080-01 Model No.: Editor: 1. ----------------------------------------------------3 2. ----------------------------------------------------3 3. ----------------------------------------------------3

More information

学习MSP430单片机推荐参考书

学习MSP430单片机推荐参考书 MSP430 16 MSP430 C MSP430 C MSP430 FLASH 16 1 CPU 16 ALU 16 PC SP SR R4~R15 2 3 00-FFH 100-1FFH 4 5 1 2 51 24 27 6 1 2 3 4 5 6 4 12 SR SP SR CPU SR CPU C Z N GIE CPUOff CPU OscOff SCG0 SCG1 CPU EXIT SP

More information

1 TPIS TPIS 2 2

1 TPIS TPIS 2 2 1 1 TPIS TPIS 2 2 1. 2. 3. 4. 3 3 4 5 4 TPIS TPIS 6 5 350 Mark Coil F3/F6 350 M 150 M 25 M 7.12M 8 M F3 F6 F4 F7 F8 8M AA 7 350 28V 5V IC HCPL2731 0.5mA 6 8 (TPIS) TPIS 9 7 IC AT89C2051 AT89C2051 CMOS8

More information

Microsoft Word - 專題封面.doc

Microsoft Word - 專題封面.doc 逢 甲 大 學 資 訊 工 程 學 系 專 題 研 究 報 告 8051 小 遊 戲 -21 點 指 導 教 授 : 陳 德 生 學 生 : 許 博 益 中 華 民 國 九 十 六 年 六 月 I 目 錄 第 一 章 緒 論 1 1-1 研 究 背 景 1 1-2 研 究 動 機 2 1-3 研 究 目 的 3 1-3-1 21 點 源 起 3 1-3-2 21 點 規 則 3 第 二 章 微 電

More information

单片机学习教程

单片机学习教程 . 89S51 1. 2.p1 3.8 3 4.8 3. 1. 0-F 2. 0000 0255. 1. : BB 2. : ( --- ) : :. 1. 2..232.I 2 C 1. X24C02 MCS-51 2. : 22H 24C02 50H 3. : ; 8 4. :I2C. / 1. 1 2. 2. 1. 1. 2. 2.. 1. 1: 2. 2: 3. 3 1 LED 1 89S51

More information

CA24064B LED LED LED EL EL CCFL EL CCF /

CA24064B LED LED LED EL EL CCFL EL CCF / CA24064B 0 50-20 +70-30 +85 LED LED LED EL EL CCFL EL CCF 39 2 6 0755-81995643/27890716 0 13713911853 0755-27890716 1 : VDD-VSS 0 6 V LCD VDD-V0 Ta=25 0 28.0 V VI 0 VDD V : VDD-VSS --- 4.75 5.0 5.25 V

More information

<4D6963726F736F667420576F7264202D203130B5A5C6ACBBFACAB5D1E9D6B8B5BCCAE92E646F63>

<4D6963726F736F667420576F7264202D203130B5A5C6ACBBFACAB5D1E9D6B8B5BCCAE92E646F63> 单 片 机 及 接 口 技 术 实 验 指 导 书 张 勇 编 计 算 机 与 通 信 工 程 学 院 信 息 与 通 信 工 程 系 2004.12 1 - 前 言 单 片 机 及 接 口 技 术 是 通 信 工 程 专 业 的 专 业 技 能 课 程, 在 专 业 知 识 结 构 体 系 中 具 有 十 分 重 要 的 地 位, 课 程 的 实 践 性 很 强, 学 习 必 须 理 论 和 实

More information

untitled

untitled EDM12832-08 : 25-1 : 116600 : (0411)7612956 7632020 7631122 : (0411)7612958 Model No.: Editor: LCD 1. ----------------------------------------------------3 2. ----------------------------------------------------3

More information

» n ¹ú KS0108 x ÍÍÙ q n KS0108 KS KS0107 KS0108 KS *32 128*64 192*64 KS0108 KS0108 KS0107 KS =4096 RAM RAM LCD 2 KS

» n ¹ú KS0108 x ÍÍÙ q n KS0108 KS KS0107 KS0108 KS *32 128*64 192*64 KS0108 KS0108 KS0107 KS =4096 RAM RAM LCD 2 KS KS0108 KS0108 8 KS0107 KS0108 KS0108 128*32128*64 192*64 KS0108 KS0108 KS0107 KS0108 1 6464=4096 RAMRAM LCD 2KS0108 64 3KS0108 68 68 4KS0108 1/48--1/64 KS0108 CS1,CS2,CS3 CS1 CS2 CS3 E E KS0108 E R/W R/W=1

More information

CH559指令周期.doc

CH559指令周期.doc CH55X 汇编指令周期表 CH55X 汇编指令概述 : 型号包含 : a. 指令单周期型号 :CH557 CH558 CH559; b. 指令 4 周期型号 :CH551 CH552 CH553 CH554; c. 非跳转指令的指令周期数与指令字节数相同 ; d. 跳转指令含 MOVC/RET/CALL 通常比字节数多若干个周期 ; e.movc 指令多 4 或 5 个周期 ( 下条指令地址为奇数时多

More information

51 C 51 isp 10 C PCB C C C C KEIL

51 C 51 isp 10   C   PCB C C C C KEIL http://wwwispdowncom 51 C " + + " 51 AT89S51 In-System-Programming ISP 10 io 244 CPLD ATMEL PIC CPLD/FPGA ARM9 ISP http://wwwispdowncom/showoneproductasp?productid=15 51 C C C C C ispdown http://wwwispdowncom

More information

目 录

目 录 1 Quick51...1 1.1 SmartSOPC Quick51...1 1.2 Quick51...1 1.3 Quick51...2 2 Keil C51 Quick51...4 2.1 Keil C51...4 2.2 Keil C51...4 2.3 1 Keil C51...4 2.4 Flash Magic...9 2.5 ISP...9 2.6...10 2.7 Keil C51...12

More information

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File 51 C 51 51 C C C C C C * 2003-3-30 pnzwzw@163.com C C C C KEIL uvision2 MCS51 PLM C VC++ 51 KEIL51 KEIL51 KEIL51 KEIL 2K DEMO C KEIL KEIL51 P 1 1 1 1-1 - 1 Project New Project 1 2 Windows 1 3 N C test

More information

1-1 SH79F6431 A. 2( ) 9~15V ( 12V) U2 U3 3.3V SH79F B. 1(VCC/GND) SH79F6431 C. VDDIO SH79F6431 P4 P5 P0.6 P0.7 VDDIO VDDIO=5V D. 2 V 1.0

1-1 SH79F6431 A. 2( ) 9~15V ( 12V) U2 U3 3.3V SH79F B. 1(VCC/GND) SH79F6431 C. VDDIO SH79F6431 P4 P5 P0.6 P0.7 VDDIO VDDIO=5V D. 2 V 1.0 SH79F6431 1. SH79F6431 1T 8051 FLASH SH79F JET51 Keil µ vision JTAG 1.1. SH79F6431 LQFP64 1.2. (Target Board) SH79F6431 1 V 1.0 1-1 SH79F6431 A. 2( ) 9~15V ( 12V) U2 U3 3.3V SH79F6431 1 2 1 B. 1(VCC/GND)

More information

逢 甲 大 學

逢    甲    大    學 論 車 Auto Vehicle 立老 磊 年 老 立老 了 見 老 了不 料 利 了 識 更了 力量! i 車. 車 利 89c51 來 流. 令. 車 8051 類 車利 車 ii Abstract The goal of this thesis is to design a small auto vehicle by using IC as its control center. Our auto

More information

第5章:汇编语言程序设计

第5章:汇编语言程序设计 第 5 章 : 汇编语言程序设计 程 汇编语言指令格式 系统伪指令 存储器选择方式 常用子程序 1 汇编语言程序设计 PIC 指令系统 语言系统 指 CPU 编 器语言 器语言 器语言 设计 用 语言 设计 语言 汇编语言 2 汇编语言指令格式 汇编语言指令格式 ( 指令 ) label opcode operand comment 指令 用 存 指令 指令语 3 汇编语言指令格式 1 指令 用 指令

More information

TSINGTEK DISPLAY CO.,LTD LCD CONTROLLER & DRIVER ST7920 OR EQUIVALENT (f) 639 2A f B1

TSINGTEK DISPLAY CO.,LTD LCD CONTROLLER & DRIVER ST7920 OR EQUIVALENT (f) 639 2A f B1 TSINGTEK DISPLAY CO.,LTD LCD CONTROLLER & DRIVER ST7920 OR EQUIVALENT 588 4 1 0571-85121224 85121742 85121304(f) 639 2A095 0571-88256346 89902095 f B1618 010-62051209 62000662 62568913 82036512 f http://www.tsingtek.com

More information

專題最終版.doc

專題最終版.doc The Principle and Application of the Electric Combination Lock The Principle and Application of the Electric Combination Lock Abstract Recently, there are more and more burglaries in the society. It's

More information

Microsoft Word - ISSFA-0134_A_AP_User-definedDownload_SC_.doc

Microsoft Word - ISSFA-0134_A_AP_User-definedDownload_SC_.doc 自定义下载应用说明 一 适用产品 :SM59XX 系列 SM59D XX 系列 SM59R XX 系列二 应用方式 : 可以让使用者自定义 command 作为进入 ISP 刻录的通关指令, 透过 UART 连接 ISAP 软件做联机更新三 操作说明 ( 使用 SM59D04G2 为例 ): 1. ISAP 操作方式 : 1.1 先将主程序及 ISP 服务程序烧进 MCU 中 1.2 将 MCU 放至系统版上,

More information

Microsoft PowerPoint - chap5.ppt

Microsoft PowerPoint - chap5.ppt 邏輯運算指令的動作 0 1 0 1 0 0 1 1 OR 1 0 1 1 1 0 0 1 1 1 1 1 1 0 1 1 (a) OR 運算 0 1 0 1 0 0 1 1 XOR 1 0 1 1 1 0 0 1 1 1 1 0 1 0 1 0 (c) XOR 運算 希望設定為 1 的位元 罩網標的位元組 新標的位元組 不改變的位元 希望取補數的位元 罩網標的位元組 新標的位元組 不改變的位元 1

More information

*_* IAP In Applications Program, *_* ROM RAM A/D D/A KELL C51 2 0531-86213622 Micro Controller Unit( ) INTEL MCS-48 MCS-51 MCS-96 51 MCS-51 8 MCS-96 16 INTEL / 51 87 LPC W78L DS87 GSM97 ATMEL 89C51

More information

<4D6963726F736F667420576F7264202D20B9F9B0EABBCDBBAFAB48DEB3B4C1A5BDB3F8A7692E646F63>

<4D6963726F736F667420576F7264202D20B9F9B0EABBCDBBAFAB48DEB3B4C1A5BDB3F8A7692E646F63> 臺 北 市 立 松 山 高 級 工 農 職 業 學 校 資 訊 科 專 題 製 作 報 告 題 目 : 反 彈 空 間 指 導 老 師 : 余 耀 銘 學 生 : 廖 國 銓 趙 信 瑋 中 華 民 國 102 年 5 月 摘 要 在 這 高 速 科 技 的 起 飛 下, 科 技 都 建 立 起 於 基 礎, 有 些 人 把 這 基 礎 轉 為 理 論, 教 給 大 眾 學 習 ; 有 些 人 利

More information

W77E58中文手册

W77E58中文手册 W77E58 77E58 8051 8051 8051 77E58 8051 1.5 3 COMS 32K EEPROM 1K SRAM 1 8 2 40M 4 3 8051 4 8051 5 4 8 I/O 6 4 I/O 44 PLCC QFP 7 16 / 8 12 9 10 11 1K 12 13 16 DPTR 14 15 DIP40 W77E58 25/40 PLCC44 W77E58P

More information

PowerPoint 簡報

PowerPoint 簡報 微算機原理與實驗 (UEE 2301/1071 ) Chap 5. MCS-51 Addressing Modes 宋開泰 Office:EE709 Phone:5731865( 校內分機 :31865) E-mail:ktsong@mail.nctu.edu.tw URL:http://isci.cn.nctu.edu.tw 1 Addressing Modes Addressing mode is

More information

2 Keil µ vision 2.1 1) Keil µ vision2 V2.34 µ vision3 2) Sino_Keil.exe Keil c:\keil\ 3) JET51 USB PC C:\Keil\ USB PC 4) S-L

2 Keil µ vision 2.1 1) Keil µ vision2 V2.34 µ vision3 2) Sino_Keil.exe   Keil c:\keil\ 3) JET51 USB PC C:\Keil\ USB PC 4) S-L 1 SH88F516 8051 64K FLASH 1024 EEPROM SH88F516 JET51 S-Lab Keil µ vision ISP51 Keil µ vision ISP51 ISP51 PC RS232 MCU SH88F516 SH88F516 1.1 SH88F516 1.1 SH88F516 SH88Fxx: QFP44, DIP40 RAM Flash E2 ADC

More information

C语言的应用.PDF

C语言的应用.PDF AVR C 9 1 AVR C IAR C, *.HEX, C,,! C, > 9.1 AVR C MCU,, AVR?! IAR AVR / IAR 32 ALU 1KBytes - 8MBytes (SPM ) 16 MBytes C C *var1, *var2; *var1++ = *--var2; AVR C 9 2 LD R16,-X ST Z+,R16 Auto (local

More information

1.1 ML_ONOFF = 1 Q 3 Q 8 C 0.3V M 2 L 1 ML_ONOFF = 0 Q 3 Q 8 C 1. + R31 VCC R21 10K ML_ONOFF R15 0:off 1:on 1K Green Light VCC=5V L1 Q VDD=12V C

1.1 ML_ONOFF = 1 Q 3 Q 8 C 0.3V M 2 L 1 ML_ONOFF = 0 Q 3 Q 8 C 1. + R31 VCC R21 10K ML_ONOFF R15 0:off 1:on 1K Green Light VCC=5V L1 Q VDD=12V C AUTOMATIC TROLLEY H K Hwang K K Chen J-S Lin S-C Wang M-L Li C-C Lin W-B Lin Dept. Of Electrical Engineering Far East College ABSTRACT This paper proposes an automatic trolley which can move automatically

More information

<4D F736F F D20B5A5C6ACBBFAD4ADC0EDD3EBD3A6D3C3BCB B3CCD0F2C9E8BCC65FB5DA33B0E65F2DD6D5B8E52D4E65772DBFB1CEF3B1ED2DB3F6B0E6C9E72E646F6378>

<4D F736F F D20B5A5C6ACBBFAD4ADC0EDD3EBD3A6D3C3BCB B3CCD0F2C9E8BCC65FB5DA33B0E65F2DD6D5B8E52D4E65772DBFB1CEF3B1ED2DB3F6B0E6C9E72E646F6378> 单片机原理与应用及 C51 程序设计 ( 第 3 版 )- 终稿 -New 勘误表 1. P18 页 11 行原来 : 汇编语言 机器语言 功能 MOV AL,01H 1011 0000 0000 0011B ; 把 01 送入累加器 A ADD AL,02H 0000 0100 0000 0101B ;02 与 A 中内容相加, 结 果存入 A HLT 11110100B ; 停止操作 汇编语言

More information

JLX

JLX PRODUCT:LCD MODULE. Model No.: JLX177-006 Product Type: 1.77 inch QVGA TFT Modoule. 产品规格书 晶联讯研发研发部 : Written By Checked By Approved By 客户名称 : 结构电子核准 地址 : 深圳市宝安区西乡宝安大道东华工业区 A3 栋 6 楼电话 :0755-29784961 Http://www.jlxlcd.cn

More information

<4D6963726F736F667420576F7264202D20C7B6C8EBCABDCFB5CDB3C9E8BCC6CAA6B0B8C0FDB5BCD1A75FD1F9D5C22E646F63>

<4D6963726F736F667420576F7264202D20C7B6C8EBCABDCFB5CDB3C9E8BCC6CAA6B0B8C0FDB5BCD1A75FD1F9D5C22E646F63> 因 为 路 过 你 的 路, 因 为 苦 过 你 的 苦, 所 以 快 乐 着 你 的 快 乐, 追 逐 着 你 的 追 逐 内 容 简 介 本 书 根 据 2005 年 下 半 年 实 施 的 全 国 计 算 机 技 术 与 软 件 专 业 技 术 资 格 ( 水 平 ) 考 试 嵌 入 式 系 统 设 计 师 级 考 试 大 纲 精 神, 在 深 入 研 究 历 年 计 算 机 技 术 与 软

More information

电 阻 应 变 式 传 感 器 是 将 被 测 量 的 力, 通 过 它 产 生 的 金 属 弹 性 变 形 转 换 成 电 阻 变 化 的 元 件 由 电 阻 应 变 片 和 测 量 线 路 两 部 分 组 成 电 阻 应 变 片 产 生 的 误 差, 主 要 来 源 于 温 度 的 影 响, 本

电 阻 应 变 式 传 感 器 是 将 被 测 量 的 力, 通 过 它 产 生 的 金 属 弹 性 变 形 转 换 成 电 阻 变 化 的 元 件 由 电 阻 应 变 片 和 测 量 线 路 两 部 分 组 成 电 阻 应 变 片 产 生 的 误 差, 主 要 来 源 于 温 度 的 影 响, 本 AT89C51 体 重 称 电 路 图 原 理 本 文 设 计 一 种 利 用 电 阻 应 变 式 压 力 传 感 器 和 MCS-51 单 片 机 等 器 件 制 作 的 体 重 秤 该 体 重 秤 的 量 程 为 100kg, 能 实 现 称 重 数 码 显 示 调 零 等 功 能 该 体 重 秤 利 用 电 桥 测 量 原 理, 将 压 力 应 变 传 感 器 阻 值 转 换 为 电 压 值,

More information

单片机原理及应用实验指导书.doc

单片机原理及应用实验指导书.doc 1 2 3 4...2...4...9...9 AEDK598 MCS51...9 MCS51...10...10...10...10...10...10...11 P1...12...12...12....12...12...13 P3...14...14...14...14...14...14 I/O...15...15...15...15...15...16...17...17...17...17...17...18...19...19

More information

Ps22Pdf

Ps22Pdf ( ) ( 150 ) 25 15 20 40 ( 25, 1, 25 ), 1. A. B. C. D. 2. A. B. C. D. 3., J = 1 H = 1 ( A B, J', J, H ) A. A = B = 1, J' =0 B. A = B = J' =1 C. A = J' =1, B =0 D. B = J' = 1, A = 0 4. AB + AB A. AB B. AB

More information

从MCS51向AVR的快速转换.PDF

从MCS51向AVR的快速转换.PDF MCS51 AVR MCS51 AVR ATMEL AVR RISC MCS51 AVR 1 MHZ 1MIPS 8MHZ AVR 224MHZ MCS51 FLASH EEPROM ISP WatchDog AVR MCS51 AT90S1200/2313 AT89C1051/2051 AT90S4414/8515 AT89C51/52 PCB / AVR C ICCAVR60 AVR C IAR

More information

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63>

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63> 第三章 Q3 1 1. 省略了 I/O 操作的复杂逻辑, 易实现, 耗费低 ; 2. 可以利用丰富的内存寻址模式实现灵活的 I/O 操作 Q3 2 假设存储单元 ds1 处寄存器地址为 0x2000, 代码如下 #define ds1 0x2000 while ( *ds1 == 0 ) ; Q3 3 假设设备 (dev1) 中有两个寄存器 ds1 和 dd1,dev1 的地址为 0x1000,ds1

More information

42 2141601026 2016 11 27 2 1.1............................................. 2 1.2....................................... 2 1.2.1......................................... 2 1.3.............................................

More information

<4D F736F F D20B5A5C6ACBBFABFD8D6C6B2BDBDF8B5E7BBFA2E646F63>

<4D F736F F D20B5A5C6ACBBFABFD8D6C6B2BDBDF8B5E7BBFA2E646F63> 用单片机控制步进电机 步进电机是机电控制中一种常用的执行机构, 它的用途是将电脉冲转化为角位移, 通俗地说 : 当步进驱动器接收到一个脉冲信号, 它就驱动步进电机按设定的方向转动一个固定的角度 ( 及步进角 ) 通过控制脉冲个数即可以控制角位移量, 从而达到准确定位的目的 ; 同时通过控制脉冲频率来控制电机转动的速度和加速度, 从而达到调速的目的 一 步进电机常识 常见的步进电机分三种 : 永磁式

More information

,768 32,767 32K JMP Jnnn (386+) LOOP CALL [Label:] JMP short/near/far address L10: jmp jmp L20: L10 L20

,768 32,767 32K JMP Jnnn (386+) LOOP CALL [Label:] JMP short/near/far address L10: jmp jmp L20: L10 L20 (Jump) (Loop) (Conditional jump) CMP CALL AND SAR/SHR TEST JMP NOT SAL/SHL Jnnn* OR RCR/ROR LOOP XOR RCL/ROL RETn * nnn, JNE JL -128 127-32,768 32,767 32K JMP Jnnn (386+) LOOP CALL [Label:] JMP short/near/far

More information

Microsoft PowerPoint - chap4.ppt

Microsoft PowerPoint - chap4.ppt 定址方式 定址方式 格式 有效位址 立即資料定址 #data8 暫存器定址 Rn (R0 ~ R7) 直接定址 addr8 addr8 絕對定址 addr11 addr11 長程 ( 絕對 ) 定址 addr16 addr16 ( 暫存器 ) 間接定址 @Ri (@R0 @R1) 或 @DPTR R0 R1 或 DPTR ( 暫存器 ) 相對定址 disp8 PC+ 符號擴展之 disp8 ( 基底

More information

untitled

untitled www.mcudriver.cn 1.1 / 1) WinAVR20070525 2) Source Insight 3) ISP 4) PonyProg ISP 5) USB 6) 1.2. MCU ATMEGA16 1.3. AVR8 1.4 LED0~LED7 1 1.5 #include // Program 1.1 LED.C #define uchar unsigned

More information

µPSD3000 系列

µPSD3000 系列 8032 FLASH MCU µpsd3251f-40t6 µpsd3251 8032 FlashPSD Flash SRAM I/O I 2 C, ADC and PWM 8032, 16 / FlashPSD µpsd32 JTAG ISP 2K SRAM Flash - 64K Flash - 16K Flash - Flash 8032 12 I2C ADC 6 I/O 37 I/O 16

More information

Microsoft Word - ~ doc

Microsoft Word - ~ doc EEPROM 功能使用方法 1 适用产品 : 1.1 SM39R16A2/ SM39R12A2/ SM39R08A2 1.2 SM39R4051/ SM39R2051 1.3 SM39R04G1/ SM39R02G1 2 EEPROM 功能概述 : 2.1 使用 code flash 仿真为 Internal EEPROM, 在程序执行时, 可将 code flash 作为 data flash 储存数据使用

More information

/ / / , DOCNO: SG J REV11-2 -

/ / / , DOCNO: SG J REV11-2 - SG240128-01J LCD Version11 LED VDD SG240128SYD-01JSYE STN 80 50V 50V SG240128FPD-01JSWE FSTN 80 50V 50V SG240128SBD-01JSWE STN 80 50V 50V SG240128-01J 1 33V 2 LCM LCD 3 LED 4 1 LCD 2 3 : 010-80750102 /03

More information

ORG 00BH JMP TIMER0 ORG 100H MOV TMOD,# B MOV IE,# B MOV TH0,#( )/32 MOV TL0,#( ).MOD.32 SETB P2.0 SETB TR0 JMP $ MOV R0,#

ORG 00BH JMP TIMER0 ORG 100H MOV TMOD,# B MOV IE,# B MOV TH0,#( )/32 MOV TL0,#( ).MOD.32 SETB P2.0 SETB TR0 JMP $ MOV R0,# 分數學號姓名 EE3046 Microcomputers Theory and Laboratory, 2016 Spring Semester Final Exam (8051) Scope: MTS-51 9:00~11:30, 2016.6.13 A simple list of instruction set can be found in the lecture note of Chapter

More information

Microsoft Word - 4位7段LED?示 CH.doc

Microsoft Word - 4位7段LED?示 CH.doc 4 位 7 段 LED 显示 在单片机应用系统中经常使用发光二极管来显示, 发光二极管简称 LED (Light Emitting Diode) LED 的价格便宜, 而且配置比较灵活, 与单片机的接口也比较方便 在这里将讲解如何使用中颖的单片机进行 4 位 7 段 LED 显示的方法 1. 7 段 LED 的结构原理 单片机中经常使用 7 段 LED 来显示数字, 也就是用 7 个 LED 构成字型

More information

2 12

2 12 SHENZHEN BRILLIANT CRYSTAL TECHNOLOGIC CO.,LTD. The specification for the following models Graphic LCM serial communication control board CB001 PROPOSED BY APPROVED Design Approved TEL:+86-755-29995238

More information

Microsoft Word - IRFWX_A051_C_SyncMOS_with_STC_APN_SC_.doc

Microsoft Word - IRFWX_A051_C_SyncMOS_with_STC_APN_SC_.doc EEPROM 应用说明 1 适用产品 :SM59D03G2 SM59D04G2 series 2 应用范围 : 针对需使用 EEPORM 功能替换 STC 89C5X 的应用及汇编语言之范例程序 ( 使用内部扩充内存为暂存区 ) 3 功能说明 : 3.1 本公司上述产品 EEPORM 功能皆可替换 STC89C5X, 仅需对特殊功能缓存器定义 ( 详见表 1) 及 ISP 命令定义 ( 详见表 2)

More information

/ / / LED DOCNO: SG D REV11-2 -

/ / / LED DOCNO: SG D REV11-2 - SG24064-02D Version11 SG24064SYD-02DSYE LCD LED VDD STN 80 50V 50V SG24064SBD-02DSWE STN 80 50V 50V SG24064FPD-02DSWE FSTN 80 50V 50V SG24064SYD-02DSYE ND STN 80 50V 50V SG24064SBD-02DSWE ND STN 80 50V

More information

Microsoft Word - ISSFA-0109_B_SM59264_WDT_ APN_TC_.doc

Microsoft Word - ISSFA-0109_B_SM59264_WDT_ APN_TC_.doc Watch Dog Timer () 功能使用說明 ( 使用內部 250KHz) 適用產品 :SM59264 SM59128 SM8954A SM8958A SM89516A SM894051 SM79108 SM79164 SM59D03/04G2 應用說明 : 1 針對使用新茂 (SyncMOS)MCU, 如有因程式設計之關係, 需防止當機之發生時, 可啟動 Watch Dog 功能, 以防止當機之發生

More information

zw.PDF

zw.PDF 20 30 15 16 15 67 12 12 12 11 1508 4 18 4 600 343 37 9 9 12 9 30 90 1503 50 23 20 400 2.65 2 19 15 20 15 16 17 19 6 23 1642 600 350 1500 19 20 30 7 1816 1830 7 23 1830 1874 4 1874 1863 14 11 20 20 20 1905

More information

幻灯片 1

幻灯片 1 3 8086 Tel:2656809 tjx@csu.edu.cn 2005-9-14 1 2005-9-14 2 8086 8 8086 8086 7 2005-9-14 3 PC 2005-9-14 4 2005-9-14 5 81616 2005-9-14 6 [ ] MOV AX, 3064H AX=3064H 16AX OP 64H 30H 2005-9-14 7 16 AX BX CX

More information

00 sirius 3R SIRIUS 3R 3RV1 0A 1 3RT1 3RH1 3 3RU11/3RB SIRIUS SIRIUS TC= / 3RV1 A 1 IEC6097- IP0 ( IP00) 1/3 IEC6097- (VDE0660) DIN VDE 06 0 AC690V, I cu 00V 1) P A n I n I cu A kw A A ka S00 0.16 0.0

More information

() () () () () () () () DDRAM () II

() () () () () () () () DDRAM () II 液晶模块说明书 SPEC NO YM2232A REV NO. 液晶显示模块产品说明书 产品类型 : 产品型号 : 产品描述 : 标准产品 YM2232A 22x32 图形点阵模块, 控制器 :SED52,LED 背光 客户名称 : 客户确认 : 编写 : Dexun Zou 审核 : HCC 批准 : Jingxi Yang 发行日期 : 22.8 大连佳显电子有限公司 地址 : 大连市沙河口区工华街

More information

第10章:CCP捕捉/比较/脉宽调制

第10章:CCP捕捉/比较/脉宽调制 第 10 章 :CCP 捕捉 / 比较 / 脉宽调制 CCP 模块功能 捕捉功能模式 比较功能模式 脉宽调制功能 1 CCP 模块功能 PIC 2 捕捉 比较 脉宽调制模块 CCP1 CCP2(Capture/Compare/PWM) 16 CCPR1 CCPR2 模块 功能 功能 TMR1 TMR2 2 CCP 模块功能 CCP 模块 3 模式 : 捕捉 式 比较 式 脉宽调制 式 捕捉功能 捕捉

More information

untitled

untitled 2007 12 1 2 SIRIUS 3 4 5 6 2 2/2 3SB3 2/4 3SB3 2/5 3SB3 2/5 2/7 2/10 2/11 2/13 3SB3 2/14 3SB3 2/15 3SB3 2/17 3SB37 SIRIUS 3SB3 3SB3 (/) (/) (/) () Ø22mm (/) (/) (/) () 23 RONIS (/) (SB30) () 23 OMR (/)

More information

! *!"#$%&'()*+,-./#01 6, 8 6, 8 6, 8 8!"# ( / )!"# ( / )!"# ( / )! ( ) 3SB3!" Ø22mm!"# ( / ) 6, 8 6, 8 6, 8 8!"# ( / )!"# ( / )!"# ( ) 7, 10 7, 9 7, 8

! *!#$%&'()*+,-./#01 6, 8 6, 8 6, 8 8!# ( / )!# ( / )!# ( / )! ( ) 3SB3! Ø22mm!# ( / ) 6, 8 6, 8 6, 8 8!# ( / )!# ( / )!# ( ) 7, 10 7, 9 7, 8 SIRIUS 3SB3 sirius s ! *!"#$%&'()*+,-./#01 6, 8 6, 8 6, 8 8!"# ( / )!"# ( / )!"# ( / )! ( ) 3SB3!" Ø22mm!"# ( / ) 6, 8 6, 8 6, 8 8!"# ( / )!"# ( / )!"# ( ) 7, 10 7, 9 7, 8! (2 /3 ) ( / ) RONIS! ( SB) CES

More information

目录

目录 ALTERA_CPLD... 3 11SY_03091... 3 12SY_03091...4....5 21 5 22...8 23..10 24..12 25..13..17 3 1EPM7128SLC.......17 3 2EPM7032SLC.......18 33HT46R47......19..20 41..20 42. 43..26..27 5151DEMO I/O...27 52A/D89C51...28

More information

AT89C2051中文资料.doc

AT89C2051中文资料.doc 图形点阵液晶显示模块使用手册 TG12864C(L) 广州捷胜吉电子科技 地址 : 广州市天河区天河路 561# 新赛格电子城 B2226 电话 :(020)33550997 13829772038 网址 :WWW.GZJSJDZ.COM E-mail:CJKD@21CN.COM 目 录 ( 一 ) 概述 (1) ( 二 ) 外形尺寸图 (1) ( 三 ) 模块主要硬件构成说明 (2) ( 四 )

More information

<4D F736F F D204C434D78785A4BB1E0B3CCCBB5C3F7CAE92DB7E2C3E6>

<4D F736F F D204C434D78785A4BB1E0B3CCCBB5C3F7CAE92DB7E2C3E6> 青云创新带国标中文字库图形点阵液晶显示模块 Page 1 of 12 带中文字库图形点阵液晶显示模块 LCMxxZK 编程说明书 本说明书的内容如有修正, 恕不另行通知 未得青云创新的允许, 不得以任何理由将本说明书的内容以电子或机械的方式, 将档案转换成其它格式并予以重制 传输 版权 2002-08 BEIJING QINGYUN HI-TECH DEVELOPMENT CO.,LTD 版权所有,

More information

dfgdafhdafhdafhdafh

dfgdafhdafhdafhdafh 逢 甲 大 學 自 動 控 制 工 程 學 系 專 題 製 作 專 題 論 文 數 位 式 電 子 秤 之 研 製 Design Study of Digital Electronic Weighing Sensor 指 導 教 授 : 賴 啟 智 學 生 : 劉 人 豪 俞 仲 維 中 華 民 國 九 十 八 年 四 月 二 十 二 日 ii . 誌 謝 本 文 承 蒙 賴 啟 智 老 師 指 導,

More information

Hz 10MHz 0.5V 5V 0.01% 10s 2 0.5V 5V 1Hz 1kHz 10% 90% 1% 3 1Hz 1MHz 1% EPM7128SLC84-15 LM361 LM361 Zlg

Hz 10MHz 0.5V 5V 0.01% 10s 2 0.5V 5V 1Hz 1kHz 10% 90% 1% 3 1Hz 1MHz 1% EPM7128SLC84-15 LM361 LM361 Zlg 1 1 a. 0.5V 5V 1Hz 1MHz b. 0.1% 2 : a. 0.5V 5V 1Hz 1MHz b. 0.1% (3) a. 0.5V 5V 100 s b. 1% 4 1 10 5 1MHz 6 1 2 1 0.1Hz 10MHz 0.5V 5V 0.01% 10s 2 0.5V 5V 1Hz 1kHz 10% 90% 1% 3 1Hz 1MHz 1% EPM7128SLC84-15

More information

SIGNUM 3SB3

SIGNUM 3SB3 SGNUM * 6, 8 6, 8 6, 8 8 : : : : ( ) Ø22mm 6, 8 6, 8 6, 8 8 : : : : ( ) 7, 10 7, 9 7, 8 : (2 /3 ) RNS ( SB) : : CES / BKS : ( / ) 10 7, 8 : (2 /3 ) RNS ( 360012K1) : : MR : 7 Ø22mm 16 16 16 16 : : : :

More information

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File 51 C 51 51 C C C C C C * 2003-3-30 pnzwzw@163.com C C C C KEIL uvision2 MCS51 PLM C VC++ 51 KEIL51 KEIL51 KEIL51 KEIL 2K DEMO C KEIL KEIL51 P 1 1 1 1-1 - 1 Project New Project 1 2 Windows 1 3 N C test

More information

8051初学实验教程系列五.doc

8051初学实验教程系列五.doc 实验一 : 扩展存储器读写实验 一. 实验要求编制简单程序, 对实验板上提供的外部存贮器 (62256) 进行读写操作 二. 实验目的 1. 学习片外存储器扩展方法 2. 学习数据存储器不同的读写方法 三. 实验电路及连线 将 P1.0 接至 L1 CS256 连 GND 孔 四. 实验说明 1. 单片机系统中, 对片外存贮器的读写操作是最基本的操作 用户藉此来熟悉 MCS51 单片机编程的基本规则

More information

Microsoft Word - MSP430 Launchpad 指导书.docx

Microsoft Word - MSP430 Launchpad 指导书.docx Contents 3... 9... 14 MSP430 LAUNCHPAD 指导书 3 第一部分第一个工程 New Project File > New > CCS Project Project name: ButtonLED Device>Family: MSP430 Variant: MSP430G2553 Project templates and examples : Empty Project

More information

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha CYPOK CYPOK 1 UltraEdit Project-->Install Language Tool: Language Suite----->hi-tech picc Tool Name ---->PICC Compiler Executable ---->c:hi-picinpicc.exe ( Command-line Project-->New Project-->File Name--->myc

More information

??????????????????

?????????????????? 2011 3 1 a)8088/8086 b) 1 2 3 -(2) - 48 (48 6) 1 2 http://www.zlgmcu.com/home.asp http://hx51.com/index.asp http://www.daqchina.net/daqchina/chips DAQCHINA HTTP://WWW.QFMCU.COM/ HTTP://MYGO.7I24.COM/ HTTP://WWW.HSEDA.COM/

More information

微處理機

微處理機 3-1 指令格式 標記運算碼運算元註解 標記 1. 標記前不可有空白, 否則會被視為運算碼 2. 標記代表一個 16 位元的記憶體實際位址 3. 標記名稱最多 32 個字元 ( 視組譯器不同而有所不同 ) 4. 標記有大小寫之分 5. 標記可有可無 運算碼 1. 運算碼與標記名稱間, 至少必須空一格, 如果沒有標記名稱, 則運算碼前最少要空一格, 否則會被視為標記 2. 運算碼大小寫相同 3. 可以是

More information

Microsoft Word - LMB402CBC-AppNote-V0.1.doc

Microsoft Word - LMB402CBC-AppNote-V0.1.doc LMB402CBC 液晶显示模块应用参考 深圳市拓普微科技开发有限公司 版本描述日期编者 0.1 新版本 2006-02-09 杨军 http://www.topwaysz.com 1 / 1 目录 1 概述 3 2 硬件接口 3 3 软件特性 3 3.1 控制器接口信号说明 3 3.2 模块指令系统 4 4 显示数据存储器的地址 4 5 字符发生器 CGRAM 的地址 5 6 应用举例 5 6.1

More information

一:概述

一:概述 EDM12864A 图形点阵式液晶显示器模块原理与应用手册 大连东福彩色液晶显示器有限公司 一 概述 EDM12864A 液晶显示器模块是全屏幕图形点阵式液晶显示器组件, 由控制器 驱动器和全点阵液晶显示器组成 可完成图形显示, 也可以显示汉字 (4 8 个 16 16 点阵汉字 ); 与 CPU 接口是 8 位数据线和几条地址线, 而不用另外加控制器 ( 如 HD61830 等 ), 另外 3 条电源线供芯片和

More information

bingdian001.com

bingdian001.com TSM12M TSM12 STM8L152C6, STM8L152R8 MSP430F5325 whym1987@126.com! /******************************************************************************* * : TSM12.c * : * : 2013/10/21 * : TSM12, STM8L f(sysclk)

More information

查询 AD0809 供应商 捷多邦, 专业 PCB 打样工厂,24 小时加急出货 51 测试网论坛 单片机征文大赛稿件, 非本站以及作者 同意禁止转载, 欢迎会员投稿! 欢迎投票评论! 中国. 深圳.51 测试网

查询 AD0809 供应商 捷多邦, 专业 PCB 打样工厂,24 小时加急出货 51 测试网论坛   单片机征文大赛稿件, 非本站以及作者 同意禁止转载, 欢迎会员投稿! 欢迎投票评论! 中国. 深圳.51 测试网 查询 AD0809 供应商 捷多邦, 专业 PCB 打样工厂,24 小时加急出货 51 测试网论坛 http://www.8951.com/bbs/index.asp 单片机征文大赛稿件, 非本站以及作者 同意禁止转载, 欢迎会员投稿! 欢迎投票评论! 中国. 深圳.51 测试网 www.8951.com AD0809 在 51 单片机中的应用 51 测试网论坛版主 / 黄海我们在做一个单片机系统时,

More information

Ps22Pdf

Ps22Pdf ( ) 158 :,,,,,, : 850 1168 1/ 32 : 12 : 311 1994 1 1 1998 11 2 : 5001 10000 ISBN 7 302 01340 3/ T B 15 : 13 00 ,,, 10 7, 2 80%, : 1 ;, :, :, ;, ;, 30%,,,, 20,,,, ,,,,,,!,,,! 1992 10 1 1 11 15 27 34 34

More information

FY.DOC

FY.DOC 高 职 高 专 21 世 纪 规 划 教 材 C++ 程 序 设 计 邓 振 杰 主 编 贾 振 华 孟 庆 敏 副 主 编 人 民 邮 电 出 版 社 内 容 提 要 本 书 系 统 地 介 绍 C++ 语 言 的 基 本 概 念 基 本 语 法 和 编 程 方 法, 深 入 浅 出 地 讲 述 C++ 语 言 面 向 对 象 的 重 要 特 征 : 类 和 对 象 抽 象 封 装 继 承 等 主

More information

93C46串行EEPROM数据读写

93C46串行EEPROM数据读写 一 \ 实验目的 93C46 串行 EEPROM 数据读写 1 学会 93C46 的操作指令, 掌握 93C46 读 / 写程序的编写 2 掌握 93C46 与单片机的接口方式二 实验说明 93C46/56/66 是 1K/2K/4K 位的串行电可擦写的 EPROM 93C46 的 1K 位 EPROM, 可以按 128 字节排列, 也可以 64 字节排列 93C46 芯片有 8 脚, 当 ORG

More information

7688使用手冊V10.doc

7688使用手冊V10.doc TP-7688 . 2 2. 3 3. 5 4. 5 5. 6 6. 7 7. 8 8. 9 9.. 4. 7 2 2., 7x9 / 6x9 7x9.3() x 3.()mm 6x9 2.84() x 3.()mm 3 ASCII 7x9 95 ASCII 6x9 95 6x9 7 BIG5 6x9 3973 6x9 28 7x9 24 24 55 6x9 2 2 27 4.23mm (/6 inch)

More information

第5章修改稿

第5章修改稿 (Programming Language), ok,, if then else,(), ()() 5.0 5.0.0, (Variable Declaration) var x : T x, T, x,,,, var x : T P = x, x' : T P P, () var x:t P,,, yz, var x : int x:=2. y := x+z = x, x' : int x' =2

More information

设计思路 : 以定时器 / 计数器 0 来对脉冲进行计数, 数据用 8279 芯片连接 LED 数码管实现累进显示 程序分为主程序和中断服务程序两部分 主程序主要实现初始化 循环显示 而累计数在中断服务程序中完成 主程序设计 : 1) 实现初始化包括设置堆栈指针 8279 芯片初始化 定时器 / 计

设计思路 : 以定时器 / 计数器 0 来对脉冲进行计数, 数据用 8279 芯片连接 LED 数码管实现累进显示 程序分为主程序和中断服务程序两部分 主程序主要实现初始化 循环显示 而累计数在中断服务程序中完成 主程序设计 : 1) 实现初始化包括设置堆栈指针 8279 芯片初始化 定时器 / 计 51 单片机,msp430,avr 单片机, 单片机开发板 单片机教程网 (www.mcujc.com) 是专业提供各种单片机教程 资料 程序, 为初学者打造一个良好的学习交流的平台! 导航 单片机教程网 51 单片机 198.00 MSP430 单片机 AVR 单片机嵌入式单片机论坛给我留言淘宝店铺 2013 冬装新款女装小 2013 新款海宁皮草外 538.46 «51 单片机驱动模数转换器 ads774

More information

电子技术基础 ( 第 版 ) 3. 图解单相桥式整流电路 ( 图 4-1-3) 电路名称电路原理图波形图 整流电路的工作原理 1. 单相半波整流电路 u 1 u u sin t a t 1 u 0 A B VD I A VD R B

电子技术基础 ( 第 版 ) 3. 图解单相桥式整流电路 ( 图 4-1-3) 电路名称电路原理图波形图 整流电路的工作原理 1. 单相半波整流电路 u 1 u u sin t a t 1 u 0 A B VD I A VD R B 直流稳压电源 第 4 章 4.1 整流电路及其应用 学习目标 1. 熟悉单相整流电路的组成, 了解整流电路的工作原理. 掌握单相整流电路的输出电压和电流的计算方法, 并能通过示波器观察整流电路输出电压的波形 3. 能从实际电路中识读整流电路, 通过估算, 能合理选用整流元器件 4.1.1 认识整流电路 1. 图解单相半波整流电路 ( 图 4-1-1) 电路名称电路原理图波形图 4-1-1. 图解单相全波整流电路

More information

Microsoft Word - ha0013s.doc

Microsoft Word - ha0013s.doc 文件编码 :HA0013s 简介 : 本文介绍利用 8 位微控制器控制 DV16100NRB 液晶显示驱动器的方法 该 LCM 由内置的 Hitachi HD44780 进行驱动及控制 本文应用中, 着重考虑如何使微控制器产生正确的信号以符合 LCM 所需的时序 若要获得详细的时序及指令信息, 请查阅 LCM 厂商的资料 LCM 能以 4 位或 8 位模式工作 在 4 位模式下, 传送一个字符或一条指令需两个传输周期完成

More information

instructions.PDF

instructions.PDF 94 SIMATIC (END) (END) Micro/WIN 32 (STOP) (STOP) CPU RUN STOP STOP CPU RUN STOP (WDR) (Watchdog Reset) (WDR) CPU WDR WDR ( ) I/O ( I/O ) SM (SM0 SM5 SM29 ) 25 0 ms 00 ms STOP 300ms 300ms WDR S7-200 CPU

More information

郑州轻工业学院本科

郑州轻工业学院本科 郑州轻工业学院 计算机与通信工程学院 单片机原理及应用课程设计总结报告 设计题目 : 十字路口交通灯控制 学生姓名 : 系别 : 专业 : 班级 : 学号 : 指导教师 : 2011 年 12 月 24 日 郑州轻工业学院 课程设计任务书 题目 十字路口交通灯控制 专业 班级学号姓名 主要内容 基本要求 主要参考资料等 : 目录 : 基本要求... 2 设计方案简介... 2 系统需求分析... 2

More information

MSP430 MSP430 F149 MSP430F149 P USART MSP430F PWM 63#

MSP430 MSP430 F149 MSP430F149 P USART MSP430F PWM 63# MSP430 MSP430 0002 63# 710061 2003 7 63# 710061 1 MSP430 MSP430 F149 MSP430F149 P USART MSP430F149 485 232 PWM 63# 710061 2 MSP430 MSP430 16 FLASH,, 16, 64K,, 16 14 12 6 P USART DCO, 8M FLASH,, JTAG FET(FLASH

More information

Ps22Pdf

Ps22Pdf ,, 19,, 1834,,,,, :,,,, , 1862, 1879 20 20,,,,??,,,,,,,,,,,, , ( ),,,,,,,, ( ),,,,,,,, 9 : (1 ) :,,,, , 91 95% (2 ) : ( ) - - -,, (3 ) : PN,, (4 ) : (5 ) : (6 ) : (7 ) (8 ) (9 ),,, :,,,,,,,, ;,, ,,,,,

More information

Microsoft Word - 0.逶ョ谺。H19.4

Microsoft Word - 0.逶ョ谺。H19.4 JIS JWWA JWWA JIS B 0202 0203 0205 1051 1, 1180 1181 2062 2239 2301 7507 7516 7524 G 3101 3443 3454 3457 3459 3468 3505 3506 3507 3532 4051 4303 4304 4305 4308 JIS G 4309 4315 5121 5502 5503 5526 5527

More information

单片机键盘接口全接触{ }.doc

单片机键盘接口全接触{ }.doc 单片机键盘接口全接触 作者 : 杜洋 2005-10-25 一般的具有人机对话的单片机系统少不了会有键盘 键盘接口的原理与应用许多的教材都有介绍, 但通常各有各的方法, 各有各的优劣 下面就我现有的对单片机键盘接口的了解和应用将众家的单片机直接驱动键盘的接口原理及应用作一个总结, 并附加相应键盘的汇编子程序和 C 语言子函数 希望大家可以从中受益 本文我们以键盘的数目来选择键盘最适合的接法和最佳的编程方法,

More information

呕血推荐51程序库,希望大家能资源共享

呕血推荐51程序库,希望大家能资源共享 MCS-51 ; RAM IBCLR: MOV A,R0 MOV R1,A IBC1 : MOV @R1,A INC R1 DJNZ R7,IBC1 ; RAM EBCLR1: MOV A,ADDPL MOV DPL,A MOV A,ADDPH MOV DPH,A EBC11: MOVX @DPTR,A INC DPTR DJNZ R7,EBC11 ; RAM ( ) EBCLR2: MOV A,ADDPL

More information

该 奈 自 受 PZ 多 透 soc i e B t h y. y t is NA YL OR exp os ed t h a t b e i n g wh o res or sa in t es s e s we r e m ad e n b ot om. M ean wh i l e NA YL

该 奈 自 受 PZ 多 透 soc i e B t h y. y t is NA YL OR exp os ed t h a t b e i n g wh o res or sa in t es s e s we r e m ad e n b ot om. M ean wh i l e NA YL 探 性 通 性 圣 重 ' 颠 并 格 洛 丽 亚 奈 勒 小 说 贝 雷 的 咖 啡 馆 对 圣 经 女 性 的 重 写 郭 晓 霞 内 容 提 要 雷 的 咖 啡 馆 中 权 社 会 支 配 的 女 性 形 象 美 国 当 代 著 名 黑 人 女 作 家 格 洛 丽 亚 过 对 6 个 圣 经 女 性 故 事 的 重 写 奈 勒 在 其 小 说 贝 覆 了 圣 经 中 被 父 揭 示 了 传 统

More information

Ps22Pdf

Ps22Pdf ) ,,, :,,,,,,, ( CIP) /. :, 2001. 9 ISBN 7-5624-2368-7.......... TU311 CIP ( 2001) 061075 ( ) : : : : * : : 174 ( A ) : 400030 : ( 023) 65102378 65105781 : ( 023) 65103686 65105565 : http: / / www. cqup.

More information

1

1 W7E65 1. W7E65 ISP Flash EPROM ISP Flash EPROM 52 W7E65 64K Flash EPROM 4K Flash EPROM 4K Flash EPROM loader 64K ROM 1K RAM 4 I/O 4 I/O P4 3 16 / 2 W7E65 Flash EPROM W7E65 2 2 2. CMOS 12 64K ISP Flash

More information

Microsoft Word - 透析8051之迴圈控制方法.doc

Microsoft Word - 透析8051之迴圈控制方法.doc 透析 8051 之分支跳躍與迴圈控制 - 利用 VB 的程式觀念解說 迴圈的控制方法不失為寫程式最重要的技巧之所在之一, 它搭配邏輯運算的判斷作為迴圈繼續執行的判斷依據, 程式設計師必須考量分析所有可能的情況, 然後給予不同的條件, 當條件成立時執行某段程式, 不符合時執行另一段程式, 然後重複某項任務, 直到使用者中斷程式的執行, 或是條件喪失時才跳出迴圈 也可能一個程式重複著無止盡的迴圈, 直到關閉電源為止,

More information

诺贝尔生理学医学奖获奖者

诺贝尔生理学医学奖获奖者 诺 贝 尔 生 理 学 医 学 奖 获 奖 者 1901 年 E.A.V. 贝 林 ( 德 国 人 ) 从 事 有 关 白 喉 血 清 疗 法 的 研 究 1902 年 R. 罗 斯 ( 英 国 人 ) 从 事 有 关 疟 疾 的 研 究 1903 年 N.R. 芬 森 ( 丹 麦 人 ) 发 现 利 用 光 辐 射 治 疗 狼 疮 1904 年 I.P. 巴 甫 洛 夫 ( 俄 国 人 ) 从 事

More information