打印

看到过有篇**,说的是ALE不能当其他电路的时钟信号

[复制链接]
3479|29
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dlurchin|  楼主 | 2009-4-11 22:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大侠:
   我请教大家一个问题,用到icl7135,我用51的t0作16位计数器用,计数值不会大到溢出,写了段程序,用1602显示,主程序如下:
void main()   
{   
   
   unsigned long i=0,x=0;     
    
    TMOD=0x05; 
    TH0=0; 
    TL0=0; 
    TR0=1; 
    ET0=1; 
    EA=1; 
    
    init();   1602初始化
    init(); 1602初始化
     while(1) 
   { 
       i=x;
       x=TH0*256+TL0;
       if(x==i) 
        {TH0=0; 
         TL0=0;} 
         else 
         {
            if(x<=12000)   
            print1(0xc0,0x2e);
            else 
            print1(0xc1,0x2f);
         }
   
  
  }       
}

我现在有几个概念还搞不清楚,1、当做16位计数器,如果不溢出,是不是不涉及中断,只是T0管脚上有个负跳变,th0+tl0的值加1,还是有个负跳变,中断一次,th0+tl0的值加1?   2、我想对脉冲计数,如果不是连续的脉冲,计数器就清零,重新开始计数,不知道c51怎么写,请教各位指点迷津?

相关帖子

沙发
dxpol432| | 2009-4-11 23:03 | 只看该作者

MCS51是减记数

外部记数方式的时候,负跳变产生益出,才会引起中断

脉冲失落检测:确定间隔,按时采样

使用特权

评论回复
板凳
dlurchin|  楼主 | 2009-4-12 08:02 | 只看该作者

谢谢

谢谢!  
脉冲失落检测:确定间隔,按时采样  
能否再说的具体点

使用特权

评论回复
地板
dlurchin|  楼主 | 2009-4-12 13:20 | 只看该作者

这样一个设想

用icl7135做电压表,用它的时钟与上它的busy管脚,在一个ad转换周期内,脉冲数与电压成正比,当电压满量程 或者不变时,停止计数并显示。现在是怎么用t0管脚对脉冲进行计数?

使用特权

评论回复
5
冷漠| | 2009-4-12 13:29 | 只看该作者

直接连接。

TO用做计数,BUSY接INT0用作控制。(正好下降沿中断)

在INT0中断程序中写下:TR0=0; 停止计数,然后读数。



需要的话,给你个采样程序。

使用特权

评论回复
6
dlurchin|  楼主 | 2009-4-12 13:37 | 只看该作者

谢谢,我先试试看,不行我再来请教

使用特权

评论回复
7
dlurchin|  楼主 | 2009-4-12 14:11 | 只看该作者

搞不来,这样对不对啊

使用特权

评论回复
8
dlurchin|  楼主 | 2009-4-12 16:31 | 只看该作者

改成这样也不行啊

#include<REG52.H>    
#define uchar unsigned char    
#define uint unsigned int    
sbit P36 = P3^6;
unsigned long x=0;  
void main()   
{   
   
       
    TMOD=0x05; 
    TH0=0xff; 
    TL0=0xff; 
    TR0=1; 
    EX0=1;
    EA=1; 

    while(1);
     
         
}

void EX0_int(void) interrupt 0
{
       TR0=0;
       x=TH0*256+TL0;
       if(x<=20000)
      {   
       P36=0;
       }
       else {
       P36=1;}
       TH0=0xff; 
       TL0=0xff;
       TR0=1;
}

使用特权

评论回复
9
ayb_ice| | 2009-4-12 16:34 | 只看该作者

LZ还是去仔细看看T0的方框图

使用特权

评论回复
10
冷漠| | 2009-4-12 17:15 | 只看该作者

看看俺的原创。T0从-10001开始计数!哈哈...

 4位半A/D转换器ICL7135与8031单片机的接口方法
ICL7135A/D转换器由于其成本低、分辨率(14位)高而获得广泛应用。本实验采用了由它构成的面板表。为将面板显示数据送入8031单片机,利用7135的串行输出数据功能和8031的T0计数器来实现简单的接口方法。
图1是7135的转换时序图。BUSY引脚电平为高表示转换开始,前10001个脉冲是积分阶段,以后所记录的脉冲数即为Vi 对应值。Vi最大为20000个脉冲,相当于二进制14位,因此16位计数器T0足够用来记录Vi 值。由于积分阶段前10001个脉冲与Vi值无关,所以T0计数应从-10001开始。这样当7135积分段结束时,T0计数器溢出清零,并继续记录以后的脉冲数,当转换结束BUSY变为无效时,低电平自动关闭T0,(见图2),这时T0记录的就是Vi值。




T7135.ASM是8031以查询方式采集数据时的子程序。10进制10001等于16进制2711H,用T0溢出值减去这个数,为10000-2711=D8EFH,即—10001值。程序如下:

T7135.ASM
L0:    MOV    TMOD, #0DH        ;T0按模式1操作
       MOV    TCON, #00H        ;关闭T0
L1:    MOV     TH0, #0D8H       ;T0置初值
       MOV     TL0, #0EFH
       JB    P3.2, $            ;寻找BUSY无效点
       SETB    TR0              ;打开T0
       JNB    P3.2, $           ;等待BUSY有效
       JB    P3.2, $            ;等待BUSY无效
       CLR    TR0               ;关闭T0
       RET                      ;程序结束


这是查询测试程序,如果采用中断就更简单了。

使用特权

评论回复
11
dlurchin|  楼主 | 2009-4-12 21:11 | 只看该作者

谢谢,有没有c51的版本啊

使用特权

评论回复
12
冷漠| | 2009-4-12 21:51 | 只看该作者

这还不容易?

C51程序中:

void main ( )
{
.....
.....

#pragma  asm

L0:    MOV    TMOD, #0DH        ;T0按模式1操作
       MOV    TCON, #00H        ;关闭T0
L1:    MOV     TH0, #0D8H       ;T0置初值
       MOV     TL0, #0EFH
       JB    P3.2, $            ;寻找BUSY无效点
       SETB    TR0              ;打开T0
       JNB    P3.2, $           ;等待BUSY有效
       JB    P3.2, $            ;等待BUSY无效
       CLR    TR0               ;关闭T0
#pragma endasm

.....
}

修改为C51也很容易:
TMOD=0X0D;
TH0=0xd8;
TL0=0xEF;
while(!P3.2);
TR0=1;
while(P3.2);
while(!P3.2);
TR0=0;

.....

修改为中断程序?还要吗?

使用特权

评论回复
13
dlurchin|  楼主 | 2009-4-12 22:04 | 只看该作者

是啊 ,用中断怎么弄啊,谢谢啊

使用特权

评论回复
14
dlurchin|  楼主 | 2009-4-12 22:20 | 只看该作者

我用你的方法,好像不行

#include<REG52.H>    
#define uchar unsigned char    
#define uint unsigned int    
sbit P36 = P3^6;
sbit P32 = P3^2;
unsigned long x=0;  
void main()   
{   
   
       
    TMOD=0x0d; 
    TH0=0xD8; 
    TL0=0xEF; 
    while(1){
    while(!P32);
    TR0=1;
    while(P32);
    while(!P32);
    TR0=0;
     x=TH0*256+TL0;
       if(x<=10000)
      {   
       P36=1;
       }
       else {
       P36=0;}
}
     
         
}

使用特权

评论回复
15
pcbdesigner| | 2009-4-12 23:42 | 只看该作者

多看几遍datasheet就全明白了

使用特权

评论回复
16
冷漠| | 2009-4-13 08:39 | 只看该作者

基础还没打好。P3口各管脚的作用仔细看看。

P3口是8052功能口,P3^6是写信号/WR,怎么可能做输出I/O?!

假定你用的是89Cxx芯片,可以设定P3口为I/O,那么你的T0计数脉冲输入是哪个管脚?.....
所以:像这种定义:
sbit P36 = P3^6;
sbit P32 = P3^2;

错大了。

使用特权

评论回复
17
xwj| | 2009-4-13 08:49 | 只看该作者

2楼不要误导新人,你在哪里看到“ MCS51是减记数”的?

LZ的问题,应该用下降沿中断,然后软件计数(这是对的)
而要实现“2、我想对脉冲计数,如果不是连续的脉冲,计数器就清零,重新开始计数”,只要开个定时器里面放上清零语句,每次边沿计数时重设初值即可,这样定时器时间一到就计数器清零了。

使用特权

评论回复
18
冷漠| | 2009-4-13 10:14 | 只看该作者

硬件接线图搞清楚。

使用特权

评论回复
19
dlurchin|  楼主 | 2009-4-13 19:19 | 只看该作者

我在搞搞清楚

使用特权

评论回复
20
dengm| | 2009-4-13 23:21 | 只看该作者

请用门控

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

17

帖子

0

粉丝