单片机课件--第8章
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ຫໍສະໝຸດ Baidu
while (P1_1= =1) {;} P1_0=1; P1_0=0; SCON=0x10; while (!RI) {;} RI=0; i=SBUF; …… }
【例6】某工业监控系统,具有温度、压力、PH值等多路监控功 某工业监控系统,具有温度、压力、PH值等多路监控功 能,中断源的连接如图5.26所示。对于PH值,在小于7时向CPU申 中断源的连接如图5.26所示。对于PH值 在小于7时向CPU申 5.26所示 PH CPU 请中断,CPU响应中断后使P3.0引脚输出高电平,经驱动, 请中断,CPU响应中断后使P3.0引脚输出高电平,经驱动,使加 响应中断后使P3.0引脚输出高电平 碱管道电磁阀接通1秒钟,以调整PH值 碱管道电磁阀接通1秒钟,以调整PH值。 PH
【例4】用8051单片机的串行口外接串入并出的芯片CD4094扩 8051单片机的串行口外接串入并出的芯片CD4094扩 单片机的串行口外接串入并出的芯片CD4094 展并行输出口控制一组发光二极管, 展并行输出口控制一组发光二极管,使发光二极管从左至右延 时轮流显示。 时轮流显示。 CD4094是一块8位的串入并出的芯片,带有一个控制端STB, CD4094是一块8位的串入并出的芯片,带有一个控制端STB,当 是一块 STB STB=0时,打开串行输入控制门,在时钟信号CLK的控制下,数据 STB=0时 打开串行输入控制门,在时钟信号CLK的控制下, CLK的控制下 从串行输入端DATA一个时钟周期一位依次输入; STB=1, 从串行输入端DATA一个时钟周期一位依次输入;当STB=1,打开 DATA一个时钟周期一位依次输入 并行输出控制门,CD4094中的8位数据并行输出。使用时, 并行输出控制门,CD4094中的8位数据并行输出。使用时,8051 中的 串行口工作于方式0 8051的TXD接CD4094的CLK,RXD接DATA, 串行口工作于方式0,8051的TXD接CD4094的CLK,RXD接DATA, STB用P1.0控制, 位并行输出端接8个发光二极管。如图所示。 STB用P1.0控制,8位并行输出端接8个发光二极管。如图所示。 控制
8051单片机的串行口外接并入串出的芯片 【例5】 用8051单片机的串行口外接并入串出的芯片 CD4014扩展并行输入口,输入一组开关的信息。 CD4014扩展并行输入口,输入一组开关的信息。 扩展并行输入口
CD4014是一块8位的并入串出的芯片, CD4014是一块8位的并入串出的芯片,带有一个控制端 是一块 P/S,当P/S=1时,8位并行数据置入到内部的寄存器;当 P/S, P/S=1时 位并行数据置入到内部的寄存器; P/S=0时,在时钟信号CLK的控制下,内部寄存器的内容按低 P/S=0时 在时钟信号CLK的控制下, CLK的控制下 位在前从QB串行输出端依次输出;使用时,8051串行口工作 位在前从QB串行输出端依次输出;使用时,8051串行口工作 QB串行输出端依次输出 于方式0 8051的TXD接CD4094的CLK,RXD接QB,P/S用 于方式0,8051的TXD接CD4094的CLK,RXD接QB,P/S用P1.0 控制,另外, P1.1控制8并行数据的置入。如图所示。 控制,另外,用P1.1控制8并行数据的置入。如图所示。 控制
(1)采用中断处理方式的程序: (1)采用中断处理方式的程序: 采用中断处理方式的程序 语言程序: C语言程序: //包含特殊功能寄存器库 # include <reg51.h> //包含特殊功能寄存器库 sbit P1_0=P1^0; void main() { TMOD=0x02; TH0=0x06;TL0=0x06; EA=1;ET0=1; TR0=1; while(1); } //中断服务程序 void time0_int(void) interrupt 1 //中断服务程序 { P1_0=!P1_0; }
系统监控通过外中断INT0来实现,这里就涉及多个中断源的处理, 系统监控通过外中断INT0来实现,这里就涉及多个中断源的处理,处 INT0来实现 理时往往通过中断加查询的方法来实现。多个中断源通过“线或” 理时往往通过中断加查询的方法来实现。多个中断源通过“线或”接于 INT0上 那么无论哪个中断源提出请求,系统都会响应中断,响应后, INT0上。那么无论哪个中断源提出请求,系统都会响应中断,响应后,进 入中断服务程序,在中断服务程序中通过对P1 P1口线的逐一检测来确定哪一 入中断服务程序,在中断服务程序中通过对P1口线的逐一检测来确定哪一 个中断源的提出了中断请求, 个中断源的提出了中断请求,进一步转到对应的中断服务程序入口位置执 行对应的处理程序。这里只针对PH<7 PH<7时的中断构造了相应的中断服务程序 行对应的处理程序。这里只针对PH<7时的中断构造了相应的中断服务程序 INT02,接通电磁阀延时1秒钟的延时子程序DELAY已经构造好了, DELAY已经构造好了 INT02,接通电磁阀延时1秒钟的延时子程序DELAY已经构造好了,只须调用 即可。 即可。
【例3】设系统时钟频率为12MHZ,编程实现从P1.1输出周期为 设系统时钟频率为12MHZ,编程实现从P1.1输出周期为 12MHZ P1.1 1s的方波 的方波。 1s的方波。 根据例2的处理过程,这时应产生500ms的周期性的定时, 500ms的周期性的定时 根据例2的处理过程,这时应产生500ms的周期性的定时, 定时到则对P1.1取反就可实现。由于定时时间较长, P1.1取反就可实现 定时到则对P1.1取反就可实现。由于定时时间较长,一个定时 计数器不能直接实现,可用定时/计数器T0产生周期性为10ms T0产生周期性为 /计数器不能直接实现,可用定时/计数器T0产生周期性为10ms 的定时,然后用一个寄存器R2 10ms计数50次或用定时 R2对 计数50次或用定时/ 的定时,然后用一个寄存器R2对10ms计数50次或用定时/计数 T1对10ms计数50次实现 系统时钟为12MHZ 定时/计数器T0 计数50次实现。 12MHZ, 器T1对10ms计数50次实现。系统时钟为12MHZ,定时/计数器T0 定时10ms 计数值N 10000,只能选方式1 10ms, 定时10ms,计数值N为10000,只能选方式1,方式控制字为 00000001B(01H), 00000001B(01H), 初值X 初值X: X=65536X=65536-10000=55536=1101100011110000B TH0=11011000B=D8H,TL0=11110000B=F0H。 则TH0=11011000B=D8H,TL0=11110000B=F0H。
第8章
综合实例
利用单片机的P0口接8个发光二极管,P1口接 P0口接 口接8 【例1】 利用单片机的P0口接8个发光二极管,P1口接8个开 关,编程实现,当开关动作时,对应的发光二极管亮或灭。 编程实现,当开关动作时,对应的发光二极管亮或灭。 只须把P0口的内容读出后,通过P1口输出即可。 只须把P0口的内容读出后,通过P1口输出即可。 P0口的内容读出后 P1口输出即可 C51语言程序: C51语言程序: 语言程序 #include <reg51.h> void main(void) { unsigned char i; P0=0xff; for(;;) { i=P0;P1=i; } }
设系统时钟频率为12MHZ 用定时/计数器T0 12MHZ, T0编程实 【例2】 设系统时钟频率为12MHZ,用定时/计数器T0编程实 现从P1.0输出周期为500μs的方波。 现从P1.0输出周期为500μs的方波。 P1.0输出周期为500μs的方波 分析:从P1.0输出周期为500μs的方波,只须P1.0每250μs 分析: P1.0输出周期为500μs的方波,只须P1.0每 输出周期为500μs的方波 P1.0 取反一次则可。当系统时钟为12MHZ,定时/计数器T0工作于 取反一次则可。当系统时钟为12MHZ,定时/计数器T0工作于 12MHZ T0 方式2 方式2时,最大的定时时间为256μs,满足250μs的定时要求, 最大的定时时间为256μs,满足250μs的定时要求, 256μs 250μs的定时要求 方式控制字应设定为00000010B(02H)。系统时钟为12MHZ, 方式控制字应设定为00000010B(02H)。系统时钟为12MHZ, 00000010B )。系统时钟为12MHZ 定时250μs,计数值N 250,初值X=256-250=6, 定时250μs,计数值N为250,初值X=256-250=6,则 250μs X=256 TH0=TL0=06H。 TH0=TL0=06H。
电磁阀
P3.0
P3.2 INT0
温度1超限 温度2超限 Q D +5V
8051 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
R CLK PH值超限 压力超限
C语言程序: 语言程序: 语言程序 void int02() #include <reg51.h> { sbit P10=P1^0; unsigned char i; sbit P11=P1^1; P30=1; sbit P12=P1^2; for (i=0;i<255;i++) ; sbit P13=P1^3; P30=0; sbit P16=P1^6; P16=0;P16=1; sbit P30=P3^0; } void int0() interrupt 0 using1 void main() ( { { PX0=1; /*设置外部中断 为高 设置外部中断0为高 = 设置外部中断 void int00(); 优先级中断*/ 优先级中断 void int01(); EX0=1; /*开外部中断 允许 开外部中断0允许 = 开外部中断 允许*/ void int02(); EA=1; /*开中断 开中断*/ = ; 开中断 void int03(); if (P10= =1) {int00();} //查询调用对应的函数 P10=1; P11=1; P12=1; P13=1; 查询调用对应的函数 for(;;)} (;;) else if (P11= =1) {int01();} else if (P12= =1) {int02();} else if (P13= =1) {int03();} }
8051 K0 RXD TXD P1.0 P1.1 QB CLK P/S K7 K
C语言程序: 语言程序: 语言程序 # include <reg51.h> //包含特殊功能 包含特殊功能 寄存器库 sbit P1_0=P1^0; sbit P1_1=P1^1; void main() { unsigned char i; P1_1=1;
8051
RXD TXD P1.0
DATA CLK STB
C语言程序: 语言程序: # include <reg51.h> 特殊功能寄存器库 sbit P1_0=P1^0; void main() { unsigned char i,j; SCON=0x00; j=0x01;
//包含 //包含
for (; ;) { P1_0=0; SBUF=j; while (!TI) { ;} P1_0=1;TI=0; for (i=0;i<=254;i++) {;} j=j*2; if (j= =0x00) j=0x01; } }
C语言程序: 语言程序: 语言程序 # include <reg51.h> //包含特殊功能寄存器库 包含特殊功能寄存器库 sbit P1_1=P1^1; char i; void main() { TMOD=0x01; TH0=0xD8;TL0=0xf0; EA=1;ET0=1; i=0; TR0=1; while(1); } void time0_int(void) interrupt 1 //中断服务程序 中断服务程序 { TH0=0xD8;TL0=0xf0; i++; if (i= =50) {P1_1=! P1_1;i=0;} }
(2)采用查询方式处理的程序 C语言程序: 语言程序: //包含特殊功能寄存器库 # include <reg51.h> //包含特殊功能寄存器库 sbit P1_0=P1^0; void main() { char i; TMOD=0x02; TH0=0x06;TL0=0x06; TR0=1; for(;;) { //查询计数溢出 if (TF0) { TF0=0;P1_0=! P1_0;} //查询计数溢出 } }
while (P1_1= =1) {;} P1_0=1; P1_0=0; SCON=0x10; while (!RI) {;} RI=0; i=SBUF; …… }
【例6】某工业监控系统,具有温度、压力、PH值等多路监控功 某工业监控系统,具有温度、压力、PH值等多路监控功 能,中断源的连接如图5.26所示。对于PH值,在小于7时向CPU申 中断源的连接如图5.26所示。对于PH值 在小于7时向CPU申 5.26所示 PH CPU 请中断,CPU响应中断后使P3.0引脚输出高电平,经驱动, 请中断,CPU响应中断后使P3.0引脚输出高电平,经驱动,使加 响应中断后使P3.0引脚输出高电平 碱管道电磁阀接通1秒钟,以调整PH值 碱管道电磁阀接通1秒钟,以调整PH值。 PH
【例4】用8051单片机的串行口外接串入并出的芯片CD4094扩 8051单片机的串行口外接串入并出的芯片CD4094扩 单片机的串行口外接串入并出的芯片CD4094 展并行输出口控制一组发光二极管, 展并行输出口控制一组发光二极管,使发光二极管从左至右延 时轮流显示。 时轮流显示。 CD4094是一块8位的串入并出的芯片,带有一个控制端STB, CD4094是一块8位的串入并出的芯片,带有一个控制端STB,当 是一块 STB STB=0时,打开串行输入控制门,在时钟信号CLK的控制下,数据 STB=0时 打开串行输入控制门,在时钟信号CLK的控制下, CLK的控制下 从串行输入端DATA一个时钟周期一位依次输入; STB=1, 从串行输入端DATA一个时钟周期一位依次输入;当STB=1,打开 DATA一个时钟周期一位依次输入 并行输出控制门,CD4094中的8位数据并行输出。使用时, 并行输出控制门,CD4094中的8位数据并行输出。使用时,8051 中的 串行口工作于方式0 8051的TXD接CD4094的CLK,RXD接DATA, 串行口工作于方式0,8051的TXD接CD4094的CLK,RXD接DATA, STB用P1.0控制, 位并行输出端接8个发光二极管。如图所示。 STB用P1.0控制,8位并行输出端接8个发光二极管。如图所示。 控制
8051单片机的串行口外接并入串出的芯片 【例5】 用8051单片机的串行口外接并入串出的芯片 CD4014扩展并行输入口,输入一组开关的信息。 CD4014扩展并行输入口,输入一组开关的信息。 扩展并行输入口
CD4014是一块8位的并入串出的芯片, CD4014是一块8位的并入串出的芯片,带有一个控制端 是一块 P/S,当P/S=1时,8位并行数据置入到内部的寄存器;当 P/S, P/S=1时 位并行数据置入到内部的寄存器; P/S=0时,在时钟信号CLK的控制下,内部寄存器的内容按低 P/S=0时 在时钟信号CLK的控制下, CLK的控制下 位在前从QB串行输出端依次输出;使用时,8051串行口工作 位在前从QB串行输出端依次输出;使用时,8051串行口工作 QB串行输出端依次输出 于方式0 8051的TXD接CD4094的CLK,RXD接QB,P/S用 于方式0,8051的TXD接CD4094的CLK,RXD接QB,P/S用P1.0 控制,另外, P1.1控制8并行数据的置入。如图所示。 控制,另外,用P1.1控制8并行数据的置入。如图所示。 控制
(1)采用中断处理方式的程序: (1)采用中断处理方式的程序: 采用中断处理方式的程序 语言程序: C语言程序: //包含特殊功能寄存器库 # include <reg51.h> //包含特殊功能寄存器库 sbit P1_0=P1^0; void main() { TMOD=0x02; TH0=0x06;TL0=0x06; EA=1;ET0=1; TR0=1; while(1); } //中断服务程序 void time0_int(void) interrupt 1 //中断服务程序 { P1_0=!P1_0; }
系统监控通过外中断INT0来实现,这里就涉及多个中断源的处理, 系统监控通过外中断INT0来实现,这里就涉及多个中断源的处理,处 INT0来实现 理时往往通过中断加查询的方法来实现。多个中断源通过“线或” 理时往往通过中断加查询的方法来实现。多个中断源通过“线或”接于 INT0上 那么无论哪个中断源提出请求,系统都会响应中断,响应后, INT0上。那么无论哪个中断源提出请求,系统都会响应中断,响应后,进 入中断服务程序,在中断服务程序中通过对P1 P1口线的逐一检测来确定哪一 入中断服务程序,在中断服务程序中通过对P1口线的逐一检测来确定哪一 个中断源的提出了中断请求, 个中断源的提出了中断请求,进一步转到对应的中断服务程序入口位置执 行对应的处理程序。这里只针对PH<7 PH<7时的中断构造了相应的中断服务程序 行对应的处理程序。这里只针对PH<7时的中断构造了相应的中断服务程序 INT02,接通电磁阀延时1秒钟的延时子程序DELAY已经构造好了, DELAY已经构造好了 INT02,接通电磁阀延时1秒钟的延时子程序DELAY已经构造好了,只须调用 即可。 即可。
【例3】设系统时钟频率为12MHZ,编程实现从P1.1输出周期为 设系统时钟频率为12MHZ,编程实现从P1.1输出周期为 12MHZ P1.1 1s的方波 的方波。 1s的方波。 根据例2的处理过程,这时应产生500ms的周期性的定时, 500ms的周期性的定时 根据例2的处理过程,这时应产生500ms的周期性的定时, 定时到则对P1.1取反就可实现。由于定时时间较长, P1.1取反就可实现 定时到则对P1.1取反就可实现。由于定时时间较长,一个定时 计数器不能直接实现,可用定时/计数器T0产生周期性为10ms T0产生周期性为 /计数器不能直接实现,可用定时/计数器T0产生周期性为10ms 的定时,然后用一个寄存器R2 10ms计数50次或用定时 R2对 计数50次或用定时/ 的定时,然后用一个寄存器R2对10ms计数50次或用定时/计数 T1对10ms计数50次实现 系统时钟为12MHZ 定时/计数器T0 计数50次实现。 12MHZ, 器T1对10ms计数50次实现。系统时钟为12MHZ,定时/计数器T0 定时10ms 计数值N 10000,只能选方式1 10ms, 定时10ms,计数值N为10000,只能选方式1,方式控制字为 00000001B(01H), 00000001B(01H), 初值X 初值X: X=65536X=65536-10000=55536=1101100011110000B TH0=11011000B=D8H,TL0=11110000B=F0H。 则TH0=11011000B=D8H,TL0=11110000B=F0H。
第8章
综合实例
利用单片机的P0口接8个发光二极管,P1口接 P0口接 口接8 【例1】 利用单片机的P0口接8个发光二极管,P1口接8个开 关,编程实现,当开关动作时,对应的发光二极管亮或灭。 编程实现,当开关动作时,对应的发光二极管亮或灭。 只须把P0口的内容读出后,通过P1口输出即可。 只须把P0口的内容读出后,通过P1口输出即可。 P0口的内容读出后 P1口输出即可 C51语言程序: C51语言程序: 语言程序 #include <reg51.h> void main(void) { unsigned char i; P0=0xff; for(;;) { i=P0;P1=i; } }
设系统时钟频率为12MHZ 用定时/计数器T0 12MHZ, T0编程实 【例2】 设系统时钟频率为12MHZ,用定时/计数器T0编程实 现从P1.0输出周期为500μs的方波。 现从P1.0输出周期为500μs的方波。 P1.0输出周期为500μs的方波 分析:从P1.0输出周期为500μs的方波,只须P1.0每250μs 分析: P1.0输出周期为500μs的方波,只须P1.0每 输出周期为500μs的方波 P1.0 取反一次则可。当系统时钟为12MHZ,定时/计数器T0工作于 取反一次则可。当系统时钟为12MHZ,定时/计数器T0工作于 12MHZ T0 方式2 方式2时,最大的定时时间为256μs,满足250μs的定时要求, 最大的定时时间为256μs,满足250μs的定时要求, 256μs 250μs的定时要求 方式控制字应设定为00000010B(02H)。系统时钟为12MHZ, 方式控制字应设定为00000010B(02H)。系统时钟为12MHZ, 00000010B )。系统时钟为12MHZ 定时250μs,计数值N 250,初值X=256-250=6, 定时250μs,计数值N为250,初值X=256-250=6,则 250μs X=256 TH0=TL0=06H。 TH0=TL0=06H。
电磁阀
P3.0
P3.2 INT0
温度1超限 温度2超限 Q D +5V
8051 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
R CLK PH值超限 压力超限
C语言程序: 语言程序: 语言程序 void int02() #include <reg51.h> { sbit P10=P1^0; unsigned char i; sbit P11=P1^1; P30=1; sbit P12=P1^2; for (i=0;i<255;i++) ; sbit P13=P1^3; P30=0; sbit P16=P1^6; P16=0;P16=1; sbit P30=P3^0; } void int0() interrupt 0 using1 void main() ( { { PX0=1; /*设置外部中断 为高 设置外部中断0为高 = 设置外部中断 void int00(); 优先级中断*/ 优先级中断 void int01(); EX0=1; /*开外部中断 允许 开外部中断0允许 = 开外部中断 允许*/ void int02(); EA=1; /*开中断 开中断*/ = ; 开中断 void int03(); if (P10= =1) {int00();} //查询调用对应的函数 P10=1; P11=1; P12=1; P13=1; 查询调用对应的函数 for(;;)} (;;) else if (P11= =1) {int01();} else if (P12= =1) {int02();} else if (P13= =1) {int03();} }
8051 K0 RXD TXD P1.0 P1.1 QB CLK P/S K7 K
C语言程序: 语言程序: 语言程序 # include <reg51.h> //包含特殊功能 包含特殊功能 寄存器库 sbit P1_0=P1^0; sbit P1_1=P1^1; void main() { unsigned char i; P1_1=1;
8051
RXD TXD P1.0
DATA CLK STB
C语言程序: 语言程序: # include <reg51.h> 特殊功能寄存器库 sbit P1_0=P1^0; void main() { unsigned char i,j; SCON=0x00; j=0x01;
//包含 //包含
for (; ;) { P1_0=0; SBUF=j; while (!TI) { ;} P1_0=1;TI=0; for (i=0;i<=254;i++) {;} j=j*2; if (j= =0x00) j=0x01; } }
C语言程序: 语言程序: 语言程序 # include <reg51.h> //包含特殊功能寄存器库 包含特殊功能寄存器库 sbit P1_1=P1^1; char i; void main() { TMOD=0x01; TH0=0xD8;TL0=0xf0; EA=1;ET0=1; i=0; TR0=1; while(1); } void time0_int(void) interrupt 1 //中断服务程序 中断服务程序 { TH0=0xD8;TL0=0xf0; i++; if (i= =50) {P1_1=! P1_1;i=0;} }
(2)采用查询方式处理的程序 C语言程序: 语言程序: //包含特殊功能寄存器库 # include <reg51.h> //包含特殊功能寄存器库 sbit P1_0=P1^0; void main() { char i; TMOD=0x02; TH0=0x06;TL0=0x06; TR0=1; for(;;) { //查询计数溢出 if (TF0) { TF0=0;P1_0=! P1_0;} //查询计数溢出 } }