51单片机外部中断的C51编程
C51单片机的基础知识
3、存储器:存储器是单片机的又一重要组成部分,存储器分内部存储器和 外部存储器两种。内部存储器容量较小,但速度很快;外部存储器容量很大且速 度较慢。8051内部有4KB的ROM/64KB的RAM.存储器是存放程序和原始数据的仓库。
8051内部有4KB的ROM(只能读不能写)和64KB的RAM(可读写),其中RAM从0开 始,连续编址;ROM从2000开始连续编址(2KB),余下的为IAP(在应用编程)使用。 另外还有外部存储器EPROM和EEPROM等可编程只读存储器用以存放用户程序或数 据字块。
2、中断控制器判断优先级:中断控制器会根据各个中断源的优先级,判断 应该响应哪个中断源的请求。
3、保存现场并跳转:当控制器决定响应某个中断源的请求时,它会先保存 当前的程序现场,然后跳转到相应的中断服务程序。
4、中断服务程序执行:中断服务程序会根据具体的中断源类型和中断事件, 执行相应的操作。
3、备份机制:为确保系统的可靠性,应设计备份机制。可采用双机热备的 方式,当主服务器出现问题时,备份服务器能够迅速接管,保证广播的连续性。 同时,为防止网络故障导致广播中断,可采用多链路备份的方式,确保广播信号 的传输不受影响。
4、用户界面:应设计简洁明了的用户界面,方便管理员进行配置和管理。 界面应包括设备状态、音频文件管理、播放列表设置、定时任务设置等功能,并 支持多种输入方式。此外,界面还应支持远程访问和管理,方便管理员随时随地 进行配置和管理。
单片机C51语言及程序设计
语句确定 存储类型2——指针变量所在的存储区类型,缺省时根据C51编译模式的
默认值确定 指针变量名——按C51变量名的规则选取
举例说明C51指针定义的用法 (SMALL编译模式下)
例1 char xdata a = ‘A’; char * ptr = &a;
sbit bit_name = 位地址常数;
例如, sbit CY = 0xD7;
2)将SFR的相对位地址定义为位变量名
sbit bit_name = sfr字节地址 ^ 位位置;
例如, sbit CY = 0xD0^7;
3)将SFR的相对位位置定义位变量名
sbit bit_name = sfr_name ^ 位位置;
二、C51的标识符与关键字
• 标识符即特定的字符或字符串,用来给变量、函数、符号 常量、自定义类型等命名。用标识符给C语言程序中各种对 象命名时,要用字母、下划线和数字组成的字符序列,并 要求首字符是字母或下划线,不能是数字。字母的大小写 是有区别的。
• 通常下划线开头的标识符是编译系统专用的,因此在编写C 语言源程序时一般不使用以下划线开头的标识符,而将下 划线用作分段符。C51编译器规定标识符最长可达255个字 符,但只有前32个字符在编译时有效,因此标识符的长度 一般不要超过32个字符。
第3章_C51语言编程基础
if( status_word^15 )
{
stat_flag=1;
}
.
19
(3)IDATA区。 IDATA区是片内RAM的0-256字节的存储区,只能间接寻址, 速度比直接寻址慢。
例如: unsigned char float
idata idata
system_status=0; value;
.
20
bit的值可以是1(true),或0(false)。
格式: bit 变量名;
例如:
bit
flag;
flag = 0;
.
8
(2)特殊功能寄存器sfr 地址单元80H——FFH之间的片内数据存储区; “sfr” 数据类型占用一个内存单元; 利用它可以访问51单片机内部的所有特殊功能寄存器。 格式: sfr 寄存器变量名 = 字节地址常数;
data unsigned char y1 _at_ 0x50; /*在data 区定义字节变量 y1,地址为50H*/
xdata unsigned int y2 _at_ 0x4000; /*在xdata区定义字变量 y2,地址为4000H*/
void main(void) {
y1=0xff; y2=0x1234; …… while(1);
.
18
(2)BDATA区。 BDATA区是内部RAM可位寻址的16字节存储区(字节地址为20H ~2FH)中的128个位。 在这个区中声明变量就可进行位寻址。
c51单片机程序-中断
//开始的时候 IO 口都是高电平 需要拉低
/Βιβλιοθήκη Baidu1ms 基准延时
void open_int1() interrupt 2 { P0=0x06; delay1ms(1000); } void main() { P36=0; P37=0; EA=1; EX1=1; IT1=1; a=0x3f; while(1) {P0=a;} } //申请中断的信号负跳变触发
#include<reg51.h> sbit P36=P3^6; sbit P37=P3^7; unsigned char a; void delay1ms(unsigned int i) { unsigned char j; while(i--) { for(j=0;j<115;j++) { ;} } }
51单片机控制洗衣机的c51程序
程序源代码#include#define uchar unsigned char#define uint unsigned int uchar code table[]="tmp "; //7uchar code table1[]="moshi?"; //6uchar code table2[]="SY30:00"; //6uchar code table10[]="SY32:00"; //6uchar code table12[]="SY28:00"; //6uchar code table9[]="SY10:00"; //6uchar code table6[]="XD"; //6uchar code table7[]="PX"; //2uchar code table8[]="TS"; //2uchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};sbit lcden=P3^4; //液晶使能端sbit lcdrs=P3^5; //液晶数据命令选择端sbit ds=P1^3;sbit key1=P1^0;sbit key2=P1^1;sbit key3=P1^2;sbit beep=P3^0;sbit zhushui=P3^1;sbit fangshui=P3^3;sbit key4=P3^6;sbit key5=P3^7;sbit SW1=P1^7;sbit SW2=P1^6;sbit SW3=P1^5;sbit SW4=P1^4;uchar num,fen,l,m,n,count,flag,i,jian1,jian2,jian3,jian5,mi,pwm1=10;uint temp;float f_temp,miao;void chushihua(){EA=1;//开总中断EX0=1;//开外部中断0TMOD=0x11;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TH1=(65536-50000)/256;TL1=(65536-50000)%256;EA=1;ET0=1;// TR0=1;//启动定时器0ET1=1;// TR1=1; //启动定时器1}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/*********以下是步进电机的程序**********************************************/void delayA(uint t){ uint k;while(t--){for(k=0; k<125; k++){ }}}void motor_ffw(){ uchar i;uint j;for (j=0; j<12; j++) //转1*n圈 { /*if(K3==0){break;} */ //退出此循环程序for (i=0; i<8; i++) //一个周期转30度{if(key4==0){delay(8);if(key4==0){pwm1--;}} if(key3==0){delay(8);if(key3==0){pwm1++;}}P0 = FFW[i]; //取数据delayA(pwm1); //调节转速}}}/********************************************************//*步进电机反转/********************************************************/void motor_rev(){uchar i;uint j;for (j=0; j<12; j++) //转1×n圈{//退出此循环程序for (i=0; i<8; i++) //一个周期转30度{if(key4==0){delay(8);if(key4==0){pwm1--;}} if(key3==0){delay(8);if(key3==0){pwm1++;}} P0 = REV[i]; //取数据delayA(pwm1); //调节转速}}}/*******步进电机甩干专用*********************************************/void motor_ffwz(){ uchar i;uint j;for (j=0; j<12; j++) //转1*n圈 { /*if(K3==0){break;} */ //退出此循环程序for (i=0; i<8; i++) //一个周期
c51单片机编程应用100例
目录
目录 1
************************************************************函数的使用和熟悉***************
************************************************/ 4
实例3:用单片机控制第一个灯亮 4
实例4:用单片机控制一个灯闪烁:认识单片机的工作频率 4
实例5:将 P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功
能 5
实例6:使用P3口流水点亮8位LED 5
实例7:通过对P3口地址的操作流水点亮8位LED 6
实例8:用不同数据类型控制灯闪烁时间 7
实例9:用P0口、P1 口分别显示加法和减法运算结果 8
实例10:用P0、P1口显示乘法运算结果 9
实例11:用P1、P0口显示除法运算结果 9
实例12:用自增运算控制P0口8位LED流水花样 10
实例13:用P0口显示逻辑"与"运算结果 10
实例14:用P0口显示条件运算结果 11
实例15:用P0口显示按位"异或"运算结果 11
实例16:用P0显示左移运算结果 11
实例17:"万能逻辑电路"实验 11
实例18:用右移运算流水点亮P1口8位LED 12
实例19:用if语句控制P0口8位LED的流水方向 13
实例20:用swtich语句的控制P0口8位LED的点亮状态 13 实例21:用for语句控制蜂鸣器鸣笛次数 14
实例22:用while语句控制LED 16
实例23:用do-while语句控制P0口8位LED流水点亮 16 实例24:用字符型数组控制P0口8位LED流水点亮 17
单片机C51教学课件
中断是单片机处理的一种方式,当某个事件发生时,单片机可以暂 时停止当前的工作,转去处理这个事件,处理完后再回到原来的工 作。
中断源
C51单片机有多个中断源,包括定时器溢出、串行通信接收、外部 中断等。
中断处理过程
中断处理过程包括中断请求、中断响应、中断处理和中断返回四个步 骤。
定时器/计数器
步进电机控制
总结词:通过单片机C51实现
对步进电机的精确控制,实现
正反转、调速等功能。
01
详细描述
02
选择合适的步进电机和驱动器
,如A4988,将其连接到C51
单片机的IO口。
03
单片机通过控制驱动器的输入
信号,实现对步进电机的精确
控制。
04
可以实现步进电机的正反转、
调速等功能。
05
可根据需要添加按键控制功能
01
内部RAM
03
02
单片机内部的程序存储器,用于存储程序代 码。
04
单片机内部的RAM,用于存储程序运行时 的变量和临时数据。
特殊功能寄存器(SFR)
05
06
用于控制单片机各种硬件特性的寄存器。
04
单片机C51编程实 践
Hale Waihona Puke Baidu
LED灯控制
LED灯闪烁
LED灯颜色变换
c51单片机的定时器和中断
四、方式3 方式 1.工作方式 下的定时器 计数器 下的定时器/计数器 .工作方式3下的定时器 计数器T0
溢出 申请 中断 申请 中断 TCON TF1 TR1 TF0 TR0 D7 溢出 TH0 8位 T0引脚 1 TL0 8位 &
≥1
机器周期 TMOD 1 1 M0 M1 C/T 0 机器周期 GATE M0 1 M1 C/T GATE D7 D0
定时器/计数器的应用举例 第三节 定时器 计数器的应用举例
一、方式0、方式 的应用 方式 、方式1的应用
/T /T 选择T1方式0用于定时, P3.7引脚输出周期为1ms的方波 晶振fosc= 6MHz。 T1方式 引脚输出周期为1ms的方波, 例C6.2 选择T1方式0用于定时,在P3.7引脚输出周期为1ms的方波,晶振fosc= 6MHz。 根据题意,只要使P3.7每隔500 取反一次即可得到1ms方波, P3.7每隔500µs 1ms方波 解:根据题意,只要使P3.7每隔500 s取反一次即可得到1ms方波, C / T T1的定时时间为500µs 因而T1的定时时间为500 设为定时方式0: 因而T1的定时时间为500 s。将T1设为定时方式 :GATE=0, 设为定时方式 ,
故TMOD = 00H。系统复位后TMOD为0,所以不必对TMOD置初值。 下面计算500µs定时T1的初值: 机器周期 T机=12/fosc=12/(6×106)=2µs 设初值为X则:(213-X)×2×10-6 s =500×10-6 s X = 7942D=1111100000110B=1F06H 因为在作13位计数器用时,TL1高3位未用,应写0,X的低5位装入TL1的低5位, 所以TL1=06H;X的高8位应装入TH1,所以TH1=F8H。
单片机C51的中断系统
外部中断概 述
外部中断的 处理
外部中断具有响应速度快、实时性好等优点,适用于 需要快速响应外部事件的应用场景。
外部中断的 优点
当外部中断发生时,需要编写相应的中断服务程序来 处理中断。在中断服务程序中,可以执行相应的操作 ,如读取传感器数据、控制继电器等。
THANKS FOR WATCHING
感谢您的观看
CHAPTER 03
C51单片机的中断服务程序 设计
中断服务程序的编写
01
初始化中断向量表
在C51单片机中,需要初始化中 断向量表来指定每个中断源对应 的中断服务程序入口地址。
02
编写中断服务程序
03
配置中断触发方式
根据具体的中断源,编写相应的 中断服务程序,实现相应的功能 。
根据需要配置中断触发方式(电 平触发或边沿触发),并设置中 断优先级和子优先级。
中断优先级和中断向量
中断优先级
C51单片机的中断优先级分为抢 占优先级和子优先级,抢占优先 级高的中断可以打断正在执行的 低优先级中断。
中断向量
中断向量是指中断处理程序的入 口地址,C51单片机通过中断向 量表来保存各个中断源的中断向 量。
CHAPTER 02
C51单片机的中断处理过程
中断请求
串行口中断的处理
当串行口中断发生时,需要编写相应的中断服务程序来处 理中断。在中断服务程序中,可以读取或发送数据,并进 行相应的错误处理。
单片机原理及接口技术(C51编程)(第2版)-习题答案
第6章思考题及习题6参考答案
一、填空
1.外部中断1的中断入口地址为。定时器T1的中断入口地址为。
答:0013H;001BH
2.若(IP)=00010100B,则优先级最高者为,最低者为。
答:外部中断1,定时器T1
3.AT89S51单片机响应中断后,产生长调用指令LCALL,执行该指令的过程包括:首先把的内容压入堆栈,以进行断点保护,然后把长调用指令的16位地址送入,使程序执行转向中的中断地址区。
答:PC、PC、程序存储器
4.AT89S51单片机复位后,中断优先级最高的中断源是。
答:外部中断0
5.当AT89S51单片机响应中断后,必须用软件清除的中断请求标志是。
答:串行中断、定时器/计数器T2中断
二、单选
1.下列说法错误的是()。
A. 同一级别的中断请求按时间的先后顺序响应
B. 同一时间同一级别的多中断请求,将形成阻塞,系统无法响应
C. 低优先级中断请求不能中断高优先级中断请求,但是高优先级中断请求能中断低优
先级中断请求
D. 同级中断不能嵌套
答:B
2.在AT89S51的中断请求源中,需要外加电路实现中断撤销的是()。
A. 电平方式的外部中断请求
B.跳沿方式的外部中断请求
C.外部串行中断
D.定时中断
答:A
3.中断查询确认后,在下列各种AT89S51单片机运行情况下,能立即进行响应的是()。
A.当前正在进行高优先级中断处理
B.当前正在执行RETI指令
C.当前指令是MOV A,R3
D.当前指令是DIV指令,且正处于取指令的机器周期
答:C
4.下列说法正确的是()。
A. 各中断源发出的中断请求信号,都会标记在AT89S51的IE寄存器中
51单片机的定时器_计数器的C51编程
51单片机的定时器_计数器的C51编程
相关知识点:
1、单片机的定时器/计数器,实质是按一定时间间隔、自动在系统后台进行计数的。
2、当被设定工作在定时器方式时,自动计数的间隔是机器周期(12个晶振振荡周期),即计数频率是晶振振荡频率的1/12;
3、当定时器被启动时,系统自动在后台,从初始值开始进行计数,计数到某个终点值时(方式1时是65535),产生溢出中断,自动去运行定时中断服务程序;注意,整个计数、溢出后去执行中断服务程序,都是单片机系统在后台自动完成的,不需要人工干预!
4、定时器的定时时间,应该是(终点值-初始值)x机器周期。对于工作在方式1和12MHz时钟的单片机,最大的计时时间是(65535-0)x1uS=65.535ms。这个时间也是一般的51单片机定时器能够定时的最大定时时间,如果需要更长的定时时间,则一般可累加多定时几次得到,比如需要1秒的定时时间,则可让系统定时50ms,循环20次定时就可以得到1s的定时时间。
5、定时器定时得到的时间,由于是系统后台自动进行计数得到的,不受主程序中运行其他程序的影响,所以相当精确;
6、使用定时器,必须先用TMOD寄存器设定T0/T1的工作方式,一般设定在方式1的情况比较多,所以可以这样设定:TMOD=0x01(仅设T0为方式1,即16位)、TMOD=0x10(仅设T1为方式1,即16位)、TMOD=0x11(设T0和T1为方式1,即都为16位)。
7、使用定时器,必须根据需要的定时时间,装载相应的初始值,而且在中断服务程序中,很多情况下得重新装载初始值,否则系统会从零开始计数而引起定时失败;
51单片机外部中断实验
实验6 外部中断实验
(仿真部分)
一、实验目的
1. 学习外部中断技术的基本使用方法。
2. 学习中断处理程序的编程方法。
二、实验内容
在INT0和INT1上分别接了两个可回复式按钮,其中INT0上的按钮每按下一次则计数加一,其中INT1上的按钮每按下一次则计数减一。P1.0~ P1.3接LED 灯,以显示计数信号。
三、实验说明
编写中断处理程序需要注意的问题是:
1.保护进入中断时的状态,并在退出中断之前恢复进入时的状态。
2.必须在中断处理程序中设定是否允许中断重入,即设置EX0位。
3.INT0和INT1分别接单次脉冲发生器。P1.0~ P1.3接LED 灯,以查看计数
信号.
四、硬件设计
利用以下元件:AT89C51、BOTTON 、CAP 、CAP-POL 、CRYSTAL 、RES 、NOT 、LED-Yellow 。设计出如下的硬件电路。晶振频率为12MHz 。
五、参考程序框图
主程序框图 INT0中断处理程序框图
开始 设置有关中断控制寄存器开外中断INT0、INT1 设置P1.0~ 3初始状态 显示循环等待中断 INT0中断入口 计数加一 保护现场 恢复现场 中断返回
实验6 外部中断实验
(实验箱部分)
1.实验目的
认识中断的基本概念
学会外部中断的基本用法
学会asm和C51的中断编程方法
2.实验原理
图按键中断
【硬件接法】
P1.1控制LED,低电平点亮
P3.3/INT1接按键,按下时产生低电平
【运行效果】
程序工作于中断方式,按下按键K2后,LED点亮,1.5秒后自动熄灭。
8051单片机有/INT0和/INT1两条外部中断请求输入线,用于输入两个外部中断源的中断请求信号,并允许外部中断源以低电平或下降沿触发方式来输入中断请求信号。/INT0和/INT1中断的入口地址分别是0003H和0013H。
C51单片机的结构及原理
编程实例:LED闪烁
目的
通过C51单片机编程,实现LED的闪 烁效果。
实现方法
使用单片机的IO口控制LED的亮灭状 态,通过循环语句实现LED的闪烁效 果。
编程实例:LED闪烁
01
代码示例
02
```c
void delay(unsigned int time) //延时函数
03
编程实例:LED闪烁
05 C51单片机编程语言与实 例
C语言基础
C语言概述
C语言是一种通用的、过程式的计算机程序设计语言,被广泛用于 嵌入式系统开发,特别是单片机开发。
C语言基本语法
包括变量声明、数据类型、运算符、控制结构(如if语句、for循环 等)、函数等。
C语言特点
C语言具有高效、灵活、可移植性强的特点,能够直接对硬件进行操 作,适合编写底层驱动程序和嵌入式应用程序。
要点二
详细描述
首先检查程序逻辑是否正确,确保程序中控制LED闪烁的 逻辑没有错误。其次检查LED的连接方式是否正确,包括 LED的正负极是否接反,以及限流电阻的阻值是否合适。 最后检查LED驱动电流是否过大,如果过大可能会导致 LED闪烁异常,需要调整限流电阻的阻值来降低驱动电流 。
THANKS FOR WATCHING
感谢您的观看
编程实例:LED闪烁
LED=0xFF; //LED全亮 delay(1000); //延时
C51 控制语句_51单片机应用开发范例大全(第2版)_[共4页]
第1章 单片机C语言开发基础23║该窗口可以显示反汇编后的代码、源程序和相应反汇编代码的混合代码,可以在该窗口进行在线汇编、利用该窗口跟踪已执行的代码、在该窗口按汇编代码的方式单步执行。打开反汇编窗口,单击鼠标右键,出现快捷菜单,如图1-30所示,其中Mixed Mode是以混合方式显示,Assembly Mode是以反汇编码方式显示。
图1-29 反汇编窗口图1-30 快捷菜单程序调试中常使用设置断点然后全速执行的方式,在断点处可以获得各变量值,但却无法知道程序在断点前究竟执行了哪些代码,而这往往是需要了解的。为此,Keil μVision2提供了跟踪功能,在运行程序之前打开调试工具条上的运行跟踪代码开关,然后全速运行程序。当程序停止运行后,单击查看跟踪代码按钮,自动切换到反汇编窗口,其中前面标有“-”号的行就是中断以前执行的代码,可以按窗口边的上卷按钮向上翻查看代码执行记录。
Keil μVision2提供了2个串行观察窗口,用于PC机与模拟的51单片机窗口通信。从模拟的51单片机的CPU串口输出的数据,将在这个串行窗口中显示,而在串口中输入的字符,将被输入到模拟的51单片机的CPU串口中,利用这一点,可以在没有外部硬件的情况下模拟51机CPU的UART。这是一种高级调试技巧,本书不再做详细介绍。
1.3 C51基础知识
1.3.1 C51控制语句
C51语言中,有相关的控制语句,用以实现选择结构与循环结构。
•选择控制语句:if语句和switch-case语句。
•循环控制语句:for语句、while语句和do…while语句。
第3章51单片机P0P3口的C51编程
4、8段LED动态显示技术
• 【例3-6】利用51单片机的并行口作为动 态显示的段口与位口的示例。
3.3
输入操作
• 作为51单片机片内并行I/O口输入信号 ,是属于数字信号的“高、低电平”或 脉冲信号的“上升沿、下降沿”两大类 ,这两类信号可以通过: • “闸刀型开关”、“按钮型开关”两类 开关来模拟。
3.3.2
单个按钮开关型 输入信号
【例3-8】按钮开关。编程实现S1按钮按 一下,4个灯一组亮、灭交替。
【例3-9】开始是所有的灯都亮,按一下 S1,灯变为500ms闪烁,再按一下,变为 全亮。
• 分析: • 相当于S1为一个控制开关,控制着等的 亮、灭闪烁 • 注意和例题4-6的不同。定义一个位单 元,按键每动作一次,该位单元取反: 该单元为0时,灯全亮,该单元为1时, 灯闪烁。
3.2
输出操作
• 输出高、低电平。
• 3.2.1 基本输出--字节、位 • 3.2.2 扩展输出--流水灯、霹雳灯 • 3.2.3 扩展输出—8段LED显示
3.2.1 基本输出--字节、位
【例3-1】字节输出。8灯亮、灭闪烁
• • • • • • • • •
#include<reg51.h> void delay( unsigned int d ) { while(--d>0); } void main( ) { while(1) { P1=0xff; delay(50000); P1=0X00; delay(50000); } }
51单片机唱歌 C51音乐程序
51单片机唱歌 C51音乐程序
#i nclude
#i nclude
//本例采用89C52, 晶振为11.0592MHZ
//关于如何编制音乐代码, 其实十分简单,各位可以看以下代码.
//频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍;
//所以拿出谱子, 试探编吧!
unsigned char n=0; //n为节拍常数变量
unsigned char code music_tab[] ={
0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数, 0x20, 0x40, 0x1C , 0x10,
0x18, 0x10, 0x20 , 0x10,
0x1C, 0x10, 0x18 , 0x40,
0x1C, 0x20, 0x20 , 0x20,
0x1C, 0x20, 0x18 , 0x20,
0x20, 0x80, 0xFF , 0x20,
0x30, 0x1C, 0x10 , 0x18,
0x20, 0x15, 0x20 , 0x1C,
0x20, 0x20, 0x20 , 0x26,
0x40, 0x20, 0x20 , 0x2B,
0x20, 0x26, 0x20 , 0x20,
0x20, 0x30, 0x80 , 0xFF,
0x20, 0x20, 0x1C , 0x10,
0x18, 0x10, 0x20 , 0x20,
0x26, 0x20, 0x2B , 0x20,
0x30, 0x20, 0x2B , 0x40,
0x20, 0x20, 0x1C , 0x10,
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//------------------------------------------------void key_scan() interrupt 2 //使用了外部中断 1 的键盘扫描子函数 { if(k2==0) //有键按下吗?(k1=0 ?) { delay_ms(10); //延时消抖 if(k2==0) //确实是有键按下,则: {led=!led; //翻转灯的状态 while(!k2);} //等待按键放开 } } //外部中断基本例程-4 (同时使用外部中断 0 和外部中断 1) //用一个键控制接在 P0 口的八个灯的亮灭,另外一个按键控制一个灯的亮灭 #include <reg52.h> sbit k1=P3^2; sbit k2=P3^3; // sbit led=P2^7; void delay_ms(unsigned int xms); //ms 级延时子程序 //================================================= void main() { P0=0xff; //上电初始化,P0 全灭 led=1; //上电初始化,led 灯不亮 TCON=0x05; //打开外部中断 1,并设置为下降沿触发 IE=0x85; //开总中断和外部中断 1 while(1) { delay_ms(3000); } } //================================================= void delay_ms(unsigned int xms) //ms 级延时子程序 { unsigned int x,y; for(x=xms;x>0;x--) for(y=130;y>0;y--);} //------------------------------------------------void key_scan_1() interrupt 0 //使用了外部中断 0 的键盘扫描子函数
while(1) { delay_ms(3000); //注意主函数这里没有键盘扫描程序了 } } //================================================= void delay_ms(unsigned int xms) //ms 级延时子程序 { unsigned int x,y; for(x=xms;x>0;x--) for(y=130;y>0;y--);} //------------------------------------------------//外部中断基本例程-3 (单个键盘的外部中断 1 扫描处理) //功能跟上例一样,都是用一个按键控制一个灯的亮灭,但是使用的是外部中断 1 //注意与前例写法上的不同之处 #include <reg52.h> sbit k2=P3^3; // sbit led=P2^7; void delay_ms(unsigned int xms); //ms 级延时子程序 //================================================= void main() { led=1; //上电初始化,led 灯不亮 TCON=0x04; //打开外部中断 1,并设置为下降沿触发 IE=0x84; //开总中断和外部中断 1 while(1) { delay_ms(3000); } } //================================================= void delay_ms(unsigned int xms) //ms 级延时子程序 { unsigned int x,y; for(x=xms;x>0;x--) for(y=130;y>0;y--);}
{ unsigned int x,y; for(x=xms;x>0;x--) for(y=130;y>0;y--);} //------------------------------------------------void key_scan() //键盘扫描子函数 { if(k1==0) //有键按下吗?(k1=0 ?) { delay_ms(10); //延时消抖 if(k1==0) //确实是有键按下,则: {led=!led; //翻转灯的状态 while(!k1);} //等待按键放开 } } //------------------------------------------------//外部中断基本例程-2 (单个键盘的外部中断 0 扫描处理) //用一个按键控制一个灯的亮灭 //开始不亮,按一下则点亮,再按一下灭掉,再按又亮........ #include <reg52.h> sbit k1=P3^2; sbit led=P2^7; void delay_ms(unsigned int xms); //ms 级延时子程序 void key_scan() interrupt 0 //使用了外部中断 0 的键盘扫描子函数。也可放 在主函数而不需要预先声明 { if(k1==0) //有键按下吗?(k1=0 ?) { delay_ms(10); //延时消抖 if(k1==0) //确实是有键按下,则: {led=!led; //翻转灯的状态 while(!k1);} //等待按键放开 } } //================================================= void main() { led=1; //上电初始化,led 灯不亮 TCON=0x01; //打开外部中断 0,并设置为下降沿触发 IE=0x81; //开总中断
TCON=0x01; //打开外部中断 0,并设置为下降沿触发 IE=0x81; //开总中断 while(1) { delay_ms(3000); } } //================================================= void delay_ms(unsigned int xms) //ms 级延时子程序 { unsigned int x,y; for(x=xms;x>0;x--) for(y=130;y>0;y--);} //------------------------------------------------void key_scan() interrupt 0 //使用了外部中断 0 的键盘扫描子函数 { if(k0==0) //有键按下吗?(k0=0 ?) { delay_ms(10); //延时消抖 if(k0==0) //确实是有键按下,则: {led0=!led0; //翻转灯的状态 while(!k0);} //等待按键放开 } if(k1==0) //有键按下吗?(k1=0 ?) { delay_ms(10); //延时消抖 if(k1==0) //确实是有键按下,则: {led1=!led1; //翻转灯的状态 while(!k1);} //等待按键放开 } if(k2==0) //有键按下吗?(k2=0 ?) { delay_ms(10); //延时消抖 if(k2==0) //确实是有键按下,则: {led2=!led2; //翻转灯的状态 while(!k2);} //等待按键放开 } if(k3==0) //有键按下吗?(k3=0 ?) { delay_ms(10); //延时消抖 if(k3==0) //确实是有键按下,则: {led3=!led3; //翻转灯的状态 while(!k3);} //等待按键放开 } if(k4==0) //有键按下吗?(k4=0 ?) { delay_ms(10); //延时消抖 if(k4==0) //确实是有键按下,则: {led4=!led4; //翻转灯的状态 while(!k4);} //等待按键放开 }
{ if(k1==0) //有键按下吗?(k1=0 ?) { delay_ms(10); //延时消抖 if(k1==0) //确实是有键按下,则: {P0=~P0; //翻转 8 个灯的状态 while(!k1);} //等待按键放开 } } void key_scan_2() interrupt 2 //使用了外部中断 1 的键盘扫描子函数 { if(k2==0) //有键按下吗?(k1=0 ?) { delay_ms(10); //延时消抖 if(k2==0) //确实是有键按下,则: {led=!led; //翻转单个灯的状态 while(!k2);} //等待按键放开 } } //外部中断扩展应用例程-5(8 个按钮分别去控制 8 个灯的亮灭) //八个按钮通过 8 个二极管接到外部中断 0 脚进行中断扩展, //从而解决外部中断口不够用的问题 #include <reg52.h> sbit k0=P2^0; //八个按键分别接到 P2 口各个脚上, sbit k1=P2^1; //同时还通过二极管连接到外部中断 0 脚(P3.2) sbit k2=P2^2; sbit k3=P2^3; sbit k4=P2^4; sbit k5=P2^5; sbit k6=P2^6; sbit k7=P2^7; sbit led0=P0^0; //接在 P0 脚上的 8 个 LED 灯,分别受控于上述 8 个按键 sbit led1=P0^1; sbit led2=P0^2; sbit led3=P0^3; sbit led4=P0^4; sbit led5=P0^5; sbit led6=P0^6; sbit led7=P0^7; void delay_ms(unsigned int xms); //ms 级延时子程序 //================================================= void main() { //上电初始化,led 灯不亮
51 单片机外部中断的 C51 编程
相关知识: 1、51 单片机的 5 大中断源:串行口中断、定时中断 1、外部中断 1、定时中断 0、 外部中断 0; 2、中断源的编号: 串行口中断为 4、定时中断 1 为 3、外部中断 1 为 2、定时 中断 0 为 1、外部中断 0 为 0; 3、中断源的优先级:按以上顺序排列,串行口中断最低、外部中断 0 最高; 4、使用外部中断 0 和 1Leabharlann Baidu必须 TCON 寄存器设置其触发方式是低电平触发(0) 还是下降沿触发(1); 5、使用前必须通过 IE 寄存器打开总中断和自己的中断; //外部中断基本例程-1(未使用中断,键盘扫描为一般端口扫描) //这是特意安排的一个例程,以便和使用外部中断的例程 2 进行对比 //用一个按键控制一个灯的亮灭,开始不亮,按一下则点亮,再按一下灭掉,再 按又亮........ #include <reg52.h> sbit k1=P3^2; sbit led=P2^7; void delay_ms(unsigned int xms); //ms 级延时子程序 void key_scan(); //声明键盘扫描子函数 //================================================= void main() { led=1; //上电初始化,led 灯不亮 while(1) { key_scan(); delay_ms(3000); } } //================================================= void delay_ms(unsigned int xms) //ms 级延时子程序
if(k5==0) //有键按下吗?(k5=0 ?) { delay_ms(10); //延时消抖 if(k5==0) //确实是有键按下,则: {led5=!led5; //翻转灯的状态 while(!k5);} //等待按键放开 } if(k6==0) //有键按下吗?(k6=0 ?) { delay_ms(10); //延时消抖 if(k6==0) //确实是有键按下,则: {led6=!led6; //翻转灯的状态 while(!k6);} //等待按键放开 } if(k7==0) //有键按下吗?(k7=0 ?) { delay_ms(10); //延时消抖 if(k7==0) //确实是有键按下,则: {led7=!led7; //翻转灯的状态 while(!k7);} //等待按键放开