“小菜” 2023-05-28 23:17 采纳率: 0%
浏览 104
已结题

求51单片机8位数码管计时器程序

img


按下按键1复位,按下按键2开始 ,51单片机8位数码管计时器 ,程序简便一些

  • 写回答

4条回答 默认 最新

  • 瞬间动力 2023-05-28 23:24
    关注

    花了一个小时写的,希望对你有用!

    
    #include <reg52.h>
    #include <intrins.h>
    
    #define uchar unsigned char
    #define uint unsigned int
    
    sbit D1 = P2^0;  // 数码管引脚定义
    sbit D2 = P2^1;
    sbit D3 = P2^2;
    sbit D4 = P2^3;
    sbit D5 = P2^4;
    sbit D6 = P2^5;
    sbit D7 = P2^6;
    sbit D8 = P2^7;
    
    sbit Key1 = P1^0;  // 按键引脚定义
    sbit Key2 = P1^1;
    
    uint ms;    // 毫秒计数器
    uint sec;   // 秒计数器
    uchar min;  // 分钟计数器
    uchar hour; // 小时计数器
    
    void delay(uint i) { // 短暂延时函数
        while(i--);
    }
    
    void DAC(uint n) { // 将数值DAC输出
        D1 = (n & 0x01);
        D2 = (n & 0x02) >> 1;
        D3 = (n & 0x04) >> 2;
        D4 = (n & 0x08) >> 3;
        D5 = (n & 0x10) >> 4;
        D6 = (n & 0x20) >> 5;
        D7 = (n & 0x40) >> 6;
        D8 = (n & 0x80) >> 7;
    }
    
    void display() { // 显示计时器数值
        DAC(hour / 10); // 输出小时的十位
        delay(50); // 短暂延时
        DAC(hour % 10); // 输出小时的个位
        delay(50);
        DAC(min / 10); // 输出分钟的十位
        delay(50);
        DAC(min % 10); // 输出分钟的个位
        delay(50);
        DAC(sec / 10); // 输出秒的十位
        delay(50);
        DAC(sec % 10); // 输出秒的个位
        delay(50);
    }
    
    void initTimer() { // 初始化定时器
        TMOD |= 0x01; // 设置定时器0为16位模式,使用定时器0的模式1
        TH0 = 0xFC; // 计时1ms,从0xFC开始(65536-1000)计时
        TL0 = 0x18;
        ET0 = 1; // 允许定时器0中断
        TR0 = 1; // 启动定时器0
        EA = 1; // 打开总中断开关
    }
    
    void main() {
        initTimer(); // 初始化定时器
        while(1) {
            if (Key1 == 0) { // 如果按下了按键1,复位计时器
                ms = sec = min = hour = 0;
                display(); // 显示0
            }
            if (Key2 == 0) { // 如果按下了按键2,开始计时器
                while(1) {
                    display(); // 显示计时器数值
                    if (ms >= 1000) {
                        ms = 0;
                        sec++;
                        if (sec >= 60) {
                            sec = 0;
                            min++;
                            if (min >= 60) {
                                min = 0;
                                hour++;
                                if (hour >= 24) {
                                    hour = 0;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    
    void timer0() interrupt 1 { // 定时器0中断
        TH0 = 0xFC;
        TL0 = 0x18;
        ms++; // 每次中断毫秒计数器加1
    }
    
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月30日
  • 创建了问题 5月28日

悬赏问题

  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题
  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体