单片微机原理P2:80C51外部中断与定时器系统
SETB IT1
SETB EX1
SETB PX1 ;设定外部中断1为高级中断
SETB EA
IT1 = ;
EX1 = ;
PX1 = ;
EA = ;
LOOP:
JB IE0, EVENT_OCCUR:
LJMP LOOP
EVENT_OCCUR:
;这里相当于可以是中断处理程序
CLR IE0 ;记得清掉IE0的状态
LJMP LOOP












MOV TMOD, #00000001B
MOV TH0, #0ECH
MOV TL0, #78H
SETB ET0
SETB TR0
SETB EA
TMOD = 0x01;
TH0 = 0xEC;
TL0 = 0x78;
ET0 = ;
TR0 = ;
EA = ;
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:
MOV IP, #014H ; PS:PT1:PX1:PT0:PX0 = 10100(INT1高级中断,串口高级中断)
SETB IT1 ;外部中断下降沿触发
SETB EX1 ;允许外部中断1
SETB ET1 ;允许定时器中断1
SETB ES ;打开串口中断
SETB EA
END ;写汇编程序千万不要忘记写END
int main()
{
IP = 0x14;
IT1 = ;
EX1 = ;
ET1 = ;
ES = ;
EA = ; return ;
}
解:方式0:2^13 - (6*10^6 * 10 *10^-3 )/12 = 3192 -> TH0(063H) TL0(018H)(注意TH0放高8位,TL0放低5位)。方式1:2^16 - (6*10^6 * 10 *10^-3 )/12 = 60536 -> TH0(0ECH) TL0(078H)方式2:2^8 - (6*10^6 * 10 *10^-3 )/12 < 0 (溢出不能设置)
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP EVENT_OCCUR
ORG 0100H
MAIN:
MOV R0, #00H ;设定队列初值0 MOV P1, #01H
MOV TMOD, #00000001B
MOV TH0, #0ECH
MOV TL0, #78H
SETB ET0
SETB TR0
SETB EA
AJMP $
EVENT_OCCUR:
CLR EA
PUSH ACC ;保护现场,虽然在这一题没必要
INC R0
CJNE R0, #, NEXT_EVENT
RL A
MOV P1, A
MOV R0, #00H NEXT_EVENT:
MOV TH0, #0ECH ;一定要记得重设初值
MOV TL0, #78H POP ACC ;恢复现场
RETI
END
_CODE_SEGMENT:
ORG 0000H
LJMP START
ORG 000BH
LJMP BUTTON_HASED_PUSHED
ORG 001BH
LJMP EVENTLOOP_OCCUR
ORG 0100H
START:
;crystal oscillator frequency is 12MHZ ;Register 0 is uesd to log the number pushing actions
MOV R0,#00H ;register 1 is uesd to log the microsecond event times
MOV R1,#00H MOV TH0,#0FFH
MOV TL0,#0FFH MOV TH1,#0D8H
MOV TL1,#0F0H MOV TMOD,#00010101B ;we must make time interrupt 1 is the advance interrupt
MOV IP,#02H SETB ET0
SETB TR0 SETB ET1
SETB TR1 SETB EA
LCALL DISPLAY_DIGITAL_NUM AJMP $
BUTTON_HASED_PUSHED:
INC R0
UPDATE_DIGITL_NUM:
LCALL DISPLAY_DIGITAL_NUM MOV TH0,#0FFH
MOV TL0,#0FFH RETI
EVENTLOOP_OCCUR:
PUSH ACC INC R1
CJNE R1,#,NEXT_EVENT MOV R0,#00H
LCALL DISPLAY_DIGITAL_NUM
MOV R1,#00H NEXT_EVENT:
MOV TH1,#0D8H
MOV TL1,#0F0H POP ACC
RETI
DISPLAY_DIGITAL_NUM:
CLR EA
PUSH ACC MOV A, R0
MOV DPTR, #DIGITAL_NUM
MOVC A, @A + DPTR
MOV P2, A POP ACC
SETB EA
RET
_DATA_SEGMENT:
DIGITAL_NUM:
DB 0C0H, 0F9H, 0A4H,0B0H,99H,92H,82H,0F8H,00H,90H
DB 88H, 83H, 0C6H, 0A1H, 86H, 8EH
END
#include<reg51.h>
#define FinalOuccr 200 unsigned char const digitalNumsSet[]
= {0xC0, 0xF9, 0xA4, 0xB0,
0x99, 0x92, 0x82, 0xF8,
0x00, 0x90, 0x88, 0x83,
0xC6, 0xA1, 0x86, 0x8E}; enum StarterTime{ TH0_Start = 0xFF,
TL0_Start = 0xFF,
TH1_Start = 0xD8,
TL1_Start = 0xF0}; //-----------------------------------------------------
void updateDigitalNumber(unsigned char const digitalNum); static int eventOccurTimes = , BtnPushedTimes = ; void ButtonPushed()interrupt using //中断1(定时器0中断),使用寄存器组0
{
BtnPushedTimes++;
updateDigitalNumber(digitalNumsSet[BtnPushedTimes]); TH0 = TH0_Start;
TL0 = TL0_Start;
} void EventOccur()interrupt using //中断3(定时器1中断),使用寄存器组1
{
eventOccurTimes++;
if(eventOccurTimes == FinalOuccr)
{
BtnPushedTimes = ;
updateDigitalNumber(digitalNumsSet[BtnPushedTimes]);
eventOccurTimes = ;
}
TH1 = TH1_Start;
TL1 = TL1_Start;
} int main()
{
TH0 = TH0_Start;
TL0 = TL0_Start; TH1 = TH1_Start;
TL1 = TL1_Start; TMOD = 0x15;
TCON = 0x50;
IP = 0X02;
ET0 = ;
ET1 = ;
EA = ; while(); return ;
} void updateDigitalNumber(unsigned char const digitalNum)
{
P2 = digitalNum;
}
单片微机原理P2:80C51外部中断与定时器系统的更多相关文章
- 单片微机原理P0:80C51结构原理
本来我真的不想让51的东西出现在我的博客上的,因为51这种东西真的太low了,学了最多就所谓的垃圾科创利用一下,但是想一下这门课我也要考试,还是写一点东西顺便放博客上吧. 这一系列主要参考<单片 ...
- 单片微机原理P1:80C51指令系统和编程方法
0. 寻址方式 寻址方式在汇编中是很重要的,汇编所有的操作都是和和内存或者寄存器打交道的,在80C51里面一共7种寻址方式. 1. 立即寻址: 这个没什么好说的,就是往寄存器或者内存里面写立即数, ...
- 十天学会单片机Day1点亮数码管(数码管、外部中断、定时器中断)
1.引脚定义 P3口各引脚第二功能定义 标号 引脚 第二功能 说明 P3.0 10 RXD 串行输入口 P3.1 11 TXD 串行输出口 P3.2 12 INT0(上划线) 外部中断0 P3.3 1 ...
- 单片微机原理P3:80C51外部拓展系统
外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC. 0. IO接口电路概念与存储器拓展 1. 为什 ...
- 单片微机原理P4:80C51串口与串行总线拓展
0. 串口通讯 0. 串口通讯的数据传输方式:单工(单向传输数据),半双工(非同时双向传输),全双工(同时,双向传输) 1. 根据通信方式的不同又分为同步通讯和异步通讯. 同步通讯:所有设备都使用同一 ...
- ATmega8仿真——外部中断的学习
前面我们学习了ATmega8的I/O口作为通用数字输入/输出口来用时对LED数码管控制和扫描按键的应用: 但ATmega8多数的I/O口都是复用口,除了作为通用数字I/O使用,还有其第二功能,这里我们 ...
- STM32 外部中断详解(原理+配置代码)
本文介绍了STM32基于标准外设库的外部中断配置,以及基于参考手册如何更加寄存器配置外部中断 文章目录 1 前言 2 STM32的外部中断 3 中断服务函数的映射关系 4 外部中断的配置 5 寄存器的 ...
- Cortex-M3学习日志(三)-- 外部中断0
无论是哪款单片机应该都有对应的中断的功能,中断在嵌入式系统的地位毋庸置疑.LPC1768微处理器包括4个外部中断,分别是EINT0.EINT1.EINT2.EINT3对应的引脚分别是P2.10~P2. ...
- 嵌入式外部中断控制编程方法论—比較CC2541(51核)和S5PV210(ARM核)
这是一篇阐述怎样对嵌入式SOC外部中断进行控制编程的方法论文章.希望读者理解本篇文章后.能够具备对市场上全部已经面世和将来面世的嵌入式芯片的外部中断进行控制编程的能力. 笔者原创的技术分享一直都恪守下 ...
随机推荐
- MongoDB 权限认证
MongoDB已经使用很长一段时间了,基于MongoDB的数据存储也一直没有使用到权限访问(MongoDB默认设置为无权限访问限制),因为考虑到数据安全的原因特地花了一点时间研究了一下,网上搜出来的解 ...
- mysql function 与 procedure
Mysql 的 function 和 procedure 有啥区别呢 ? 网上搜索后说 function 有返回值, procedure 无返回值. 1.return 从function 的语法角度 ...
- simplest_dll 最简dll的创建与隐式调用(显式调用太麻烦,个人不建议使用)
首先需要有个头文件,名字随便写 假设test.h //test.h #ifndef _TEST_H #define _TEST_H #ifdef TEST_EXPORTS //通过宏定义控制是输入还 ...
- web前端开发分享-css,js进阶篇
一,css进阶篇: 等css哪些事儿看了两三遍之后,需要对看过的知识综合应用,这时候需要大量的实践 经验, 简单的想法:把qq首页全屏另存为jpg然后通过ps工具切图结合css转换成html,有无 从 ...
- Linux中crond服务与crontab用法
需要写个在Linux下定时更新系统的脚本,man crondtab 不甚详细,现将网络上的介绍列举如下: crontab是一个很方便的在unix/linux系统上定时(循环)执行某个任务的程序使用cr ...
- sjtu1591 Count On Tree
Description Crystal家有一棵树.树上有\(n\)个节点,编号由\(1\)到\(n\)(\(1\)号点是这棵树的根),两点之间距离为1当且仅当它们直接相连.每个点都有各自的权值,第\( ...
- Twisted 阐述
原地址:http://bbs.gameres.com/thread_224020.html Firefly为什么使用Twisted?1.基于PythonTwisted是使用Python编写的,强壮的. ...
- DHTMLX 前端框架 建立你的一个应用程序 教程(十一)--添加/删除表格中的记录
添加/删除表格中的记录 我们的最终功能是在表格中添加删除 我们通过单机工具栏上的按钮来实现添加删除 当我们单击添加按钮的时候, 表单中 第一行默认填写New contact 光标自动聚焦 当用户点击删 ...
- Altium Designer中默认取消重复画线的选项
- Altium Designer完美双屏显示方法演示
布线时我们往往需要对一些信号线做特别的走线处理,这样需要边布线边对照原理图,在protel99中那是一个很痛苦的事,在Altium Designer中这种情况将变很简单. 硬件要求,笔记本+外接显示器 ...