久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2469|回復: 9
收起左側

菜鳥入門,跪求各位高手指教,程序注釋中的兩個問題,謝謝!

[復制鏈接]
ID:425029 發表于 2019-2-21 16:18 | 顯示全部樓層 |閱讀模式
/**********************************************************************************
* 【程序功能】: 數碼管模擬數字時鐘顯示                                                                                                   
* 【使用說明】: 跳線帽短接數碼管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;
                           }
                         }
                  }
          }
        }



原理圖

原理圖
回復

使用道具 舉報

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。
回復

使用道具 舉報

ID:158375 發表于 2019-2-22 08:51 | 顯示全部樓層
51的資料,樓主需要好好研究一下。
時間是要計算的。
程序只是具體實現過程。
回復

使用道具 舉報

ID:474677 發表于 2019-2-22 08:56 | 顯示全部樓層
我來總結一下,樓上的說得都對,樓下的繼續補充……
回復

使用道具 舉報

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
回復

使用道具 舉報

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歸零,重新計時。
回復

使用道具 舉報

ID:425029 發表于 2019-2-25 10:16 | 顯示全部樓層
想請問一下,這個 for(a=100;a>0;a--)起什么作用呢,我在程序中將這行去掉之后,再燒到板上,沒有發現差異,麻煩各位高手幫忙看看,謝謝!
回復

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩欧美中文字幕在线观看 | 国产95在线 | 91天堂网| 91中文字幕| 天天操天天干天天爽 | www.色.com| 2020国产在线 | 中文字幕在线视频免费视频 | 久久久蜜桃 | 精品一区二区三 | 国产成人精品一区二 | 国产精品一区二区三区四区五区 | 99精品久久久 | 久久久久久久av麻豆果冻 | 中文字幕二区 | 欧美性大战久久久久久久蜜臀 | 国产中文一区二区三区 | 情侣酒店偷拍一区二区在线播放 | 欧美日韩综合精品 | 国产一区二区在线免费观看 | 91精品国产高清一区二区三区 | 狠狠爱综合 | 精品视频一区二区 | 一区二区三区中文字幕 | 色视频网站免费 | 精品日韩 | 精品亚洲一区二区 | 毛片片| 欧美精品 在线观看 | 91视频正在播放 | 亚洲视频在线观看 | 精品网站999 | 亚洲欧美一区二区三区1000 | 免费成人在线网 | 国产精品国产三级国产aⅴ原创 | 精品日韩一区二区 | 黄a在线播放 | 国产精品亚洲综合 | 国外成人在线视频 | 欧美在线 | 亚洲国产精选 |