单片微机原理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外部中断进行控制编程的方法论文章.希望读者理解本篇文章后.能够具备对市场上全部已经面世和将来面世的嵌入式芯片的外部中断进行控制编程的能力. 笔者原创的技术分享一直都恪守下 ...
随机推荐
- python 读写文本文件
本人最近新学python ,用到文本文件的读取,经过一番研究,从网上查找资料,经过测试,总结了一下读取文本文件的方法. 1.在读取文本文件的时无非有两种方法: a.f=open('filename', ...
- delphi xe5 android sample 中的 SimpleList 是怎样绑定的
C:\Users\Public\Documents\RAD Studio\12.0\Samples\FireMonkeyMobile 例子中的绑定方式如下图: 1.拖拽一个listview到界面上,然 ...
- zoj 3761
很简单但很虐心的一道题: 我感觉自己的算法没错,但是老是过不了:= = 但是还是把代码贴出来: 我的方法,用并查集的方式做一课树,然后对树进行遍历: 有多少棵树就有多少个点剩余: #include&l ...
- codeforces 390C Inna and Candy Boxes
这个题目看似不是很好下手,不过很容易发现每次询问的时候总是会问到第r个盒子是否有糖果: 这样的话就很好办事了: 维护两个数组: 一个sum数组:累加和: 一个in数组:如果i位是1的话,in[i]=i ...
- Altium自定义的快捷键设置
我想要在AD09里面设置自定义的快捷键,例如将布线设置成键盘上的字母E键,如何设置求大神指点!感激不尽!!! 为什么快捷键都要发一篇文章呢?主要是AD换层的快捷键是*号,与其他快捷键离的很远,一个AD ...
- MinGW 编译libwebsockets
libwebsockets是一个轻量的纯C库,在这里尝试使用MinGW进行构建. 官网地址:http://libwebsockets.org/trac/libwebsockets下载地址:http:/ ...
- 点点滴滴-ConfigurationManager.AppSettings
在写程序的配置文件,里面添加了几个配置,下面是appSettings节点的设置 <appSettings> <add key="StyleFolder" valu ...
- linux PCI设备初始化过程
linux PCI设备初始化过程 start_kernel->rest_init 这个函数会启动一个核心线程0, 核心线程然后调用init -> do_basic_setup. 然后我们开 ...
- 【HDOJ】1026 Ignatius and the Princess I
这道题搞了很久啊.搜索非常好的一道题.昨天想了2小时,以为是深搜,但后来发现深搜怎么也没法输出正确路径.今天拿宽搜试了一下,问题就是普通的队列宽搜没法得到当前时间最小值.看了一下讨论区,发现优先级队列 ...
- 【HDOJ】1203 I NEED A OFFER!
DP问题. #include <stdio.h> #define MAXNUM 10002 int main() { int m, n; int cost[MAXNUM]; // the ...