找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2867|回复: 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 单片机教程网

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