串行口方式0扩展并行输出口实验

#include <reg52.h> // 包含51系列单片机的特殊功能寄存器的定义

// 定义LED灯的接口

sbit LED = P1^0;

// 定义74LS164的输入/输出端口

sbit D0 = P2^0;

sbit D1 = P2^1;

sbit D2 = P2^2;

sbit D3 = P2^3;

sbit D4 = P2^4;

sbit D5 = P2^5;

sbit D6 = P2^6;

sbit D7 = P2^7;

// 定义定时器中断服务程序

void Timer0_ISR() interrupt 1 {

    // 清除定时器中断标志位

    TF0 = 0;

    // 重载定时器初值

    TH0 = 0xFF; // 高8位装入0xFF,表示定时器计数的最大值

    TL0 = 0xFF; // 低8位装入0xFF,表示定时器计数的最大值

    // 控制LED灯的亮灭

    if (i % 2 == 0) { // 向上流水灯操作

        D7 = 1 << (i / 2); // 将数据写入到数据输出寄存器中,输出到外部设备

    } else { // 向下流水灯操作或跑马灯闪烁(齐亮齐灭)操作

        D7 = ~(1 << (i / 2)); // 将数据写入到数据输出寄存器中,输出到外部设备,取反操作即可实现灭灯效果

    }

}

void delay(unsigned int time) { // 延时函数,使用定时器中断实现精确延时

    unsigned int i, j;

    for (i = 0; i < time; i++) {

        for (j = 0; j < 1275; j++); // 根据晶振频率和需要延时的时间计算出需要计数的次数,这里假设晶振频率为11.0592MHz,需要精确延时1ms

    }

}

void main() {

    unsigned char i; // 定义循环变量

    // 设置定时器0工作模式为16位自动重载模式,并启用定时器中断

    TMOD = 0x01; // 设置定时器模式,这里使用模式0(16位自动重载模式)

    ET0 = 1; // 开启定时器0中断允许位

    EA = 1; // 开启总中断允许位

    TR0 = 1; // 启动定时器0

    // 循环控制LED灯的亮灭效果,向上流水灯、向下流水灯和跑马灯闪烁交替进行

    while (1) {

        for (i = 0; i < 8; i++) { // 向上流水灯操作

            D0 = 0; // 将数据写入到数据输出寄存器中,输出到外部设备

            D1 = 0;

            D2 = 0;

            D3 = 0;

            D4 = 0;

            D5 = 0;

            D6 = 0;

            D7 = 1 << i; // 将数据写入到数据输出寄存器中,输出到外部设备

            delay(1000); // 延时一段时间,假设LED灯亮的时间为1秒,需要使用定时器中断实现精确延时,而不是简单的循环延时

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值