神说要有光★ 2021-05-27 16:05 采纳率: 0%
浏览 21

需要源程序 单片机protues

定时中断控制流水灯。 采用定时中断方法控制LED灯循环显示,fosc约为12MHz,闪烁速率约为2秒/次:亮灯顺序为D0→D1→D2→…→D6→D7→学号,即8只发光二极管依次点亮,之后8只发光二极管显示0119的二进制数, 其中D7D6显示01,D5D4D3D2D1D0显示最后19。

  • 写回答

1条回答 默认 最新

  • 轩Scott 人工智能领域新星创作者 2023-05-10 19:22
    关注

    以下是基于51单片机的代码,使用Keil C编译器,同时在Proteus中进行仿真。

    #include <reg51.h>
    
    #define FOSC 12000000L
    #define TIMER0_RELOAD_VALUE 65536L - (FOSC / 12 / 50)
    
    sbit LED = P1^0; // LED连接到P1.0
    sbit D0 = P2^0; // D0连接到P2.0
    sbit D1 = P2^1; // D1连接到P2.1
    sbit D2 = P2^2; // D2连接到P2.2
    sbit D3 = P2^3; // D3连接到P2.3
    sbit D4 = P2^4; // D4连接到P2.4
    sbit D5 = P2^5; // D5连接到P2.5
    sbit D6 = P2^6; // D6连接到P2.6
    sbit D7 = P2^7; // D7连接到P2.7
    
    unsigned char LED_state = 0; // LED状态
    unsigned char LED_count = 0; // LED计数器
    unsigned char LED_direction = 1; // LED方向
    
    void timer0_init() {
        TMOD &= 0xF0; // 清除T0的控制位
        TMOD |= 0x01; // 设置T0为模式1
        TH0 = TIMER0_RELOAD_VALUE / 256; // 设置T0的重载值
        TL0 = TIMER0_RELOAD_VALUE % 256;
        ET0 = 1; // 允许T0中断
        TR0 = 1; // 启动T0
        EA = 1; // 允许中断
    }
    
    void timer0_isr() interrupt 1 {
        TH0 = TIMER0_RELOAD_VALUE / 256; // 重新设置T0的重载值
        TL0 = TIMER0_RELOAD_VALUE % 256;
        LED_count++; // LED计数器加1
        if (LED_count >= 25) { // 如果计数器达到25,即0.5秒
            LED_count = 0; // 重置计数器
            if (LED_direction == 1) { // 如果LED方向为正向
                LED_state <<= 1; // LED状态左移1位
                if (LED_state == 0) { // 如果LED状态为0
                    LED_state = 1; // 设置LED状态为1
                }
                if (LED_state == 0x80) { // 如果LED状态为0x80
                    LED_direction = 0; // 设置LED方向为反向
                }
            } else { // 如果LED方向为反向
                LED_state >>= 1; // LED状态右移1位
                if (LED_state == 0) { // 如果LED状态为0
                    LED_state = 0x80; // 设置LED状态为0x80
                }
                if (LED_state == 1) { // 如果LED状态为1
                    LED_direction = 1; // 设置LED方向为正向
                }
            }
            LED = LED_state & 0x01; // 更新LED状态
            D0 = (LED_state >> 1) & 0x01; // 更新D0状态
            D1 = (LED_state >> 2) & 0x01; // 更新D1状态
            D2 = (LED_state >> 3) & 0x01; // 更新D2状态
            D3 = (LED_state >> 4) & 0x01; // 更新D3状态
            D4 = (LED_state >> 5) & 0x01; // 更新D4状态
            D5 = (LED_state >> 6) & 0x01; // 更新D5状态
            D6 = (LED_state >> 7) & 0x01; // 更新D6状态
            D7 = 0; // 设置D7状态为0
        }
    }
    
    void main() {
        timer0_init(); // 初始化定时器0
        while (1) {
            D7 = 0; // 设置D7状态为0
        }
    }
    

    在Proteus中,需要添加一个8051微控制器和8个LED灯,以及连接线路。将编译后的HEX文件加载到8051微控制器中,然后启动仿真即可看到LED灯的循环显示和0119的二进制数的显示。

    评论

报告相同问题?

悬赏问题

  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?