KDLKlgs 2022-02-19 11:22 采纳率: 100%
浏览 164
已结题

51单片机,定时器T0与T1在TMOD=01模式1下,结果不一样为什么?

实现999999--0的倒数,用T0时可以用模式1;用T1却要用模式2;一个16位、一个8位自动重装,TH、TL的数值一致,为什么结果能一样??T1为什么不能用模式1?

当实现0--999999的正数,T0、T1都可以用模式1,倒数就不行了?为什么?

#include<reg52.h>

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

unsigned char code LedChar[] = {
    0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
    0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};
unsigned char LedBuff[6] = {
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
unsigned char flagls = 0;
unsigned int cnt = 0;
unsigned char i = 0;
    
void main()
{
    unsigned long sec = 999999;
    ENLED = 0;
    ADDR3 = 1;
    
    TMOD = 0x10;  //模式设置  
  //当使用T0时可用模式1 (TMOD=0x01)
    //但用T1时却不行,倒计时不准,
    //要用模式2 (TMOD=0x10)
    //为什么?T0、T1应该一样才对吗?
    
    //T0用模式116位;T1用模式28位自动重装;TH、TL数值一样,为什么结果一样?
    
    //T0、T1都用模式1可以实现正数00-999999,但倒数999999--0只有T0可以,T1要用模式2!为什么?
    
    TH1 = 0xFC;
    TL1 = 0x66;
    TR1 = 1;
    
    //打开中断
    EA = 1;
    ET1 = 1;
    
    while(1)
    {
        if(flagls == 1)
        {
            flagls = 0;
            sec--;
            LedBuff[0] = LedChar[sec%10];
            LedBuff[1] = LedChar[sec/10%10];
            LedBuff[2] = LedChar[sec/100%10];
            LedBuff[3] = LedChar[sec/1000%10];
            LedBuff[4] = LedChar[sec/10000%10];
      LedBuff[5] = LedChar[sec/100000%10];
      if(sec == 0)
            {
                sec = 1;
            }                
        }
    }
}

//中断函数,防闪烁
void InterruptTime1() interrupt 3  //T0时为1 T1时为3
{
    TH1 = 0xFC;
    TL1 = 0x66;
    cnt++;
    if(cnt >= 1000)
    {
        cnt = 0;
        flagls = 1;
    }
    P0 = 0xFF;
    
    switch(i)
        {
          case 0: ADDR2 = 0; ADDR1 = 0; ADDR0 = 0;
      i++; P0 = LedBuff[0]; break;

      case 1: ADDR2 = 0; ADDR1 = 0; ADDR0 = 1;
      i++; P0 = LedBuff[1]; break;

      case 2: ADDR2 = 0; ADDR1 = 1; ADDR0 = 0;
      i++; P0 = LedBuff[2]; break;

      case 3: ADDR2 = 0; ADDR1 = 1; ADDR0 = 1;
      i++; P0 = LedBuff[3]; break;

      case 4: ADDR2 = 1; ADDR1 = 0; ADDR0 = 0;
      i++; P0 = LedBuff[4]; break;

      case 5: ADDR2 = 1; ADDR1 = 0; ADDR0 = 1;
      i = 0; P0 = LedBuff[5]; break;            
      
            default : break;
        }
}
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果
  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 2月27日
    • 创建了问题 2月19日

    悬赏问题

    • ¥60 如何批量获取json的url
    • ¥15 对法兰连接元件所承受的表面载荷等效转化为法兰开孔接触面上的等效表面载荷?
    • ¥15 comsol仿真压阻传感器
    • ¥15 Python线性规划函数optimize.linprog求解为整数
    • ¥15 llama3中文版微调
    • ¥15 在win系统Django虚拟环境下载mysqlclient报错
    • ¥15 pg数据库导入数据序列重复
    • ¥15 三分类机器学习模型可视化分析
    • ¥15 本地测试网站127.0.0.1 已拒绝连接,如何解决?(标签-ubuntu)
    • ¥50 Qt在release捕获异常并跟踪堆栈(有Demo,跑一下环境再回答)