找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
查看: 637|回复: 6
收起左侧

没学过该怎么在1602里面加定时器

[复制链接]
ID:1147078 发表于 2025-4-8 23:03 | 显示全部楼层 |阅读模式
新作业用定时器定时,做一个电子时钟,时间从23:59:56开始计时,并在lcd1602上显示,显示要求:第一行显示:Time:第二行显示:23:59:56
不懂就问,是不是就是加一个定时器0?
#include <reg51.h>
sbit e=P2^7;
sbit rs=P2^6;
sbit rw=P2^5;
void delayms(int ms)
{int i,j;

for (j=0;j<ms;j++)
  for(i=0;i<333;i++);
}

bit checkbusy()
{bit stat;
rs=0;
rw=1;
e=0;
delayms(1);
e=1;
delayms(1);
stat=P0&0x80;
e=0;
delayms(1);
return stat;
}
void lcdcom(char com)
{while (checkbusy());
rs=0;
rw=0;
e=0;
delayms(1);
P0=com;
e=1;delayms(1);
e=0;delayms(1);
}
void lcddat(char dat)
{while (checkbusy());
rs=1;//写数据
rw=0;
e=0;
delayms(1);
P0=dat;
e=1;delayms(1);
e=0;delayms(1);
}

void main()
{ lcdcom(0x01);
  lcdcom(0x06);
  lcdcom(0x0e);
  lcdcom(0x38);

  lcdcom(0x80);
  lcddat('T');
  lcddat('I');
  lcddat('M');
  lcddat('E');

  lcdcom(0xC3);
  lcddat('3');
  lcddat('6');

  while(1);
}这是我现在写的代码,满足了条件1

回复

举报

ID:69038 发表于 2025-4-9 14:32 | 显示全部楼层
是的,你要开一个计数定时器,用于计时。
从23:59:56开始,每秒减1个秒计数。。直到时分秒均为0停止。
回复

举报

ID:1146851 发表于 2025-4-9 15:31 | 显示全部楼层
用的是单片机8051?可以用定时器间隔例如每 50ms 触发一次中断,每 20 次中断(即 1 秒)更新一次时间来进行日,时,分,秒的转换
回复

举报

ID:462827 发表于 2025-4-9 22:57 | 显示全部楼层
是的,开个定时中断来走时分秒,然后在主函数的while(1)循环里更新显示时间即可
回复

举报

ID:1147078 发表于 2025-4-10 18:21 | 显示全部楼层
已解决
谢谢大家
回复

举报

ID:584814 发表于 2025-4-12 20:00 | 显示全部楼层
通常所指的1602是显示用的,里面加不了定时器。
问的没头没尾,解决后也不传结果供参考,好像不是要讨论而是来免费进货的
回复

举报

ID:1147078 发表于 2025-4-15 09:11 | 显示全部楼层
man1234567 发表于 2025-4-12 20:00
通常所指的1602是显示用的,里面加不了定时器。
问的没头没尾,解决后也不传结果供参考,好像不是要讨论而 ...

没有吧,在里面程序里加了个定时器就好了。也没有免费进货啊,不然我一点代码都不打直接问得了。#include <REGX51.H>
#include "1602.h"

struct Time {
    char hour;
    char minute;
    char second;
};

struct Time currentTime = {23, 59, 56};  // 初始时间将在 main() 里设置
int Count = 0;

void Timer0_Init() {
    TMOD &= 0xF0; // 设置定时器0模式1
    TMOD |= 0x01;
    TH0 = 0xFC;
    TL0 = 0x18;
    ET0 = 1; // 允许定时器0中断
    EA = 1;  // 开总中断
    TR0 = 1; // 启动定时器0
}

void UpdateTimeDisplay() {
    char timeStr[9];
   
    // 格式化时间字符串
    timeStr[0] = currentTime.hour / 10 + '0';
    timeStr[1] = currentTime.hour % 10 + '0';
    timeStr[2] = ':';
    timeStr[3] = currentTime.minute / 10 + '0';
    timeStr[4] = currentTime.minute % 10 + '0';
    timeStr[5] = ':';
    timeStr[6] = currentTime.second / 10 + '0';
    timeStr[7] = currentTime.second % 10 + '0';
    timeStr[8] = '\0';
   
    LCD_ShowString(2, 1, timeStr);
}

void Timer0_ISR() interrupt 1 {
    TH0 = 0xFC; // 重新加载初值
    TL0 = 0x18;
   
    Count++;
    if (Count >= 1000) { // 1秒到
        Count = 0;
        currentTime.second++;
        
        // 处理秒进位
        if (currentTime.second >= 60) {
            currentTime.second = 0;
            currentTime.minute++;
            
            // 处理分钟进位
            if (currentTime.minute >= 60) {
                currentTime.minute = 0;
                currentTime.hour++;
               
                // 处理小时进位
                if (currentTime.hour >= 24) {
                    currentTime.hour = 0;
                }
            }
        }
        
        UpdateTimeDisplay(); // 更新显示
    }
}

void main()
{
        LCD_Init();
        LCD_ShowString(1,1,"TIME:");

        Timer0_Init();


        UpdateTimeDisplay();


        while(1)
        {

        }
}
回复

举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表