找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 352|回复: 7
打印 上一主题 下一主题
收起左侧

为什么单片机定时器和程序出来的不一样?

[复制链接]
跳转到指定楼层
楼主
void T0_init (void)
{
                AUXR |= 0x80;                //定时器时钟1T模式
        TMOD &= 0xF0;                //设置定时器模式
        TH0=(65536-1000)/256;        //16位计数寄存器T0高8位, 12MHZ时1000微秒
        TL0=(65536-1000)%256;        //16位计数寄存器T0低8位,
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;      //启动定时器
   ET0 = 1;    //使能定时器中断

}
void TM0_Isr() interrupt 1
{
        TH0=(65536-1000)/256;        //16位计数寄存器T0高8位, 12MHZ时1000微秒
        TL0=(65536-1000)%256;        //16位计数寄存器T0低8位,
                k++;                        //k自加1
        if(k>=1000)                //1秒后计
                {
                        kk++;                        
k=0;
               
                }        
                                if(kk>=10)               
                {
                        kk=0;               

                }        
                                        LED[0]=kk%10;  //显
                                        LED[1]=kk/10%10;                        
                                        LED[2]=kk/100%10;
                                        LED[3]=kk/1000;                                       
               
}


烧录程序后数字跑得飞快,而不是1秒1次。为什么?单片机STC8G1K08

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:624769 发表于 2024-3-16 22:42 | 只看该作者
        TH0=(65536-12000)/256;        //16位计数寄存器T0高8位, 12MHZ时1000微秒
        TL0=(65536-12000)%256;        //16位计数寄存器T0低8位,
回复

使用道具 举报

板凳
ID:198189 发表于 2024-3-16 23:17 | 只看该作者
188610329 发表于 2024-3-16 22:42
TH0=(65536-12000)/256;        //16位计数寄存器T0高8位, 12MHZ时1000微秒
        TL0=(65536- ...

请教,改成12000的依据是什么算法?
回复

使用道具 举报

地板
ID:97023 发表于 2024-3-17 00:17 | 只看该作者
        TH0=(65536-1000)/256;        //16位计数寄存器T0高8位, 12MHZ时1000微秒
        TL0=(65536-1000)%256;        //16位计数寄存器T0低8位,
你这是12T模式下的初值,晶振频率被除以12,变成了1M,这就是定时器计数的脉冲频率,周期是1us;
既然单片机工作在1T模式,晶振频率没有被除以12,所以定时器计数的脉冲频率还是12M,周期就是1/12us。
因此初值就应该是:
        TH0=(65536-12000)/256;        //16位计数寄存器T0高8位, 12MHZ时1000微秒
        TL0=(65536-12000)%256;        //16位计数寄存器T0低8位,

评分

参与人数 1黑币 +6 收起 理由
xia20 + 6

查看全部评分

回复

使用道具 举报

5#
ID:1110945 发表于 2024-3-17 00:22 | 只看该作者
定时器T0在12MHz-12T模式时最大时间是65mS,可以设置成50mS一次中断,
20次就是1秒,官方有那么好的工具你干嘛不用?



void Timer0_Isr(void) interrupt 1
{
}

void Timer0_Init(void)        //50毫秒@12.000MHz
{
    AUXR &= 0x7F;            //定时器时钟12T模式
    TMOD &= 0xF0;            //设置定时器模式
    TL0 = 0xB0;                //设置定时初始值
    TH0 = 0x3C;                //设置定时初始值
    TF0 = 0;                //清除TF0标志
    TR0 = 1;                //定时器0开始计时
    ET0 = 1;                //使能定时器0中断
}


评分

参与人数 1黑币 +6 收起 理由
xia20 + 6 很给力!

查看全部评分

回复

使用道具 举报

6#
ID:213173 发表于 2024-3-17 07:34 | 只看该作者
void T0_init (void)
{
        AUXR |= 0x80;                //定时器时钟1T模式
        TMOD &= 0xF0;                //设置定时器自动重装模式
        TH0=(65536-12000)/256;        //16位计数寄存器T0高8位, 12MHZ时1000微秒
        TL0=(65536-12000)%256;        //16位计数寄存器T0低8位,
        TF0 = 0;                     //清除TF0标志
        TR0 = 1;                     //启动定时器
        ET0 = 1;                     //使能定时器中断
}

void TM0_Isr() interrupt 1
{//自动重装模式不需要加载
//        TH0=(65536-1000)/256;        //16位计数寄存器T0高8位, 12MHZ时1000微秒
//        TL0=(65536-1000)%256;        //16位计数寄存器T0低8位,
        k++;                        //k自加1
        if(k>=1000)                //1秒后计
        {
                kk++;
                k=0;
        }
        if(kk>=1000)
        {
                kk=0;
        }
        LED[0]=kk%10;  //显
        LED[1]=kk/10%10;
        LED[2]=kk/100%10;
        LED[3]=kk/1000;
}

评分

参与人数 1黑币 +6 收起 理由
xia20 + 6 赞一个!

查看全部评分

回复

使用道具 举报

7#
ID:198189 发表于 2024-3-18 03:11 | 只看该作者
明日之星8 发表于 2024-3-17 00:22
定时器T0在12MHz-12T模式时最大时间是65mS,可以设置成50mS一次中断,
20次就是1秒,官方有那么好的工具你 ...

谢谢提醒
回复

使用道具 举报

8#
ID:402383 发表于 2024-3-26 01:00 来自手机 | 只看该作者
下载程序时可以选IRC晶振频率,如果没有外部晶振就需要设置IRC频率
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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