找回密码
 立即注册

QQ登录

只需一步,快速开始

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

菜鸟入门,跪求各位高手指教,程序注释中的两个问题,谢谢!

[复制链接]
跳转到指定楼层
楼主
/**********************************************************************************
* 【程序功能】: 数码管模拟数字时钟显示                                                                                                   
* 【使用说明】: 跳线帽短接数码管J6跳线
**********************************************************************************/

#include <reg52.h>
#define uchar unsigned char
sbit P2_0 = P2^0;
sbit P2_1 = P2^1;
sbit P2_2 = P2^2;
sbit P2_3 = P2^3;

static unsigned char second,minute,hour;
unsigned int tcount;
unsigned char m;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
                        0xf8,0x80,0x90};
void delay(uchar i)
{
  uchar j,k;
  for(j=i;j>0;j--)
    for(k=125;k>0;k--);
}

void display()
{

   P0=table[minute/10];
   P2_0 = 0;
   delay(5);                                                
   P2_0 = 1;

   P0=(table[minute%10]& 0x7f);               
   P2_1 = 0;
   delay(5);                                                
   P2_1 = 1;

   P0=table[second/10];
   P2_2 = 0;
   delay(5);                                                                                
   P2_2 = 1;

   P0=table[second%10];
   P2_3 = 0;
   delay(5);                                                                  
   P2_3 = 1;

}

/*演示主程序*/
void main(void)
{
    unsigned int  a;
        TMOD=0x02;                 //                        T0工作在模式2,8位自动重装计数器
    TH0=0x06;                  //这个定时器赋值0x06是依据什么呢?
    TL0=0x06;
    TR0=1;
    ET0=1;
    EA=1;

while(1)
{

   for(a=100;a>0;a--)
   {
     display();
   }

}
}


/*
********************************************************************************
** 函数名称 : t0(void) interrupt 1 using 0
** 函数功能 : 定时器中断
********************************************************************************
*/

void t0(void) interrupt 1 using 0
  {        tcount++;

    if(tcount==4000)                    //这个地方为什么要赋值4000????
          {tcount=0;
            second++;

                 if(second==60)
                  {second=0;
                   minute++;

                    if(minute==60)
                         {minute=0;
                          hour++;

                          if(hour==24)
                           {hour=0;
                           }
                         }
                  }
          }
        }



原理图.jpg (244.08 KB, 下载次数: 21)

原理图

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

使用道具 举报

沙发
ID:461428 发表于 2019-2-21 18:52 | 只看该作者
1.赋值0X60的根据是:八位计数器最多计数0-256.装入初值0X60,也就是96,让定时器从96计数到255溢出用时0.25毫秒。
2.定时器溢出4000次,4000*0.25为一秒时间。
我自己的理解。。不对的话 楼下补充,,谢谢
回复

使用道具 举报

板凳
ID:213173 发表于 2019-2-21 20:39 | 只看该作者
void main(void)
{
    unsigned int  a;
    TMOD=0x02;//T0工作在模式2,8位自动重装计数器
    TH0=0x06; //这个定时器赋值0x06是依据什么呢?
    TL0=0x06; //初值预装6,每12个时钟(1个机器周期1us)+1,加满8位寄存器并且
                                //溢出需要250个机器周期,就是定时250us
    TR0=1;               
    ET0=1;
    EA=1


void t0(void) interrupt 1 using 0
{
        tcount++;
    if(tcount==4000)//这个地方为什么要赋值4000????
        {                //==这不是赋值,是测试值4000,250us*4000不就是1秒吗?
                tcount=0;
                second++;
回复

使用道具 举报

地板
ID:432823 发表于 2019-2-21 21:16 | 只看该作者
从程序上看,定时器中断4000次为1秒,即定时器中断间隔时间少于1/4000秒(0.25MS),不知晶振为多少?可以定时器设置软件计算一下,就知道TH=0x06。
回复

使用道具 举报

5#
ID:158375 发表于 2019-2-22 08:51 | 只看该作者
51的资料,楼主需要好好研究一下。
时间是要计算的。
程序只是具体实现过程。
回复

使用道具 举报

6#
ID:474677 发表于 2019-2-22 08:56 | 只看该作者
我来总结一下,楼上的说得都对,楼下的继续补充……
回复

使用道具 举报

7#
ID:7485 发表于 2019-2-22 09:03 | 只看该作者
本帖最后由 ahshmj 于 2019-2-22 14:08 编辑
kissme 发表于 2019-2-21 18:52
1.赋值0X60的根据是:八位计数器最多计数0-256.装入初值0X60,也就是96,让定时器从96计数到255溢出用时0.2 ...

理解的完全正确!*************************
前面没有仔细看,又看看才发觉:应该是0x06,不是0x60。256-6=250;250us*4000=1s
回复

使用道具 举报

8#
ID:417440 发表于 2019-2-22 12:13 | 只看该作者
首先看的是TMOD=0x02,这是通过定时器模式寄存器将定时器设置成8位自动重载计数器。8位的计数器最高能计数256次。
接下来,就要有一个计数的容器,这个容器就是TL0,楼主程序里写的TL0=0x06,这个意思就是将TL0预先装了一个0x06的值,那么它就不用从0开始计数,而是从0x06开始计数,它只要再计250次就会满值溢出,溢出后会产生一个溢出中断,就是TF0,此时TF0就被置1,会向单片机发送中断请求。
在接下来就是TH0,TH0它在8位自动重载计数器里的作用就是用来装预置数的,每次TL0计数溢出后,单片机就会自动将TH0里的值赋值给TL0,让TL0重新工作计数。
tcount==4000就是在T0的定时中断里计4000次中断。
假如你的51单片机晶振频率是12M,那么你的机器周期就是12M/12=1微秒,你的定时器中断的时间就是250*1=250微秒=0.25毫秒。计4000次就是4000*0.25=1000毫秒=1秒。
然后回看你的程序中断里,每计4000次,second++;每计60次second,minute++;每计60次minute,hour++;计24次hour,则hour归零,重新计时。
回复

使用道具 举报

9#
ID:425029 发表于 2019-2-25 10:16 | 只看该作者
想请问一下,这个 for(a=100;a>0;a--)起什么作用呢,我在程序中将这行去掉之后,再烧到板上,没有发现差异,麻烦各位高手帮忙看看,谢谢!
回复

使用道具 举报

10#
ID:213173 发表于 2019-2-25 14:36 | 只看该作者
yuduan66 发表于 2019-2-25 10:16
想请问一下,这个 for(a=100;a>0;a--)起什么作用呢,我在程序中将这行去掉之后,再烧到板上,没有发现差异 ...

        for(a=100; a>0; a--)//小括号里第一个表达式为给变量赋初值,第二个为判断标准。若为真,则执行下面
                                   //花括号的指令,否则将跳过大括弧中的指令,第三句为更改变量值的指令。
        {                         //执行顺序1--2--{ }--3--2--{ }--3循环100次a不大于0了,不满足判断标准,跳出循环。
                                  //通常用for循环做延时。就像你在路边等人,原地打转渡步熬时间。
        }
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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