找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 753|回复: 1
收起左侧

51单片机T0口脉冲计数并显示 程序上出了问题

[复制链接]
ID:983682 发表于 2021-11-24 14:24 | 显示全部楼层 |阅读模式
大佬们帮我看看,想做一个可以10秒钟测量T0口脉冲数量并显示的程序,T0口脉冲用按键控制,可是程序上出了问题,定时器T1定时时间不对,数码管显示计数器次数也不对。

单片机源程序如下:
#include<reg51.h>
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
unsigned char code a[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管显示数组//
unsigned char b[8];
void display();
void init();
unsigned char c=0;        //用来存放要显示的脉冲数
unsigned long TimeCount;   //用于计算1分钟的
void main()
{
    init();
    while(1)
    {
        if(TR1 == 0)         //当定时器停下的时候,表明计数完毕
        {
            /*Freq = Freq + TL1;*/         //读取TL的值
            c=TL0+(TH0 * 256); //读取脉冲的值
            //--求脉冲的个十百千万十万位--//
            b[0]=a[c%1000000/100000];      
            b[1]=a[c%100000/10000];      
            b[2]=a[c%10000/1000];      
            b[3]=a[c%1000/100];      
            b[4]=a[c%100/10];      
            b[5]=a[c%10];
            //--显示完,重新计算下一次频率。--//      
            c=0;//将计算的脉冲清零
            TH0 = 0; //将计数器的值清零
            TL0 = 0;
            TR1 = 1; //开启定时器
            TR0 = 1; //开启计数器      
        }
        //--显示求得的数值--//
        display();         
    }
}
void init()//初始化
{
    //--定时器T0做计数器,工作方式1(16位定时器),只由TRx打开计数器--//
    //--定时器T1做定时器,工作方式1(16位定时器),只由TRx打开定时器--//      
    TMOD=0x15;
    //--设置定时器晶振为12MHZ时定时50ms--//
    TH1=(65536-50000)/256;
    TL1=(65536-50000)%256;
    //--打开中断-//
    ET1=1;
    ET0=1;
    EA=1;
    //--打开定时器*/
    TR1=1;
    TR0=1;
}
void Timer0() interrupt 1
{
    TimeCount++;
    if(TimeCount==200)//计时到10s
    {
        TR1=0;//定时器停止
        TR0=0;//计数器停止
        TimeCount=0;               
    }
    //--12MHZ设置定时50ms的初值--//
    TH1=(65536-50000)/256;
    TL1=(65536-50000)%256;      
}
void display()
{
    unsigned char i;
    unsigned int j;
    for(i=0;i<8;i++)
    {
        switch(i)         //位选,选择点亮的数码管,
        {
            case(0):LSA=0;LSB=0;LSC=0; break;//显示数码管第0位
            case(1):LSA=1;LSB=0;LSC=0; break;//显示数码管第1位
            case(2):LSA=0;LSB=1;LSC=0; break;//显示数码管第2位
            case(3):LSA=1;LSB=1;LSC=0; break;//显示数码管第3位
            case(4):LSA=0;LSB=0;LSC=1; break;//显示数码管第4位
            case(5):LSA=1;LSB=0;LSC=1; break;//显示数码管第5位
            case(6):LSA=0;LSB=1;LSC=1; break;//显示数码管第6位
            case(7):LSA=1;LSB=1;LSC=1; break;//显示数码管第7位      
        }
        P1=b[ i];//发送段码
        j=50;//扫描间隔时间设定
        while(j--);      
        P1=0x00;//消影
    }
}

原理图
0.png                           

回复

使用道具 举报

ID:983682 发表于 2021-11-24 19:19 | 显示全部楼层
成了,知道哪里有问题了,那个中断方式应该选interrupt 3,因为我用了T1计时器作中断
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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