找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2415|回复: 7
收起左侧

定时器1实验 请大神帮忙指点哪里错了 菜鸟在此拜谢

[复制链接]
ID:233997 发表于 2017-9-20 23:19 | 显示全部楼层 |阅读模式
/**************************************************************************************
*                              定时器1实验                                                                                                  *
实现现象:下载程序后数码管最后一位间隔一秒循环显示0-F。使用单片机内部定时器可以实现准确延时。
注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。                                                                                                                                                                  
***************************************************************************************/

#include <reg52.h>                         //此文件中定义了单片机的一些特殊功能寄存器

#define uchar unsigned char



sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

uchar code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
                                       
void smgplay();



/*******************************************************************************
* 函 数 名         : Timer1Init
* 函数功能                   : 定时器1初始化
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Timer1Init()
{
        TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。

    TH1=(65535-50000)/256;
        TL1=(65535-50000)%256;
        ET1=1;//打开定时器1中断允许
        EA=1;//打开总中断
        TR1=1;//打开定时器                       
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能                 : 主函数
* 输    入       : 无
* 输    出             : 无
*******************************************************************************/
void main()
{       
        LSA=0;
        LSB=0;
        LSC=0;
        Timer1Init();  //定时器1初始化
        while(1);               
}

void time1() interrupt 1
{
uchar num1;
Timer1Init();
if(num1==20)
{
num1=0;
num1++;
smgplay();
        }

        }

void smgplay()
{
while(1)
{
uchar num;
for(num=0;num<16;num++)
{
num=0;
num++;
P0=smgduan[num];
}
}
}

回复

使用道具 举报

ID:164602 发表于 2017-9-21 08:54 | 显示全部楼层
你程序中的问题我已经修改,在我的板子HC6800-ES-V2.0上可以正常显示了。你对比一下,找找自己的问题。
/**************************************************************************************
*                              定时器1实验                                                                                                  *
实现现象:下载程序后数码管最后一位间隔一秒循环显示0-F。使用单片机内部定时器可以实现准确延时。
注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。                                                                                                                                                                  
***************************************************************************************/

#include <reg52.h>                         //此文件中定义了单片机的一些特殊功能寄存器

#define uchar unsigned char



sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

uchar code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
uchar num1=0;
uchar num=0;                                       
void smgplay();



/*******************************************************************************
* 函 数 名         : Timer1Init
* 函数功能                   : 定时器1初始化
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Timer1Init()
{
        TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。

    TH1=(65535-50000)/256;
        TL1=(65535-50000)%256;
        ET1=1;//打开定时器1中断允许
        EA=1;//打开总中断
        TR1=1;//打开定时器                        
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能                 : 主函数
* 输    入       : 无
* 输    出             : 无
*******************************************************************************/
void main()
{        
        LSA=0;
        LSB=0;
        LSC=0;
        Timer1Init();  //定时器1初始化
P0=0x00;
        while(1);               
}

void time1() interrupt 3
{
    TH1=(65535-50000)/256;
        TL1=(65535-50000)%256;

num1++;
if(num1==20)
{
smgplay();
num1=0;
}

        }

void smgplay()
{

P0=smgduan[num];
num++;
if (num==16)
{
num=0;
}
}
回复

使用道具 举报

ID:234279 发表于 2017-9-21 08:59 | 显示全部楼层
for(num=0;num<16;num++)
{
num=0;
num++;
P0=smgduan[num];
}
这个是什么东西,死循环啊,一直在里面出不来了
回复

使用道具 举报

ID:232280 发表于 2017-9-21 14:30 来自手机 | 显示全部楼层
首先smg是死循环,num会一直小于16,其次主函数里没有放smg函数,那这个函数不会运行,还有你中断函数里放初始化函数做甚
回复

使用道具 举报

ID:233997 发表于 2017-9-21 21:19 | 显示全部楼层
HC6800-ES-V2.0 发表于 2017-9-21 08:54
你程序中的问题我已经修改,在我的板子HC6800-ES-V2.0上可以正常显示了。你对比一下,找找自己的问题。
/* ...

非常感谢,您让我学到很多。对num与num1之间的逻辑关系似懂非懂,不知是否可以指点一下,在下愚钝。
在我理解的基础上稍微修改了一下,这样是否也可以
如下:
/**************************************************************************************
*                              定时器1实验                                                                                                  *
实现现象:下载程序后数码管最后一位间隔一秒循环显示0-F。使用单片机内部定时器可以实现准确延时。
注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。                                                                                                                                                                  
***************************************************************************************/

#include <reg52.h>                         //此文件中定义了单片机的一些特殊功能寄存器

#define uchar unsigned char



sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

uchar code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
uchar num1=0;
uchar num=0;                                       
void smgplay();



/*******************************************************************************
* 函 数 名         : Timer1Init
* 函数功能                   : 定时器1初始化
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Timer1Init()
{
        TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。

    TH1=(65535-50000)/256;
        TL1=(65535-50000)%256;
        ET1=1;//打开定时器1中断允许
        EA=1;//打开总中断
        TR1=1;//打开定时器                        
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能                 : 主函数
* 输    入       : 无
* 输    出             : 无
*******************************************************************************/
void main()
{        
        LSA=0;
        LSB=0;
        LSC=0;
        Timer1Init();  //定时器1初始化
        P0=0x00;
        while(1);               
}

void time1() interrupt 3
{
        TH1=(65535-50000)/256;
        TL1=(65535-50000)%256;
                num1++;
if(num1==20)
{
smgplay();
num1=0;

}

        }

void smgplay()
{

for(num=0;num<16;num++)
{

P0=smgduan[num];


}

}
回复

使用道具 举报

ID:233997 发表于 2017-9-21 21:20 | 显示全部楼层

非常感谢指点
我理解只是皮毛做了修改
void smgplay()
{

for(num=0;num<16;num++)
{

P0=smgduan[num];


}

}
回复

使用道具 举报

ID:233997 发表于 2017-9-21 21:21 | 显示全部楼层
GOD丿小男孩 发表于 2017-9-21 14:30
首先smg是死循环,num会一直小于16,其次主函数里没有放smg函数,那这个函数不会运行,还有你中断函数里放 ...

非常感谢您的指点
回复

使用道具 举报

ID:234814 发表于 2017-9-22 10:06 | 显示全部楼层
void smgplay()
{
while(1)
{
uchar num;
for(num=0;num<16;num++)
{
num=0;
num++;
P0=smgduan[num];
}
}
这段程序是一个死循环;
单片机的中断服务函数应尽量剪短,不必要的函数不要放在中断中;
例如,你在中断里面进行了数码管显示调用;建议主函数中进行数码管显示调用。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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