80386EX芯片的“除零”中断服务程序如何运行?

bailingke 2004-09-16 10:13:07
80386EX芯片的系统保留中断INT0H是“除零”中断,有谁知道CPU如何响应这个中断?
根据我的尝试,发现此中断发生后,确实进入了我写的中断服务程序内,但返回后出错,继续产生“除零”中断,而并非返回到下一句指令,这是为什么?

...全文
200 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunrui 2004-09-19
  • 打赏
  • 举报
回复
第三卷有7M,用email发有困难。developer.intel.com上有下载
Areslee 2004-09-19
  • 打赏
  • 举报
回复
使用内嵌汇编
内核是不可能完全用C写的
bailingke 2004-09-19
  • 打赏
  • 举报
回复
我的程序全部用C语言开发的,包括中断服务程序,我怎么在中断服务程序中修改发生中断的条件呢?请易水兄继续赐教,谢谢。
wangziz 2004-09-18
  • 打赏
  • 举报
回复
帮你UP
楼主,可以也发给我么?头1,2卷我也想要。
wangziz@hotmail.com
小于1.7mb的话。
谢谢了!
bailingke 2004-09-18
  • 打赏
  • 举报
回复
wangziz(zi),我将在近期将1 2卷发给你.

Areslee(懒虫易水) ,如何将产生中断和条件清除掉,中断地址我可以找到的.请阐述得详细些,谢谢,明天结帖.
Areslee 2004-09-18
  • 打赏
  • 举报
回复
对于GP、除0、分页之类的异常处理必须找到中断的地址将产生中断和条件清除掉,否则返回肢仍会继续出现
比如有指令
mov eax,1111
mov ebx,0
div ebx
会产生除0中断,如果你不把EBX改为非0,那么你的中断处理程序返回后它仍然会产生该异常
Areslee 2004-09-18
  • 打赏
  • 举报
回复
比如,按偶的例子,将EBX改为非0再返回
或者将被中断的指令改为全NOP。。。。。。
diangong 2004-09-18
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/3385/3385068.xml?temp=.666073
bailingke 2004-09-17
  • 打赏
  • 举报
回复
我的中断服务程序内,输出了开关量,因此得以知道返回地址和普通中断的返回地址不同。

sunrui(sunrui),你好,我只有IA32参考手册的前两卷,你有第三卷吗?可以发给我吗?或指明下载的地址,谢谢。bailingke@vip.sina.com
大熊猫侯佩 2004-09-17
  • 打赏
  • 举报
回复
楼主你的中断处理程序内容是 What ?
sunrui 2004-09-16
  • 打赏
  • 举报
回复
除法错异常属于Fault异常类,也就是保存的EIP地址指向导致异常的指令,而不是那条指令的下一条指令。参见IA32参考手册第三卷第五章。
有急救车的交通灯控制实验 一.实验目的 1.学习掌握多个接口芯片综合应用方法。 2.学习中断技术的基本使用方法。 3.学习模拟交通灯控制的实现方法。 4.学习控制程序的编程方法。 二.实验条件和要求 1.用业余时间进行调研,了解交通灯燃灭的规律,并写出调研报告,并在此基础上设计出硬件电路原理图。 2.在设计硬件电路时,要充分利用实验仪上的接口芯片,如8051单片机、8255并行接口芯片、发光二极管(红、黄、绿各两个)。 设计或利用接口仪上已有的单脉冲发生器,但脉冲发生器产生的负脉冲来产生中断,进行模拟有急救车通过。 3.编制相应的软件应用程序,并运行调试。 4.写出规范的实验报告。实验报告用A4纸写出。 三.交通灯控制码 十六进制 二进制 状态1 C3H 11000011B 状态2 12H 00010010B 状态3 06H 02H 00000110B 00000010B 状态4 21H 00100001B 状态5 09H 01H 00001001B 00000001B 紧急情况 C3H 11000011B 四.应用程序 CSEG AT 0000H LJMP START CSEG AT 4003H LJMP JJ CSEG AT 400BH LJMP TIMB CSEG AT 401BH LJMP COUNT CSEG AT 4100H START:MOV SP ,#60H SETB IT0 SETB BA SETB EX0 SETB ET0 SETB ET1 MOV DPTR,#0CFA3H MOV A,#80H ;初始化8255,A为输入口 MOVX @DPTR,A NOP MOV TMOD,#61H ;初始化计数器0.1S MOV TH0,#3CH MOV TL0 #0B0H MOV TH1,#9CH MOV TL1,#9CH ;计数100次 MOV R2,#00H STA0: MOV DPTR,#0CFA0H MOV A,#03H MOVX @DPTR,A MOV R6,A
宁波技师学院 课 程 设 计 报 告 设计课题:单片机——中断控制流水灯 摘 要 随着计算机技术的迅猛发展,计算机越来越广泛地应用于人们工作和生活的各个 领域。作为计算机领域里的一个重要方面单片机及其应用技术近年来也得到了长足的 发展。 单片机被广泛地应用在工业自动化控制、智能仪器仪表、数据采集、通讯以及家 用电器等领域。单片机以其与通用微机完全不同的发展模式,不断满足工业测控、恶 劣环境下可靠运行的要求。、单片机已成为现代工业领域中不可缺少的重要角色。 单片机技术的发展速度十分迅速,速度更快、功能更强的16位、32位单片机以及 陆续问世,但8位机,特别是新一代高档8位机具有优异的性能,已能满足大部分单片 机应用领域的需要,另外,它还具有可靠性高、外围芯片配套、系统结构简单、应用 软件丰富、技术成熟、开发应用方便等优点,在单片机市场中依旧据有一定地位。 目录 一 总体设计方案 1 1.1系统设计方案 1 1.2系统结构框图 1 二系统硬件设计 2 2.1晶振电路 2 2.2复位电路 3 2.3数码管电路 4 2.4LED指示电路与模式电路 5 三 软件设计 6 3.1主程序流程图 6 3.2程序图 7 四 制作与调试 11 五 结论 12 六 致谢 13 附录1系统实物图 14 2实验原理图 15 3系统仿真图 16 4 PCB原理图 17 一 总体设计方案 1.1系统设计方案 流水灯系统主要由:复位电路、晶振电路、数码管显示电路、LED灯指示电路、速 度与方式选择电路等部分电路组成。 各器件的选用: 1 单片机的选用: 单片机芯片选用AT89C51。 2数码管的选用: 数码管选用共阳极数码管。 3晶振的选用: 晶振选用的是12MHZ。 1.2系统结构框图 框图如图1.2-1。 图1..2-1系统结构框图 二系统硬件设计 复位电路、晶振电路、数码管显示电路迪电路组成。 2.1晶振电路 图2.1-1晶振电路 内部方式时钟电路如图2.1- 1所示。在XTAL2和XTAL2引脚上外接定时元件,内部振荡电路就产生自激振荡。 2.2复位电路 图2.2-1按键复位电路 按键手动复位有电平方式和脉冲方式。而此次选用的便是按键电平复位。按键电 平复位是通过复位端经电阻与Vcc接通而实现的。电路如图2.2-1所示。 2.3数码管电路 图2.3-1数码管电路 此电路可以十分清楚的体现出当前LED指示灯所运行的模式。 图2.3-2数码管 2.4LED指示电路与模式电路 图2.4-1 LED指示电路 此电路可以明显的反映出LED的运行状态,如图2.4-1所示。 图2.4-2 模式选择电路 此电路可以选择LED指示灯的运行模式与启动停止,如图2.4-2所示。 三 软件设计 3.1主程序流程图 流水灯程序流程图 图3.1-1流程图 流水灯程序根据流程图所写,根据按钮是否按下跳起来判断是否执行下一条指令 ,从而使LED指示灯与数码管显示出已设置好的值。 3.2程序图 ORG 0000 JMP MAIN ORG 0003H JMP M1 ORG 0013H JMP M2 MAIN: MOV P2,#00H CLR 30H MOV P3,#0FFH SETB EA SETB EX0 SETB IT0 LOOP1: JB 30H,LOOP JMP LOOP1 LOOP: SETB EX1 SETB IT1 MOV R1,#00H LOOP35:CJNE R1,#01H,LOOP33 JMP LOOP2 LOOP33: CJNE R1,#02H,LOOP34 JMP LOOP3 LOOP34:CJNE R1,#03H,LOOP35 JMP LOOP4 LOOP2: MOV P1,#80H MOV P2,#0FFH LCALL DELY MOV P1,#0C0H MOV P2,#00H JB 30H,LOOP20 JMP LOOP1 LOOP20: LCALL DELY CJNE R1,#01H,D1 JMP LOOP2 D1: CJNE R1,#02H,LOOP4 JMP LOOP3 LOOP3: MOV DPTR,#TABLE MOV R3,#00H MOV R4,#9 MOV A,#01H LOOP11: MOV P2,A MOV A,R3 MOVC A,@A+DPTR MOV P1,A JB 30H,LOOP21 JMP LOOP1 LOOP21: LCALL DELY MOV A,P2 SETB C RLC A INC R3 CJNE R1,#02H,D3 JMP D4 D3: CJNE R1,#03H,LOOP2 JMP LOOP4 D4: DJNZ R4,LOOP11 JMP LOOP3 LOOP4: MOV R3,#00H MOV R4,#00H M
51单片机红外遥控解码程序默认分类 2009-10-18 22:45:22 阅读702 评论0 字号:大中小 订阅 以下是网友编写的遥控解码程序!一种用延时等待的解码方法,比较容易理解,但缺点是占用CPU运行时间,第二种方法用定时器和外中断的解码方法,初学不易理解,但优点也很明显,第二种方法如果能解决连发解码就比较完美,更完善的红外遥控解码程序,请参考本站TOPAV-2008,TOP51-2005所配程序。 解码方法一 ;//单片机接收红外解读程序\\ ;硬件结构:8951,P0口数码管段码,P2.0-P2.3为位,P1为8个LED ;P3.2为红外接收头,P2.7蜂鸣器,晶振12M ;适用UPD6121 6122芯片接收 ;--------------------------------------------------------- ORG 0000H AJMP MAIN ;转入主程序 ORG 0003H ;外部中断P3.2脚INT0入口地址 AJMP INT ;转入外部中断服务子程序(解码程序) ;以下为主程序进行CPU中断方式设置 MAIN: SETB EA ;打开CPU总中断请求 SETB IT0 ;设定INT0的触发方式为脉冲下降沿触发 SETB EX0 ;打开INT0中断请求 AJMP $ ;以下为进入P3.2脚外部中断子程序,也就是解码程序 INT: CLR EA ;暂时关闭CPU的所有中断请求 MOV R6,#10 SB: ACALL YS1 ;调用882微秒延时子程序 JB P3.2,EXIT ;延时882微秒后判断P3.2脚是否出现高 ; 电平如果有就退出解码程序 DJNZ R6, SB ;重复10次,目的是检测在8820微秒内 ;如果出现高电平就退出解码程序 ;以上完成对遥控信号的9000微秒的初始低电平信号的识别。 JNB P3.2, $ ;等待高电平避开9毫秒低电平引导脉冲 ACALL YS2 ;延时4.74毫秒避开4.5毫秒的结果码 MOV R1,#1AH ;设定1AH为起始RAM区 MOV R2,#4 ; PP: MOV R3,#8 JJJJ: JNB P3.2,$ ;等待地址码第一位的高电平信号 LCALL YS1 ;高电平开始后用882微秒的时间尺去判断信 ;号此时的高低电平状态 MOV C,P3.2 ;将P3.2引脚此时的电平状态0或1存入C中 JNC UUU ;如果为0就跳转到UUU LCALL YS3 ; UUU: MOV A,@R1 ;将R1中地址的给A RRC A ;将C中的值0或1移入A中的最低位 MOV @R1,A ;将A中的数暂时存放在R1中 DJNZ R3,JJJJ ;接收地址码的高8位 INC R1 ;对R1中的值加1,换下一个RAM DJNZ R2,PP ;接收完16位地址码和8位数据码和8位数据反 ; 码,存放在1AH/1BH/1CH/1DH的RAM中 MOV A,1CH ;比较数据码和数据反码是否正确? CPL A XRL A,1DH ;将1CH的值取反后和1DH比较 不同则无效丢弃,核对数据是否准确 JNZ EXIT MOV DPTR,#TAB ;表头地址送指针 MOV A,1DH ANL A,#0FH ;相与,得到低四位码 MOVC A,@A+DPTR MOV 1EH,A ;查表得表码存入1EH MOV A,1DH SWAP A ANL A,#0FH MOVC A,@A+DPTR MOV 1FH,A ;查表得高四位码存入1F MOV R7,#20H DISP: MOV P0,1FH ;送数码管显示 CLR P2.1 ACALL YS2 SETB P2.1 MOV P0,1EH CLR P2.2 ACALL YS2 SETB P2.2 MOV P1,1DH ;将按键的键值通过P1口的8个LED显示出来! CLR P2.7 ;蜂鸣器鸣响-嘀嘀嘀-的声音,表示解码成功 LCALL YS2 SETB P2.7 ;蜂鸣器停止 DJNZ R7,DISP EXIT: SETB EA ;允许中断 RETI ;退出解码子程序 YS1: MOV R4,#20 ;延时子程序1,精确延时882微秒 D1: MOV R5,#20 DJNZ R5,$ DJNZ R4,D1 RET YS2: MOV R4,#10 ;延时子程序2,精确延时4740微秒 D2: MOV R5,#235 DJNZ R5,$ DJNZ R4,D2 RET YS3: MOV R4,#2 ;延时程序3,精确延时1000微秒 D3:MOV R5,#248 DJNZ R5,$ DJNZ R4,D3 RET TAB: DB 0C0H,0DEH,0A2H,8AH,9CH,89H,81H,0DAH,80H,88H,90H,85H,0E1H,86H,0A1H,0B1H;数据表,0-9-A-F END 解码方法二 你的解码程序和我现在用的解码程序大体是一样的,我自己实际做了一下,发现按下遥控器,接收到红外信号后,数码管闪的厉害。我用的是6位动态数码管。不知道你有没有遇到这样的情况? 分析解码程序,感觉是中断的时间太长了,数码管当然会闪了。如果把数码管用定时器刷新的话,又存在定时中断和外中断的优先级问题,好难解决啊。 我初步有个想法。就是用定时器计算两次外中断间隔的时间。以此来确定是连发码,数据“0”,数据“1”。不知道这个想法可否行的通。这几天没有时间试,因为广州有个电子产品交易会,我要赶着做样机。过了几天我有空了在仔细的做一遍。把结果告诉大家。 不用连续解码,只需在中断时读取定时器的时间,然后判断是0或者1就可以了,实际测试已经OK了,谢谢两位的热心帮助。 为了这个程序,弄了两天的时间,饭都吃不好,现在弄通了,感觉真的很好。 我现在用6个数码管显示遥控器的用户码,用户反码,按键码,无论怎么按遥控器,数码管都不会闪的。 楼上的,我是这样解决闪烁问题的,用显示子程序计算出适当次数代替延时YS1 YS2 YS3子程序 ;====================================================================================== ;红外解码程序 ;晶体:11.0592M ;日期:2005-10-14 ;功能:将6122发射IC发射的红外码解码,储存在CODE1--CODE4中,并用6个数码管显示用户码,用户反码,按键码 ;====================================================================================== ORG 0000H AJMP MAIN ORG 0003H AJMP REMOT ORG 000BH AJMP TIME0 ;------------------------------------------------------ IR BIT P3.2 CODE1 EQU 30H ;遥控用户码 CODE2 EQU 31H ;遥控用户反码 CODE3 EQU 32H ;按键码 CODE4 EQU 33H ;按键反码 TIME1_REMOT EQU 34H ;每次接收的码BIT数 TIME2_REMOT EQU 35H ;允许重码次数 TIME3_REMOT EQU 36H ;按键数目存放 ;--------------------------------------------------------- DIG1 BIT P2.1;第一位数码管选通 DIG2 BIT P2.5;第二位数码管选通 DIG3 BIT P2.0;第三位数码管选通 DIG4 BIT P2.4;第四位数码管选通 DIG5 BIT P2.6;第五位数码管选通 DIG6 BIT P2.3;第六位数码管选通 ;---------------------------------------- D1 EQU 40H D2 EQU 41H D3 EQU 42H D4 EQU 43H D5 EQU 44H D6 EQU 45H ORG 0030H ;=============================初始化=============================== MAIN: SETB EA ;开总中断 MOV TMOD,#1H ;定时器0工作于方式1 SETB ET0 ;启动定时器0 SETB TR0 MOV TH0,#0 ;预置数0 MOV TL0,#0 SETB EX0 ;开外中断0 SETB IT0 MOV TIME1_REMOT,#32;接收的码一共32BIT:4*8 CLR P1.0 MOV D1,#10H MOV D2,#10H MOV D3,#10H MOV D4,#10H MOV D5,#10H MOV D6,#10H ;============================初始化完毕============================ ;=============================主程序============================== LOOP: ; ACALL FENLI ACALL DIG AJMP LOOP ;=============================主程序完毕========================== ;=============================红外解码中断程序========================= ;============================================= ;以下为红外中断解码程序 ;接收头引脚P3.2 ;按键反码: CODE1 ;按键码:CODE2 ;用户反码: CODE3 ;用户码:CODE4 ;接收码的BIT数:TIME1_REMOT ;重码次数:TIME3_REMOT; ;入口函数: ;出口函数:R0---按键反码 R1----按键码 R2---用户反码 R3----用户码 R4---按键标准键值 ;============================================= REMOT: CLR EA ;关总中断 PUSH ACC PUSH PSW PUSH DPH PUSH DPL CLR P1.7 ;-----------------判断定时器运行时间是否大于12.288MS----------------- MOV A,TH0 ;读入此时TH0,判断是否大于设定的数 CLR C ;清除C避免误判 SUBB A,#2CH ;11.0592-2C 12M-30 6M-18 4M-10 24M-60 JC REMOT1 ;小于12.220往下判断 AJMP EXIT_REMOT1 ;大于2BFF*1.085=12.220MS则退出 ;-----------------判断定时器运行时间是否小于0.768MS------------------ REMOT1: MOV A,TH0 CLR C SUBB A,#23H ;11.0592-2 12M-3 6M*-1 4M-1 24M-6 JNC REMOT2 AJMP EXIT_REMOT ;小于0.768作误码,退出 ;------------------判断定时器运行时间是否小于2MS--------------------- REMOT2: MOV A,TH0 CLR C SUBB A,#7H ;11.0592-7 12M-7 6M-3 4M-2 24M-0FH JC REMOT4 AJMP REMOT3 ;小于2MS,做数据:"0:处理 ;-----------------判断定时器运行时间是否小于11.5MS------------------- REMOT3: MOV A,TH0 CLR C SUBB A,#29H ;11.0592-29 12M-2C 6M-16 4M-0EH 24M-59 JC REMOT5 ;小于11.5MS,做数据"1"处理 AJMP REMOT6 ;否则作重码处理 ;----------------数据"0"---------------------- REMOT4: CLR C AJMP REMOT7 ;----------------数据"1"-------------------- REMOT5: SETB C AJMP REMOT7 ;----------------重码------------------------ REMOT6: DJNZ TIME3_REMOT,EXIT_REMOT MOV TIME3_REMOT,#2 AJMP EXIT_REMOT1 ;---------------储存数据-------------------- REMOT7: MOV A,CODE1 RRC A MOV CODE1,A MOV A,CODE2 RRC A MOV CODE2,A MOV A,CODE3 RRC A MOV CODE3,A MOV A,CODE4 RRC A MOV CODE4,A DJNZ TIME1_REMOT,EXIT_REMOT MOV TIME1_REMOT,#32;判断是否接收完32位, MOV R0,CODE1 MOV R1,CODE2 MOV R2,CODE3 MOV R3,CODE4 AJMP BIJIAO ;此处设置断点,R0--按键反码 ;R1---按键码 ;R2---用户反码 ;R3---用户码 ;---------------用户码判断------------------------- BIJIAO: ; MOV A,CODE4 ; CJNE A,#10H,EXIT_REMOT ; MOV A,CODE3 ; CJNE A,#0EFH,EXIT_REMOT ;---------------按键码判断----------------------- MOV A,CODE2 CPL A XRL A,CODE1 JNZ EXIT_REMOT ACALL FENLI AJMP EXIT_REMOT1 ;--------------将按键码转换为标准的码值----------- OK_REMOT: MOV TIME3_REMOT,#15 ;按键数:15个按键 MOV R4 DPTR,#TAB_REMOT ;指针指向按键码值表 OK_REMOT1: MOV A,TIME3_REMOT ;将码值表第一个数与CODE2比较 MOVC A,@A+DPTR XRL A,CODE2 JZ OK_REMOT2 ;相同,已经找到,跳转出口 DJNZ TIME3_REMOT,OK_REMOT1;不同,未找到,取下一个按键码值比较,直到相同为止 AJMP EXIT_REMOT1 ;已经找完码值表,未找到匹配数据,退出 ;------------- OK_REMOT2: MOV R4,TIME3_REMOT ;将标准码值存入R4 AJMP EXIT_REMOT ;--------------------按键码值表------------------------ TAB_REMOT: DB 0H ;SETB ;ST.BY-INPUT-REST DB 04H,02H,06H ; ;FR- MAST+ FR+ DB 0EH,07H,00H ; ;SUB- MUTE SUB+ DB 10H,0FH,12H ; ;CEN- MAST+ CEN+ DB 13H,03H,0AH ; ;SUR- SET75 SUR+ DB 11H,08H,01H ;---------------解码中断退出程序-------------------- EXIT_REMOT1: ;异常退出 MOV TIME1_REMOT,#32 EXIT_REMOT: ;正常退出 MOV TH0,#0 ;重设定时器0 MOV TL0,#0 SETB EA SETB TR0 ;开中断 ; SETB EX0 CLR IE0 ;清外中断标志,避免反复中断 POP DPL POP DPH POP PSW POP ACC ;出栈 SETB P1.7 RETI ;=========================红外解码中断程序完毕==================== ;=========================定时中断程序============================ ;============================================================ ;以下为定时器中断程序 ;功能:每120MS清除遥控用户码缓存 ;入口函数: ;出口函数: ;============================================================ TIME0: CLR EA MOV TH0,#0 MOV TL0,#0 MOV CODE1,#0 MOV CODE2,#0 MOV CODE3,#0 MOV CODE4,#0 SETB EA RETI ;============================================================== ;=======================以下为数码管显示数分离子程序================ ; ;功能:将遥控器的用户码,用户反码,按键码,的十位与个位分离 ;入口函数:R3--用户码,R2--用户反码,R1---按键码 ;出口函数:D1-用户码十位,D2--用户个位,D3--用户反码十位,D4---用户反码个位, ; ;D5---按键码十位,D6---按键码个位 ;---------------------------------------------------------- FENLI: MOV A,R3 ;分离用户反码 MOV B,#16 DIV AB MOV D1,A MOV D2,B MOV A,R2 ;分离用户码 MOV B,#16 DIV AB MOV D3,A MOV D4,B MOV A,R1 ;分离按键码 MOV B,#16 DIV AB MOV D5,A MOV D6,B RET ;-----------分离完毕------------------------- ;===================以下为数码管显示子程序======================= ;入口函数:D1---D6 ;-------------------------------------------------------------- DIG: MOV DPTR,#TAB_DIG ;显示用户反码十位 MOV A,D1 MOVC A,@A+DPTR MOV P2,#0FFH MOV P0,A CLR DIG1 ACALL YS2MS MOV DPTR,#TAB_DIG ;显示用户反码个位 MOV A,D2 MOVC A,@A+DPTR MOV P2,#0FFH MOV P0,A CLR DIG2 ACALL YS2MS MOV DPTR,#TAB_DIG ;显示用户码十位 MOV A,D3 MOVC A,@A+DPTR MOV P2,#0FFH MOV P0,A CLR DIG3 ACALL YS2MS MOV DPTR,#TAB_DIG ;显示用户码个位 MOV A,D4 MOVC A,@A+DPTR MOV P2,#0FFH MOV P0,A CLR DIG4 ACALL YS2MS MOV DPTR,#TAB_DIG ;显示按键码十位 MOV A,D5 MOVC A,@A+DPTR MOV P2,#0FFH MOV P0,A CLR DIG5 ACALL YS2MS MOV DPTR,#TAB_DIG ;显示按键码个位 MOV A,D6 MOVC A,@A+DPTR MOV P2,#0FFH MOV P0,A CLR DIG6 ACALL YS2MS ;---------------------------显示完毕----------------------------------- RET ;------------------------------数码管段码表------------------------------------ TAB_DIG: ;0 1 2 3 4 5 6 7 8 9 A B C D E F 全亮 消隐 DB 5H,0B7H,51H,31H,0A3H,29H,9H,37H,1H,21H,3H,89H,4DH,4DH,49H,4BH,0h,0ffh ;------------------------------延时------------------------------------------- YS2MS: MOV R7,#15 DEL1:MOV R6,#100 DJNZ R6,$ DJNZ R7,DEL1 RET END
ADC809的运用及电路很全面 ADC0809引脚图与接口电路 A/D转换器芯片ADC0809简介 8路模拟信号的分时采集,片内有8路模拟选通开关,以及相应的通道抵制锁存用译码电路,其转换时间为100μs左右。 图9.8 《ADC0809引脚图》 1. ADC0809的内部结构 ADC0809的内部逻辑结构图如图9-7所示。 图9.7 《ADC0809内部逻辑结构》 图中多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用一个A/D转换器进行转换,这是一种经济的多路数据采集方法。地址锁存与译码电路完成对A、B、C 3个地址位进行锁存和译码,其译码输出用于通道选择,其转换结果通过三态输出锁存器存放、输出,因此可以直接与系统数据总线相连,表9-1为通道选择表。 表9-1 通道选择表 2.信号引脚 ADC0809芯片为28引脚为双列直插式封装,其引脚排列见图9.8。 对ADC0809主要信号引脚的功能说明如下: IN7~IN0——模拟量输入通道 ALE——地址锁存允许信号。对应ALE上跳沿,A、B、C地址状态送入地址锁存器中。 START——转换启动信号。START上升沿时,复位ADC0809;START下降沿时启动芯片,开始进行A/D转换;在A/D转换期间,START应保持 低电平。本信号有时简写为ST. A、B、C——地址线。 通道端口选择线,A为低地址,C为高地址,引脚图中为ADDA,ADDB和ADDC。其地址状态与通道对应关系见表9-1。 CLK——时钟信号。ADC0809的内部没有时钟电路,所需时钟信号由外界提供,因此有时钟信号引脚。通常使用频率为500KHz的时钟信号 EOC——转换结束信号。EOC=0,正在进行转换;EOC=1,转换结束。使用中该状态信号即可作为查询的状态标志,又可作为中断请求信号使用。 D7~D0——数据输出线。为三态缓冲输出形式,可以和单片机的数据线直接相连。D0为最低位,D7为最高 OE——输出允许信号。用于控制三态输出锁存器向单片机输出转换得到的数据。OE=0,输出数据线呈高阻;OE=1,输出转换得到的数据。 Vcc—— +5V电源。 Vref——参考电源参考电压用来与输入的模拟信号进行比较,作为逐次逼近的基准。其典型值为+5V(Vref(+)=+5V, Vref(-)=-5V). 9.2.2 MCS-51单片机与ADC0809的接口 ADC0809与MCS-51单片机的连接如图9.10所示。 电路连接主要涉及两个问题。一是8路模拟信号通道的选择,二是A/D转换完成后转换数据的传送。 1. 8路模拟通道选择 图9.10 ADC0809与MCS-51的连接 如图9.11所示模拟通道选择信号A、B、C分别接最低三位地址A0、A1、A2即(P0.0、P0.1、P0.2),而地址锁存允许信号ALE由P2.0控制,则8路模拟通道的地址为0FEF8H~0FEFFH.此外,通道地址选择以 作写选通信号,这一部分电路连接如图9.12所示。 图9.11 ADC0809的部分信号连接 图9.12 信号的时间配合 从图中可以看到,把ALE信号与START信号接在一起了,这样连接使得在信号的前沿写入(锁存)通道地址,紧接着在其后沿就启动转换。图9.19是有关信号的时间配合示意图。 启动A/D转换只需要一条MOVX指令。在此之前,要将P2.0清并将最低三位与所选择的通道好像对应的口地址送入数据指针DPTR中。例如要选择IN0通道时,可采用如下两条指令,即可启动A/D转换: MOV DPTR , #FE00H ;送入0809的口地址 MOVX @DPTR , A ;启动A/D转换(IN0) 注意:此处的A与A/D转换无关,可为任意值。 2. 转换数据的传送 A/D转换后得到的数据应及时传送给单片机进行处理。数据传送的关键问题是如何确认A/D转换的完成,因为只有确认完成后,才能进行传送。为此可采用下述三种方式。 (1)定时传送方式 对于一种A/D转换其来说,转换时间作为一项技术指标是已知的和固定的。例如ADC0809转换时间为128μs,相当于6MHz的MCS-51单片机共64个机器周期。可据此设计一个延时子程序,A/D转换启动后即调用此子程序,延迟时间一到,转换肯定已经完成了,接着就可进行数据传送。 (2)查询方式 A/D转换芯片由表明转换完成的状态信号,例如ADC0809的EOC端。因此可以

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧