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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3685|回復: 4
打印 上一主題 下一主題
收起左側

關于計數器程序的兩個問題咨詢

[復制鏈接]
跳轉到指定樓層
樓主
ID:51963 發表于 2013-9-3 21:02 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include<reg51.h> //頭文件
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

unsigned char temp[8];
unsigned char dispcount;
unsigned char T0count;
unsigned char timecount;
bit flag;
unsigned long x;


unsigned char TempBuffer[10];



sbit lcde=P2^7;          //使能端
sbit lcdrs=P2^6;   //復位端
sbit lcdrw=P2^5; //寫數據端

void IntToStr(unsigned int t, unsigned char *str, unsigned char n)
{
        unsigned char a[5]; char i, j;                                         
        a[0]=(t/10000)%10;         //取得整數值到數組                 
        a[1]=(t/1000)%10;                                             
        a[2]=(t/100)%10;                                             
        a[3]=(t/10)%10;                                               
        a[4]=(t/1)%10;                                                

        for(i=0; i<5; i++)         //轉成ASCII碼                     
                a=a+'0';                                            
        for(i=0; a=='0' && i<=3; i++);                             
        for(j=5-n; j<i; j++)       //填充空格                        
                { *str=' ';  str++; }                                    
        for(; i<5; i++)                                               
                { *str=a; str++; }  //加入有效的數字                  
        *str='\0';
}



/*******************************************************************/
/*                                                                                                                                  */
/* 延時子程序                                                                                                                  */
/*                                                                                                                                  */
/*******************************************************************/
void delay(uint z)
{
        uint a,y;
        for(a=z;a>0;a--)
                for(y=110;y>0;y--);
}


main()
{
        unsigned char i;
        init();

        while(1)
         {
             if(flag==1)
               {
                 flag=0;
                 x=T0count*65536+TH0*256+TL0;
                 IntToStr(x, &TempBuffer[0], 5);


                         while(TempBuffer != '\0')
                         {
                                  write_date(TempBuffer);
                                i++;
                                delay(300);
                         }
                         write_com(0x01);

                 timecount=0;
                 T0count=0;
                 TH0=0;
                 TL0=0;
                 TR0=1;
                         TR1=1;
                         i = 0;
               }
           }
               
}




這個是我在網上找到的一個計數器程序,里面我有兩個地方沒有看懂,我用紅色的標注出來了的
for(i=0; i<5; i++)         //轉成ASCII碼                     
                a=a+'0';          他這里是寫出計數的位 ,后面加一個 '0'是干什么的呢                                     
        for(i=0; a=='0' && i<=3; i++);                             
        for(j=5-n; j<i; j++)       //填充空格                        
                { *str=' ';  str++; }            這個語句我沒有看懂,         *str函數不怎么明白                    
        for(; i<5; i++)                                               
                { *str=a; str++; }  //加入有效的數字                  
        *str='\0';

第二個地方
x=T0count*65536+TH0*256+TL0;        這個X是表示計數值的大小,那怎么等式為什么要T0count*65536+TH0*256+TL0
                 IntToStr(x, &TempBuffer[0], 5);   &TempBuffer[0]是什么意思呢


                         while(TempBuffer != '\0')
                         {
                                  write_date(TempBuffer);

就這些地方不怎么明白,麻煩幫我解釋一下   不勝感激。。。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:7485 發表于 2013-9-4 08:12 | 只看該作者
ASCII碼的"0"的值是0x30,1=0x31......,9=0x39,所以如果a=5,5+0x30=0x35就是5的ASCII碼了。注意程序中的"0"是0的ASCII碼,是0x30,也可以是48(10進制)。
指針問題,你真的要看看資料了。
你那里說的T0count*65536+TH0*256+TL0,T0COUNT是TH0的進位,也就是TH0溢出次數,溢出一次是0xffff(10進制 65536)。大概初裝值=0才會這樣。

&TempBuffer[0],是取地址運算,提取TempBuffer[0]的地址。*str是指針,取值。
舉例子:*str=&TempBuffer[0],那么str就等于TempBuffer[]數組的首地址,也就是TempBuffer[0]的地址。而b=*str,就是和b=TempBuffer[0]等效。但是使用指針可以對指針進行運算、賦值(例如:str++),否則不是很方便。
回復

使用道具 舉報

板凳
ID:51963 發表于 2013-9-4 10:05 | 只看該作者
ahshmj 發表于 2013-9-4 08:12
ASCII碼的"0"的值是0x30,1=0x31......,9=0x39,所以如果a=5,5+0x30=0x35就是5的ASCII碼了。注意程序中的" ...

首先非常的感謝你給我解答

//count interrupt
void t0(void) interrupt 1 using 0
{
        T0count++;
        TH0=0;
        TL0=0;
}

這個是計數器的中斷
那就是說T0counter是來一個脈沖就計數一下
但是  T0count*65536+TH0*256+TL0  這個我真沒有看懂,其它你說的都懂了
回復

使用道具 舉報

地板
ID:7485 發表于 2013-9-5 08:30 | 只看該作者
本帖最后由 ahshmj 于 2013-9-5 09:39 編輯

你的程序不全,但是就這一小段可以肯定是不對的,定時器溢出時,TH0和TL0本來就已經置0,如果再賦值就會造成計時不準(你可以在keil里面調試時看看),因為這兩條指令和TIME0中斷跳轉也是要占用時間。我估計應該是這樣的:          可能你的定時器工作模式 (TMOD=09),定時器的啟動或停止受int0的控制。前面一個脈沖到時,啟動定時器,下一個脈沖到時停止定時器。(int0可以在產生中斷的同時,控制定時器TIME0)
  
         T0count不是一個脈沖計一個數,而是定時器溢出一次計一個數。
          如果脈沖間隔大于定時器0xff的計時時,另設一個計數器,記錄定時器的溢出次數。
         
         當int0產生中斷時,停止計時,這時候的計數值的高8位在 T0count,  中8位在TH0,低8位在TL0。TH0向T0count進位是滿65536(0xffff+1)進位1,所以T0count每一個數值就等于65536,而TL0向TH0進位 是滿0xff+1(255+1溢出),所以TH0的權為0xff+1,就是TH0*256,TL0的權是1,而TL0的權為1,直接加。
             如果脈沖間隔小于定時器的最大值0XFF,也可以這樣:在一定的時間內記錄INT0接收的外部脈沖數,但計算公式不是你上面這樣的。  






回復

使用道具 舉報

5#
ID:52286 發表于 2013-10-14 00:30 | 只看該作者
支持支持、、
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美性一级 | 先锋av资源在线 | 激情五月综合 | 国产精品久久久久久久久久久新郎 | 超碰日本 | 91免费看片| 亚洲美女av网站 | 欧美一区二区三区在线视频 | 一级黄色夫妻生活 | 亚州精品天堂中文字幕 | 久综合| av网站免费观看 | 欧美色人 | 综合色播| 欧美日韩看片 | 久久久久久久一区 | 福利视频三区 | 久久久久久久91 | 高清国产一区二区 | 在线国产视频 | 国产精品美女久久久久久免费 | 超碰导航 | 日本一区二区三区四区 | 日韩欧美中文在线 | 天天干夜夜操 | 伊人久操 | 最新超碰| 国产精品91网站 | 国外成人免费视频 | 99精品国产一区二区青青牛奶 | 91精品久久久久久久久 | 天天影视综合 | 亚洲欧美在线一区 | 亚洲精品国产精品国自产在线 | 操操操av | 精品国产色 | 成年人精品视频 | 亚洲欧美在线一区 | 人人操日日干 | 精品日韩欧美一区二区 | 一区二区三区四区日韩 |