找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11841|回复: 6
收起左侧

51单片机时钟,12mhz晶振,怎样才能达到一秒精确定时,求解,非常感谢

[复制链接]
ID:409340 发表于 2018-10-14 10:44 | 显示全部楼层 |阅读模式
各位大佬,如题
回复

使用道具 举报

ID:137736 发表于 2018-10-14 17:56 | 显示全部楼层
51单片机用12M晶体,1个周期1微秒。用time0定时器自装入模式,定时100微秒,设置一个16位定时器标志,每次加1,加够10000次归零。你主程序检查这个标志就行了。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:387733 发表于 2018-10-14 19:17 | 显示全部楼层
采用定时器中断,定时50mS,然后用计数单元计数20次中断,正好1秒,误差为零
360截图17290430276438.png

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:213173 发表于 2018-10-14 20:08 | 显示全部楼层
运用定时器模式2 八位自动重装可以达到一秒精确定时。
#include "REG52.H"
sbit LED = P1^0;
sbit key = P1^1;
unsigned int i=0;  
bit sign=0;
void Timer0Init()                //250微秒@12.000MHz
{
        TMOD= 0x02;                //设置定时器0模式2
        TL0 = 0x06;                //设置定时初值
        TH0 = 0x06;                //设置定时重载值
        TR0 = 1;                //定时器0开始计时
        EA= 1;
        ET0=1;
}
void delayms(unsigned int k)
{
        unsigned int i,j;
        for(i=k;i>0;i--)
                for(j=120;j>0;j--);
}
void main()
{
        Timer0Init();       
        while(1)
        {
                if((key==0)&&(sign==0))
                {
                        delayms(10);
                        if(!key)
                        {
                                sign=1;       
                                while(!key);
                        }
                }       
        }
}
void InterruptTimer0() interrupt 1
{
        if(sign==1)
        {
                i++;
                LED=0;
                if(i>=4000)//1秒
                {
                        i=0;  
                        LED=1;
                        sign=0;
                }
        }
}

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:74187 发表于 2018-10-14 20:19 | 显示全部楼层
  1. /********************************************************
  2. *描述:定时器0点亮一个LED
  3. ********************************************************/
  4. #include "reg51.h"
  5. #include "intrins.h" //包含左移和右移指令
  6. #include "string.h"         //字符串
  7. #include "stdio.h"         //标准输入输出



  8. /*******************************************************************************
  9. * 文件名:位定义
  10. * 描  述:
  11. * 功  能:
  12. * 作  者:大核桃
  13. * 版本号:1.0.1(2017.05.23)
  14. *******************************************************************************/

  15. bit flag1s = 0;//1s翻转一次

  16. typedef unsigned char uint8;//0-255
  17. typedef unsigned int  uint16;//0-65535
  18. typedef unsigned long uint32;//0-65535*65535

  19. /*******************************************************************************
  20. * 文件名:函数前置声明
  21. * 描  述:
  22. * 功  能:
  23. * 作  者:大核桃
  24. * 版本号:1.0.1(2017.05.23)
  25. *******************************************************************************/

  26. void Bsp_Power_Init(void);
  27. void Timer0Init(void);                //1毫秒@11.0592MHz


  28. /*******************************************************************************
  29. * 文件名:主循环入口
  30. * 描  述:
  31. * 功  能:
  32. * 作  者:大核桃
  33. * 版本号:1.0.1(2017.05.23)
  34. *******************************************************************************/
  35. void main(void)
  36. {
  37.         uint8 i = 0;

  38.         Timer0Init();    //定时器0初始化函数

  39.         while(1)
  40.         {
  41.                 if(flag1s)
  42.                 {
  43.                    P2 = 0XFE;//点亮最低位的小灯               
  44.                 }
  45.                 else
  46.                 {
  47.                    P2 = 0XFF;//灭掉最低位的小灯               
  48.                 }
  49.         }
  50. }

  51. /*******************************************************************************
  52. * 文件名:void Timer0Init(void)
  53. * 描  述: 定时器0配置
  54. * 功  能:编程模块化
  55. * 作  者:大核桃
  56. * 版本号:1.0.1(2017.05.23)
  57. *******************************************************************************/
  58. void Timer0Init(void)                //1毫秒@11.0592MHz
  59. {
  60.         TMOD &= 0xF0;                //设置定时器模式 1111_
  61.         TMOD |= 0X01;       //16位模式,不可重装

  62.         TL0 = (65535 - 921) % 256;                    //设置定时初值
  63.         TH0 = (65535 - 921) / 256;                     //设置定时初值

  64.         ET0 = 1;            //打开定时器0中断使能
  65.         TR0 = 1;                    //定时器0开始计时
  66.         EA = 1;             //打开总中断使能
  67. }


  68. void Timer0_inter(void) interrupt 1
  69. {
  70.         static uint16 tmr1s = 0;

  71.     //自动重载,初值可以不需要写
  72.         TL0 = (65535 - 921) % 256;                    //设置定时初值
  73.         TH0 = (65535 - 921) / 256;                     //设置定时初值

  74.         tmr1s++;

  75.         if(tmr1s >= 1000)
  76.         {
  77.                 tmr1s = 0;

  78.                 flag1s = !flag1s;//1s标志位翻转一次
  79.         }
  80.                        
  81. }

复制代码

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:123289 发表于 2018-10-14 20:22 | 显示全部楼层
你需要补补定时器部分的课。
回复

使用道具 举报

ID:111634 发表于 2018-10-14 21:11 | 显示全部楼层
若只需一次1秒定时,可用上述方法。若需多次不间断1秒定时,则须采用定时器方式2自动装填定时初值,置250us定时,然后在定时中断中计次4000,得到1s定时。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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