微机实验报告7 定时/计数器应用实验

     

班级  软件工程16-1  学号  3162052051116  姓名  张识虔  同组实验者              

实验名称             定时/计数器应用实验                     日期 2018 11 11

一、实验目的:

1. 掌握8254的工作方式及应用编程。

 2. 掌握8254典型应用电路的接法。

二、实验环境:

PC机一台,TD-PITD实验装置一套,示波器一台。

 

三、实验内容:

 

  1. 计数应用实验。编写程序,应用8254的计数功能,使用单次脉冲模拟计数, 使每当按动‘KK1+5次后,产生一次计数中断,并在屏幕上显示一个字符‘5’。

 

 2. 定时应用实验。编程程序,应用8254的定时功能,产生一个1Hz的方波。

3.3.4 实验原理

 

8254Intel公司生产的可编程间隔定时器。是8253的改进型,比8253具有更 有优良性能。8254具有以下基本功能。

1 3个独立的16位计数器。

 2 每个计数器可按二进制或十进制(BCD)计数。

3 每个计数器可编程工作于6种不同的工作方式。

4 8254每个计数器允许的最高计数频率为10MHz82532MHz)。

 5 8254有读回命令(8253没有),除了可以读出当前计数单元的内容外, 还可以读出寄存器的内容。

6 计数脉冲可以是有规律的时钟信号,也可以是随机信号。计数初值公 :n=fCLKi/fOUTi、其中fCLKi是输入时钟脉冲的频率,fOUTi是输出波形的频率。

 

 8254 实验单元电路图如图 3-3-1 所示,8254 的内部结构框图和引脚图如图 3-3-2 所示,它是由与 CPU 的接口、内部控制电路和三个计数器组成。8254 工作方式如下述:

1 方式0:计数到0结束输出正跃变信号方式。

 2 方式1:硬件可重触发单稳方式。

 3 方式2:频率发生器方式。

4 方式3:方波发生器。

5 方式4:软件触发选通方式。

6 方式5:硬件触发选通方式。

 

 

3-3-1  8254 实验电路原理图

3-3-2  8254 的内部接口和引脚

 

8254 的控制字有两个:一个用来设置计数器的工作方式,称为方式控制字; 另一个用来设置读回命令,称为读回控制字。这两个控制字共用一个地址,由标 识位来区分。控制字格式如表 3-3-13-3-23-3-3 所示。

 

3-3-1  8254 的方式控制字格式

 

3-3-2  8254 读出控制字格式

 

3-3-3  8254 状态字格式

 

3.3.5 实验步骤

1. 计数应用实验

编写程序,将 8254 的计数器 0 设置为方式 3,计数值为十进制数 4,用单次 脉冲 KK1+作为 CLK0 时钟,OUT0 连接 INTR,每当 KK1+按动 5 次后产生中 断请求,在屏幕上显示字符“5”。实验步骤如下:

1 实验接线图如图 3-3-3 所示,按图连接实验线路图。

2 根据实验内容,编写实验程序,编译、链接。

3 运行程序,按动 KK1+产生单次脉冲,观察实验现象。

4 改变计数值,验证 8254 的计数功能。

 

3-3-3  8254 计数应用实验接线图

 

;T8254-1.asm

;查看端口资源分配情况,记录实验系统I/O端口始地址



INTR_IVADD     EQU   003CH        ;INTR对应的中断矢量地址



IOY0           EQU   0C000H        ;片选IOY0对应的端口始地址

MY8254_COUNT0  EQU   IOY0+00H*2   ;8254计数器0端口地址

MY8254_COUNT1  EQU   IOY0+01H*2   ;8254计数器1端口地址

MY8254_COUNT2  EQU   IOY0+02H*2   ;8254计数器2端口地址

MY8254_MODE    EQU   IOY0+03H*2   ;8254控制寄存器端口地址

                              

STACK1 SEGMENT STACK

        DW 256 DUP(?)

STACK1 ENDS



DATA SEGMENT

CS_BAK   DW  ?                    ;保存INTR原中断处理程序入口段地址的变量

IP_BAK   DW  ?                    ;保存INTR原中断处理程序入口偏移地址的变量

IM_BAK   DB  ?                    ;保存INTR原中断屏蔽字的变量

STR1     DB  'COUNT: $'           ;显示的字符串

DATA ENDS



CODE SEGMENT

        ASSUME CS:CODE,DS:DATA



START: MOV AX,DATA

       MOV DS,AX

       CLI



       MOV AX,0000H               ;替换INTR的中断矢量

       MOV ES,AX

       MOV DI,INTR_IVADD         

       MOV AX,ES:[DI]

       MOV IP_BAK,AX              ;保存INTR原中断处理程序入口偏移地址

       MOV AX,OFFSET MYISR

       MOV ES:[DI],AX             ;设置当前中断处理程序入口偏移地址



       ADD DI,2

       MOV AX,ES:[DI]

       MOV CS_BAK,AX              ;保存INTR原中断处理程序入口段地址

       MOV AX,SEG MYISR

       MOV ES:[DI],AX             ;设置当前中断处理程序入口段地址



       IN  AL,21H

       MOV IM_BAK,AL              ;保存INTR原中断屏蔽字

       AND AL,7FH

       OUT 21H,AL



       STI

       MOV DX,OFFSET STR1         ;显示字符串

       MOV AH,9

       INT 21H



       MOV DX,MY8254_MODE         ;初始化8254工作方式

       MOV AL,10H                 ;计数器0,方式0 

       OUT DX,AL            



       MOV DX,MY8254_COUNT0       ;装入计数初值

       MOV AL,4

       OUT DX,AL



WAIT1: MOV AH,1                   ;判断是否有按键按下

       INT 16H

       JZ  WAIT1                  ;无按键则跳回继续等待,有则退出



QUIT:  CLI



       MOV AX,0000H               ;恢复INTR原中断矢量

       MOV ES,AX

       MOV DI,INTR_IVADD 

       MOV AX,IP_BAK              ;恢复INTR原中断处理程序入口偏移地址

       MOV ES:[DI],AX

       ADD DI,2

       MOV AX,CS_BAK              ;恢复INTR原中断处理程序入口段地址

       MOV ES:[DI],AX



       MOV AL,IM_BAK              ;恢复INTR原中断屏蔽寄存器的屏蔽字

       OUT 21H,AL

       STI



       MOV AX,4C00H               ;返回到DOS

       INT 21H



MYISR PROC NEAR                   ;中断处理程序MYISR

       PUSH AX

       MOV AL,35H

       MOV AH,0EH

       INT 10H

       MOV AL,20H

       INT 10H



       MOV DX,MY8254_COUNT0       ;重装计数初值

       MOV AL,4

       OUT DX,AL



OVER:  MOV AL,20H                 ;向PC机内部8259发送中断结束命令

       OUT 20H,AL

       POP AX

       IRET

      

MYISR ENDP

      

CODE ENDS

     END START

 

 

      

2. 定时应用实验 编写程序,将8254的计数器2设置为方式3,用信号源1.8432MHz作为CLK1 时钟,计数初值为 100,相对于 CLK1 进行 100 分频。在 OUT1 输出频率为 18.432MHz 的时钟。将 OUT1 连接到计数器 0 CLK0,设置计数器 0 工作在方 3,计数初值为 18432,相当是进行 18432 分频。则在 OUT0 得到 1Hz 的输出。

 1 实验接线图如图 3-3-4 所示,按图连接实验线路图。

2 根据实验内容,编写实验程序,编译、链接。

3 运行实验程序,8254 OUT1 会输出 1s 的方波,用示波器观察 OUT0 输出的波形。

 

3-3-4  8254 定时应用实验接线图

 

;T8254-2.asm

;8254定时应用实验  输出1Hz



;查看端口资源分配情况,记录实验系统I/O端口始地址



;****************根据查看端口资源修改下列符号值*******************

IOY0           EQU   0C000H         ;片选IOY0对应的端口始地址

;*****************************************************************

MY8254_COUNT0  EQU   IOY0+00H*2   ;8254计数器0端口地址

MY8254_COUNT1  EQU   IOY0+01H*2   ;8254计数器1端口地址

MY8254_COUNT2  EQU   IOY0+02H*2   ;8254计数器2端口地址

MY8254_MODE    EQU   IOY0+03H*2   ;8254控制寄存器端口地址

                              

STACK1 SEGMENT STACK

        DW 256 DUP(?)

STACK1 ENDS



CODE SEGMENT

        ASSUME CS:CODE



START: MOV DX,MY8254_MODE         ;初始化8254工作方式

       MOV AL,76H                 ;计数器1,方式3

       OUT DX,AL

               

       MOV DX,MY8254_COUNT1       ;装入计数初值

       MOV AL,64H                 ;100分频

       OUT DX,AL

       MOV AL,00H

       OUT DX,AL



       MOV DX,MY8254_MODE         ;初始化8254工作方式

       MOV AL,36H                 ;计数器0,方式3

       OUT DX,AL

               

       MOV DX,MY8254_COUNT0       ;装入计数初值

       MOV AL,00H                 ;18432分频

       OUT DX,AL

       MOV AL,48H

       OUT DX,AL

      

QUIT:  MOV AX,4C00H               ;结束程序退出

       INT 21H

      

CODE ENDS

     END START

 

四、心得体会:

 

 计数应用实验  很多TD-PITD实验装置都存在问题  代码都是完全正确的  但是就是无法实现  当按动‘KK1+5次后,产生一次计数中断,并在屏幕上显示一个字符‘5    只有开关电源的时候 屏幕上才会出现很多个5   而且个数不一定 都说随机的   后来来了个女老师 解释了一下 8254 芯片的缘故 老化了  当按了5 屏幕上还不能及时出现5 这个数字 会有延迟 延迟时间也说不定 只有开关机后才可能看到

 

定时应用实验 因为实验室没有示波器  我们只能连接 开关及LED显示单元 如果D0灯能够正常闪烁  就说明实验成功  一闪一灭表示 高低电平

 

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在ClassWizard中响应ID为~Dlg中的WM_TIMER消息。 使用SetTimer(nIDEvent,time,NULL)来建立一个定时器,关闭定时器用KillTimer(nIDEvent)函数。 然后可以响应ON_WM_TIMER消息来响应一个定时器完成一次记时后的程序。 响应方式如下: void CTimeDlg::OnTimer(UINT nIDEvent) { if(nIDEvent==1000)//间隔为5秒 { //处理事件 } elseif(nIDEvent==1001)//间隔为10秒 { //处理事件 } CDialog::OnTimer(nIDEvent); } 以下是给出一个串口通信定时检查接收数据的部分代码 void CMyDlg::OnOpenCom() { // TODO: Add your control notification handler code here if( f_open_com==true ) { f_open_com = false; GetDlgItem(IDC_OPEN_COM)->SetWindowText("打开通信端口"); CloseHandle(hComm); KillTimer(1000); /// 关闭定时器 return ; } SetTimer(1000, 1000, NULL); ///nIDEvent==1000,time=5000ms const char *ComNo; DCB dcb; string temp("COM1"); ComNo = temp.c_str(); hComm = CreateFile( ComNo , GENERIC_READ|GENERIC_WRITE , 0 , NULL , OPEN_EXISTING , 0 , 0); if( hComm==INVALID_HANDLE_VALUE ) /// 如果端口未打开 { MessageBox("打开通信端口出错!" , "Comm Error" , MB_OK); return ; } /// 将dcb地址传入,以取得通信参数 GetCommState(hComm,&dcb); /// 得知目前通信状态 dcb.BaudRate = CBR_9600; dcb.ByteSize = 8; /// 字节为8 dcb.Parity = NOPARITY; /// Parity为None dcb.StopBits = ONESTOPBIT; /// 1个停止位 if( !SetCommState( hComm , &dcb)){ MessageBox("通信端口设置出错!" , "Set Error" , MB_OK ); CloseHandle(hComm); return; } GetDlgItem(IDC_OPEN_COM)->SetWindowText("关闭通信端口"); f_open_com = true; } void CMyDlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default char inbuff[1024]; DWORD nBytesRead , dwError; COMSTAT cs; /// 取得状态 ClearCommError( hComm , &dwError , &cs); /// 数据是否大于所准备的缓冲区 if( cs.cbInQue > sizeof(inbuff) ) { PurgeComm(hComm , PURGE_RXCLEAR ); /// 清除通信端口数据 return ; } ReadFile(hComm , inbuff , cs.cbInQue , &nBytesRead , NULL ); //接收通信端口的数据 inbuff[cs.cbInQue] = '\0'; MessageBox("打开通信端口出错!" , "Comm Error" , MB_OK); m_Receive.Format("%s",inbuff); UpdateData(false); CDialog::OnTimer(nIDEvent); } 李杨: for(int i=0; ;i++ ) { ... Sleep(5); if(i>...) {AfxMessageBox("错误XXX"); return;} }//跳出后记得停止一些机器动作

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值