【STC89C52】外部中断与定时/计数器中断

这篇具有很好参考价值的文章主要介绍了【STC89C52】外部中断与定时/计数器中断。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、中断系统

二、外部中断

一)配置外部中断的三个步骤

1)中断允许

(2)中断方式配置

3)中断处理函数

二)实验代码

 三、定时器/计数器

一)使用定时器/计数器的三个步骤

1)启动定时/计数器

2)设置工作模式​编辑 

3)查询定时/计数器是否溢出 

二)实验代码 

1)定时器

2)计数器 

四、定时器/计数器中断

一)执行定时器/计数器中断的四个步骤

1.中断允许 

2.启动定时、计数器

3.设置工作模式

4.中断处理函数

二)实验代码


 

一、中断系统

中断反映计算机处理紧急事件的能力,分为四个步骤:中断请求、中断响应、中断处理、中断返回。

51单片机允许5个中断源:2个外部中断INT0、INT1,3个内部中断:2个定时/计数器中断T0、T1,串口中断TI/RI。

它们的优先级:INT0(H)中断入口:0

                          T0                               1

                          INT1                            2

                          T1                               3

                          TI/RI (L)                   4

二、外部中断

一)配置外部中断的三个步骤

1)中断允许

【STC89C52】外部中断与定时/计数器中断

 如果想执行中断,需要将总中断开关闭合,以及各自中断开关闭合 。

【STC89C52】外部中断与定时/计数器中断

可位寻址的意思就是可以直接写EA=1;而不用读二进制。

如果想打开外部中断1

EA=1;
EX1=1;

(2)中断方式配置

【STC89C52】外部中断与定时/计数器中断

IE1和IE0是由硬件自动置1置0的,我们不用管。

如果想用下降沿触发外部中断1

IT1=1;

3)中断处理函数

void int1() interrupt 2{
}

二)实验代码

将P3^2与P3^7用杜邦线相连,按一次独立按键S2,先给P3^7一个高电平,再给一个低电平,实现下降沿触发,用P1的翻转体现中断执行。

#include <reg52.h>
sbit key=P3^0;
sbit flag=P3^7;
#define uint unsigned int
void delay(uint z){
	uint x,y;
	for(x=z;x>0;x--)
	for(y=114;y>0;y--);
}
void int0init(){
	EA=1;
	EX0=1;
	IT0=1;
}
void int0() interrupt 0{
	P1=~P1;
}
void main(){
		int0init();
	while(1){
	if(key==0){
			delay(20);
			if(key==0){
				
				flag=1;
				flag=0;
				while(!key);
			}
		}
	}
}

 三、定时器/计数器

一)使用定时器/计数器的三个步骤

1)启动定时/计数器

 【STC89C52】外部中断与定时/计数器中断

 想让定时器T0运行

TR0=1;

TF0是判断是否溢出,if(TF0==1)  完成从初值加到65536的过程。

软件查询方法 可以直接TF0=0;

2)设置工作模式【STC89C52】外部中断与定时/计数器中断 

不可位寻址,就是不可以直接写GATE=1;而要读二进制

如果要执行16位计数器1

1)GATE位置0; 如果置1还需要INT1为高电平才能执行

2)C/T位置1;

3)工作模式1

TMOD=01010000=0x50;

TL0和TH0怎么计算

如果是定时器50ms

单片机工作频率11.0592MHz,时钟周期1/11.0592/1000000*1000000=0.0904us

机器周期0.0904*12=1.085us

50ms=50000us

50000/1.085=46082

65535-46082=19453

【STC89C52】外部中断与定时/计数器中断

TH0=0XFD;

TL0=0X4B;

如果是计数器

TH0=0;

TL0=0;

3)查询定时/计数器是否溢出 

 【STC89C52】外部中断与定时/计数器中断

if(TF1==1){
TF1=0;
}

二)实验代码 

1)定时器

T0做定时器,数码管显示从0-10,间隔时间1s。

#include <reg52.h>
sbit DU=P2^6;
sbit WE=P2^7;
#define uchar unsigned char
#define uint unsigned int
uchar board[]={0x3f,/*00111111*/0x06,/*00000110*/0x5b,/*01011011*/
	0x4f,/*01001111*/0x66,/*01100110*/0x6d,/*01101101*/0x7d,/*01111101*/0x07,/*00000111*/
	0x7f,0x6f/*01101111*/};
void delay(uint z){
	uint x,y;
	for(x=z;x>0;x--)
		for(y=114;y>0;y--);
}

void display(uchar z){
	uchar bai=z/100;
	uchar shi=z%100/10;
	uchar ge=z%10;
	P0=0xff;
	WE=1;
	P0=0xfe;
	WE=0;
	DU=1;
	P0=board[bai];
	DU=0;
	delay(5);
	P0=0xff;
	WE=1;
	P0=0xfd;
	WE=0;
	DU=1;
	P0=board[shi];
	DU=0;
	delay(5);
	P0=0xff;
	WE=1;
	P0=0xfb;
	WE=0;
	DU=1;
	P0=board[ge];
	DU=0;
	delay(5);
	
}
void timer0Init(){
	TR0=1;
	TMOD=0x01;
	TH0=(65535-46082)/256;
	TL0=(65535-46082)%256;
}
void main(){
	uchar msec=0,sec=0;
	timer0Init();
	while(1){	
	if(TF0==1){
		TF0=0;
		TH0=(65535-46082)/256;
	  TL0=(65535-46082)%256;
		msec++;
		if(msec==20){
			msec=0;
			sec++;
			if(sec>10)
				sec=0;
		}}
		display(sec);}}

2)计数器 

T0做定时器,T1做计数器,1sLED1翻转一次,数码管显示LED1翻转次数。

#include <reg52.h>
sbit DU=P2^6;
sbit WE=P2^7;
sbit LED1=P1^0;
#define uchar unsigned char
#define uint unsigned int
uchar board[]={0x3f,/*00111111*/0x06,/*00000110*/0x5b,/*01011011*/
	0x4f,/*01001111*/0x66,/*01100110*/0x6d,/*01101101*/0x7d,/*01111101*/0x07,/*00000111*/
	0x7f,0x6f/*01101111*/};
void delay(uint z){
	uint x,y;
	for(x=z;x>0;x--)
		for(y=114;y>0;y--);
}

void display(uchar z){
	uchar bai=z/100;
	uchar shi=z%100/10;
	uchar ge=z%10;
	P0=0xff;
	WE=1;
	P0=0xfe;
	WE=0;
	DU=1;
	P0=board[bai];
	DU=0;
	delay(5);
	P0=0xff;
	WE=1;
	P0=0xfd;
	WE=0;
	DU=1;
	P0=board[shi];
	DU=0;
	delay(5);
	P0=0xff;
	WE=1;
	P0=0xfb;
	WE=0;
	DU=1;
	P0=board[ge];
	DU=0;
	delay(5);
	
}
void timer0Init(){
	TR0=1;
	TMOD=0x51;
	TH0=(65535-46082)/256;
	TL0=(65535-46082)%256;
}
void timer1Init(){
	TR1=1;
	TMOD=0x51;
	TH1=0;
	TL1=0;
}
void main(){
	uchar msec=0;
	timer0Init();
	timer1Init();
	while(1){	
	if(TF0==1){
		TF0=0;
		TH0=(65535-46082)/256;
	  TL0=(65535-46082)%256;
		msec++;
		if(msec==20){
			msec=0;
			LED1=~LED1;
		}}
		display(TL1);}}

四、定时器/计数器中断

一)执行定时器/计数器中断的四个步骤

1.中断允许 

【STC89C52】外部中断与定时/计数器中断

2.启动定时、计数器

【STC89C52】外部中断与定时/计数器中断 

TF0、TF1软件查询时软件清零,中断时硬件清零。 

3.设置工作模式

【STC89C52】外部中断与定时/计数器中断 

4.中断处理函数

void timer0() interrupt 1{
}
void timer1() interrupt 3{
}

二)实验代码

功能: 数码管动态扫描在独立按键不松手时不能及时扫描,我们可以利用中断解决这一问题。

        用定时器中断代替延时函数调用,S2一直加到100,S3一直减到0

#include<reg52.h>
sbit WE=P2^7;
sbit DU=P2^6;
sbit S2=P3^0;
sbit S3=P3^1;
#define uchar unsigned char
#define uint unsigned int
uchar SMGduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar SMGwei[]={0xfe,0xfd,0xfb};
uchar num;
void delay(uint z){
	uint x,y;
	for(x=z;x>0;x--)
		for(y=114;y>0;y--);
}
void timer0Init(){
	EA=1;
	ET0=1;
	TR0=1;
	TMOD=0x01;
	TH0=0Xed;
	TL0=0Xff;
}
void display(uchar z){
	static uchar wei;
	P0=0xff;
	WE=1;
	P0=SMGwei[wei];
	WE=0;
	
	
	switch(wei){
		case 0:DU=1;P0=SMGduan[z/100];DU=0;break;
		case 1:DU=1;P0=SMGduan[z%100/10];DU=0;break;
		case 2:DU=1;P0=SMGduan[z%10];DU=0;break;
	}
	wei++;
	if(wei==3)
		wei=0;
}
	
	
void main(){
	timer0Init();
	while(1){
	if(S2==0){
		delay(20);
			if(S2==0){
				if(num<100)num++;
				while(!S2);
			}
		}
	if(S3==0){
		delay(20);
		if(S3==0){if(num>0)num--;
			while(!S3);
		}
	}
}}
	void timer0() interrupt 1{
	TH0=0Xed;
	TL0=0Xff;
  display(num);}

以上就是我今天的分享,希望对你有所帮助!!!如果觉得这篇文章还不错的话,可以点个赞再走哟~文章来源地址https://www.toymoban.com/news/detail-473215.html

到了这里,关于【STC89C52】外部中断与定时/计数器中断的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STC89C52RC最小系统板

    Author:Once Day “漫漫长路,有人对你微笑过嘛…” Solemnly declare:知识产权、正确性等皆未明确,因此仅且只能供学习交流之用,切莫他用!!!本文章所有者不对任何人因使用本文章内容引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于何种法律理论,即

    2023年04月19日
    浏览(46)
  • 【STC89C52】独立键盘和矩阵键盘

    今天我分享的是基于STC89C52的独立键盘与矩阵键盘实验的学习笔记。希望对你有所帮助! 目录 一、原理图分析  二、独立键盘 三、矩阵键盘 键盘在现实生活中很常见,手机的虚拟键盘,电脑的实体键盘。 键盘是由一个个按键构成,按键常态下与两端触点断开,按下时与两端

    2023年04月12日
    浏览(43)
  • 什么是STC89C52单片机

    STC89C52是一个低功耗,高性能CMOS 8位单片机,片内含8k Bytes ISP(In-system programmable)的可反复擦写10000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构[1],芯片内集成了通用8位中央处理器和ISP Flash存储单元,功

    2024年02月13日
    浏览(46)
  • 你知道什么是STC89C52RC吗?

    目录 一、什么是STC89C52RC 二、STC89C52RC由什么构成 三、STC89C52RC各部分如何使用 四、STC89C52RC如何进行编程 五、怎么使用STC89C52RC 六、为何使用STC89C52RC STC89C52RC是一种基于8051架构的单片机芯片,由中国的STC公司生产。它包含52KB的闪存程序存储器,1KB的RAM数据存储器,以及一系列

    2024年02月04日
    浏览(55)
  • 第七章、stc89c52中的串行口通信

    串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。 STC89C52系列单片机内部集成有一个功能很强的全双工串行通信口 UART (Universal Asynchronous Receiver Transmitter,通用异步收发器),与传统8051单片机的串口完全兼容。设有

    2024年02月07日
    浏览(37)
  • STC89C52RC单片机原理图详解

    目录 1、单片机整体模块 2、 LED模块 3、独立按键模块 4、数码管模块 5、LCD1602模块 6、矩阵按键模块​编辑 7、串口通信模块 8、LED点阵屏模块 单片机使用的是TTL电平(一种电平的规范),规定为0V为低电平,5V为高电平; 字母上有一横,意为低电平有效。 单片机上电时,所有

    2024年02月05日
    浏览(54)
  • 【mcuclub】STC89C52单片机最小系统讲解

        3.1、主芯片 STC89C52是STC公司生产的一种低功耗、高性能8位微控制器 器件参数: 1、增强型8051单片机,指令代码完全兼容传统8051 2、工作电压:5.5V~3.3V 3、工作频率范围:0~40MHz,实际工作频率可达48MHz 4、用户应用程序空间为8K字节(程序空间) 5、片上集成512 字节RAM(

    2024年02月03日
    浏览(85)
  • 51单片机(二)8051内核及STC89C52介绍

    我们现在经常使用的STC89C52RC单片机就是基于8051内核的,它是深圳宏晶科技生产的一款单片机,它与MCS-51兼容,下面开始介绍STC89C52RC单片机。 1. STC89C52RC的兼容型号         STC89C52RC兼容 STC89C51RC,STCLE51RC,STC89C53RC,STC89LE52RC等。 以下是完整型号列表: 我们平时用的stc89c52已经能

    2024年02月06日
    浏览(55)
  • 基于STC89C52RC设计的心形流水灯设计

    基于STC89C52RC设计的心形流水灯设计 一·硬件设计分析 1.1 主控电路 主控单片机选择为STC89C52RC的 LQFP-44(10x10)封装 注意: 使用51单片机需要注意,如果需要使用的单片机的P0口,则需要在P0的IO口上接上一个4.7K-10K左右的上拉电阻。   上拉电阻的作用: 给单片机的I/O口拉高电平

    2024年02月08日
    浏览(46)
  • STC89C52 小车-舵机转向/蓝牙控制/寻迹,有PCB有讲解,更新

    推荐单片机:STC89C52或51(尽量52 还有提供 可用于测试直接烧录的89单片机文件(hex),不需要重新编译 。 还是老话: 源代码可以直接编译通过。 本人是自学,原创内容--转载请务必说明!! 所有下载在文章结尾(包全代码,附件) 代码:为个人gitHub库,无法或不会下载的可以评论

    2024年02月02日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包