找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1378|回复: 11
收起左侧

51单片机想做个类似秒表的功能,就是不自增 附程序

[复制链接]
ID:918402 发表于 2022-4-7 01:19 | 显示全部楼层 |阅读模式
50黑币
跟着教程学习51单片机,在做练习的时候,碰到了难题,原本是想做个秒表功能,但是只可以一直显示0.00,不能够自增计数(设想是从1.00-9.99自增循环计数),搞到半夜也搞不定,测试过,直接赋值某个数字,是可以静态显示的,但就是不自增,只好求教各位前辈!能编译,没有错误,有两个警告

单片机源程序如下:
/*********************************************************************

**********************************************************************
程序名称:
程序版本:V1.0
作    者:                  
编写时间:2022年4月6日         
硬件支持:  
接口说明:
修改日志:
    N0.1:
**********************************************************************/
/*
**********************************************************************
*                        头文件包含/SFR定义
**********************************************************************
*/
#include<reg52.h>

/*
**********************************************************************
*                       本地数据类型/宏定义
**********************************************************************
*/
//typedef signed char int8;         //8位有符号字符型
//typedef signed int int16;         //16位有符号整型
//typedef signed long int32;        //32位有符号长整型
typedef unsigned char uchar;      //8位无符号字符型
typedef unsigned int uint;      //16位无符号整型
//typedef unsigned long ulong;     //32位无符号长整型

/*
**********************************************************************
*                        单片机IO口位定义
**********************************************************************
*/
sbit duan=P2^6;
sbit wei=P2^7;
/*
**********************************************************************
*                      本地全局变量/数组定义
**********************************************************************
*/
uchar code tableduan[]={0x3f,0x06,0x5b,0x4f,0x66,
                        0x6d,0x7d,0x07,0x7f,0x6f};
uchar code tableduana[]={0xbf,0x86,0xdb,0xcf,0xe6,  //带小数点的数组0-9
                        0xed,0xfd,0x87,0xff,0xef};
uint num,dis;


/*
**********************************************************************
*                         函数原型声明
**********************************************************************
*/
display(uint);
delay(uchar);

/*********************************************************************
*函数名称:main
*函数功能:主函数
*函数调用:
*参数列表:无
*返 回 值:无
*结    果:
*备    注:
*********************************************************************/
void main(void)
{
    EA=1;
    ET0=1;
    TMOD=0x01;
    TH0=(65536-500)/256;
    TL0=(65536-500)%256;   
    TR0=1;

        while(1)
        {
       if(num==20)
       {
        num=0;            
        if(dis==1000)
        dis=0;
        dis++;         

       }           
        display(dis);

        }
}


void time0() interrupt 1
{
    TH0=(65536-500)/256;
    TL0=(65536-500)%256;  
    num++;

}

display(uint dis)
{

    wei=1;
    P0=0xff;
    wei=0;


    P0=tableduana[dis/100];
    duan=1;   
    duan=0;
    wei=1;
    P0=0xfe;
    wei=0;
    delay (10);


    P0=tableduan[dis%100/10];
    duan=1;   
    duan=0;
    wei=1;
    P0=0xfd;
    wei=0;
    delay (10);


    P0=tableduan[dis%100%10];
    duan=1;   
    duan=0;
    wei=1;
    P0=0xfb;
    wei=0;
    delay (10);   
}

delay(uchar x)
{
    uchar a,b;
    for(a=x;a>0;a--)
       for(b=200;b>0;b--);

}

回复

使用道具 举报

ID:624769 发表于 2022-4-7 04:17 | 显示全部楼层

        while(1)
         {
         display(dis);
         }
}


void time0() interrupt 1
{
     TH0=(65536-1000)/256;
     TL0=(65536-1000)%256;  
    if(++dis>=1000)       dis=0;
}

评分

参与人数 1黑币 +12 收起 理由
xiazhiyu1979 + 12

查看全部评分

回复

使用道具 举报

ID:960157 发表于 2022-4-7 06:49 | 显示全部楼层
是否没有进入定时中断?
回复

使用道具 举报

ID:310441 发表于 2022-4-7 07:38 来自手机 | 显示全部楼层
楼上凌晨给的代码可以试试。先解决第一步问题。
回复

使用道具 举报

ID:310441 发表于 2022-4-7 07:41 来自手机 | 显示全部楼层
dis在两个地方赋值,有可能出问题。
回复

使用道具 举报

ID:584814 发表于 2022-4-7 08:12 | 显示全部楼层
既然是不自增,且直接赋值显示正常,那么就在主程序中写上自增,将中断不用试试。
如果可以,就是中断问题,可参见器件手册上中断的写法改了就好。
回复

使用道具 举报

ID:844772 发表于 2022-4-7 08:42 | 显示全部楼层
1、你是不是算错了,不是秒表吗?那应该500ms进一次中断, 应该改成TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;   
2、你原来不自增的原因,可能是因为由于显示用时长,num自增的很快在显示的时候就超过了20,所以这句    if(num==20)永远通过不了。可以用if(20<=num) 修改。
回复

使用道具 举报

ID:918402 发表于 2022-4-7 09:43 | 显示全部楼层
glinfei 发表于 2022-4-7 08:42
1、你是不是算错了,不是秒表吗?那应该500ms进一次中断, 应该改成TH0=(65536-50000)/256;
    TL0=(6553 ...

带小数点的,所以有两个数组,最一位数是个位数,是从0.00-9.99循环的,所以自增是10个毫秒一次
回复

使用道具 举报

ID:918402 发表于 2022-4-7 09:48 | 显示全部楼层
188610329 发表于 2022-4-7 04:17
while(1)
         {
         display(dis);

谢谢,数字至少跳动起来了,我再研究下,现在显示效果不好,我再看看原因,谢谢了
回复

使用道具 举报

ID:918402 发表于 2022-4-7 10:17 | 显示全部楼层
188610329 发表于 2022-4-7 04:17
while(1)
         {
         display(dis);

按照兄弟的程序,可以跑动起来了,经过调试,改为65536-9200,时间基本无误差,程序后来也改成        while(1)
        {
//       if(num==20)
//       {
//        num=0;            
       if(dis>=1000)
        dis=0;
//       dis++;         
//      }           
        display(dis);

        }
}


void time0() interrupt 1
{
    TH0=(65536-9200)/256;
    TL0=(65536-9200)%256;  
//    if(++dis>=1000)      
//   dis=0;
    dis++;
回复

使用道具 举报

ID:121859 发表于 2022-4-7 14:06 | 显示全部楼层
       if(num>=20)
       {
        num=0;            
        if(dis>=1000)
        dis=0;
        dis++;         

       }           
回复

使用道具 举报

ID:123289 发表于 2022-4-8 15:41 | 显示全部楼层
1、先写一个程序W_XXX,能从某个寄存器XXX中取出一个数据显示。
2、做一个10ms的定时器。
3、每次中断将XXX+1,(进行从1.00-9.99自增循环计数)。
这样就OK了。当然显示部分你未提,估计你会了,也就不说了。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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