GMbyz 2023-04-13 00:30 采纳率: 71.4%
浏览 19
已结题

微机原理与接口技术的问题

已知8253各端口地址分别为200H、201H、202H和203H,CLK0接有1MHz的时钟,OUT0接通道1时钟输入CLK1,现有OUT1输出一个高电平为200ms、低电平为1ms的连续信号,编写初始化程序。
求一个有解释的初始化程序每一步怎么来的,学不明白这块儿

  • 写回答

1条回答 默认 最新

  • 星浩前进中 2023-04-13 00:52
    关注

    在编写8253定时器的初始化程序时,需要考虑以下几个步骤:

    步骤1:设置定时器模式
    步骤2:设置计数器初值
    步骤3:启动定时器

    步骤1:设置定时器模式

    定时器模式是指8253的三个计数器如何工作。8253有6种模式,每个模式下,计数器的工作方式都不同。在本例中,我们需要使用模式3来产生一个方波输出。模式3是工作在方波发生器模式下的计数器,当计数器计数到0时,会将输出状态取反。因此,我们需要将计数器初始化为一个非零值,以使计数器在计数到0之前保持输出为高电平状态。

    8253的控制字寄存器是一个8位寄存器,其中包含了定时器模式、计数器选择和读/写等信息。我们需要将控制字写入端口200h以设置定时器模式。

    进行举例,在本例中,我们需要使用控制字

    
    00110110b
    
    控制字的各位含义如下
    
    bit 7-6: 00 (选择计数器0)
    bit 5-4: 11 (选择模式3)
    bit 3  : 0  (不启用BCD计数)
    bit 2-0: 110 (写入计数器初值的方式为先低位后高位)
    

    我们可以将控制字写入端口200h,代码如下:

    
    mov al, 00110110b
    out 200h, al
    
    

    步骤2:设置计数器初值

    计数器初值是指计数器需要计数的值,也就是在计数器计数到0之前需要计数的次数。在本例中,我们需要产生一个高电平为200ms、低电平为1ms的方波。因此,我们需要计算出计数器需要计数的次数。

    计数器的计数频率由时钟输入频率决定。在本例中,时钟输入频率为1MHz,也就是计数器每秒钟需要计数1000000次。因此,我们可以先计算出需要产生多长的方波周期,再计算出计数器需要计数的次数。

    一个完整的方波周期为:

    200ms + 1ms = 201ms
    

    因此,每秒钟需要产生的方波周期数为:

    1s / 201ms = 4.975s^-1
    

    每个方波周期需要计数的次数为:

    
    1000000 / 4.975 = 200803
    

    因为计数器是16位的,所以我们需要将计数器初值设置为:

    65536 - 200803 = 45333
    

    然后,我们可以将计数器初值写入端口202H,代码如下

    mov ax, 45333
    out 202h, al      ; 先写入低位
    mov al, ah
    out 202h, al      ; 再写入高位
    

    步骤3:启动定时器

    在完成了定时器模式和计数器初值的设置后,我们需要启动计数器,使其开始计数。我们可以使用控制字的bit 4来控制计数器的启动。

    我们需要将控制字的bit 4设置为1,以启动计数器。因此,我们可以先将控制字读出来,再将bit 4设置为1,最后将修改后的控制字写回端口200h,代码如下:

    
    in al, 200h        ; 读取控制字
    or al, 00010000b   ; 启动计数器
    out 200h, al       ; 写回控制字
    

    到这里,我们已经完成了8253定时器的初始化程序。将以上三个步骤的代码整合起来,我们得到的完整的初始化程序如下:

    
    ; 8253定时器初始化程序
    
    mov al, 00110110b   ; 设置定时器模式
    out 200h, al
    
    mov ax, 45333       ; 设置计数器初值
    out 202h, al        ; 先写入低位
    mov al, ah
    out 202h, al        ; 再写入高位
    
    in al, 200h         ; 读取控制字并启动计数器
    or al, 00010000b
    out 200h, al
    

    这个程序可以在8086或类似的x86处理器上运行,通过向8253的端口写入指定的数据,设置8253定时器的模式和计数器初值,然后启动计数器,使其按照指定的频率进行计数和输出。

    希望对你能有所帮助

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 4月21日
  • 已采纳回答 4月13日
  • 创建了问题 4月13日

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度