打印

AT89C2051单片机定时问题

[复制链接]
1970|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
muyiming|  楼主 | 2009-11-25 16:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,我编写了一个程序,程序可以运行,但是我想把显示的时间改一改,现在是每一秒减一次,我想60秒减一次,也就是以前数码管现实的是秒,现在改为分钟,但是我不论是改变定时的时间还是改变定义的类型都无法实现,请高手指教,程序如下:
*
********************************************************************************************************/
#include <AT89X51.H>
/*******************************************************************************************************
  端口定义
*******************************************************************************************************/
sbit JZG =P3^7;    /**晶闸管   
sbit SW =P3^0;     /*十位                    
sbit GW =P3^1;    /*个位                    
sbit FMQ =P3^5;    /*蜂鸣器               

/*******************************************************************************************************
  全局变量定义
*******************************************************************************************************/
unsigned short int timeout=0;//中间变量 (256-6)*timeout=count计时间隔
unsigned   int count;  //设定时间值;
//unsigned short int min;  //
unsigned char code duanma[]= {0xed,0x41,0xdc,0xd9,0x71,0xb9,0xbd,0xc1,0xfd,0xf9};
/*{0x3f,0x06,0x5b,0x4f,0x66,     //共阴极数码管段码
                            0x6d,0x7d,0x07,0x7f,0x6f};*/
/*******************************************************************************************************
  函数声明
*******************************************************************************************************/
void delay(unsigned char); //延时
void run(void);      //倒计时
void display(void);   //显示
/*
*********************************************************************************************************
** 函数名称 :main()
** 函数功能 :
** 输入参数 :无
** 输出参数 :无
** Created by:   
** Created Date:   
*********************************************************************************************************
*/
void main(void)    //主函数
{  
unsigned char temp;
TMOD=0x02;
TH0=0x6;    //125us
TL0=0x6;
ET0=1;
EA=1;
count=0;
while(1)
{
temp=P3&0x1c;//0xbc;
if(temp!=0x1c)//0xbc
{display();      //延时按键消抖 ,利用display()代替delay(),使显示稳定
  temp=P3&0X1C;//0XBC
  if(temp!=0x1c)//0xbc
    switch(temp)
  {
  case 0x18:{count++;if(count>100)count=0;break;}     
  case 0x14:{count--;if(count>100)count=99;break;}   
  case 0x0c:{if(count!=0)run();;break;}      
  default :break;
   }
  while((P3&0x1c)==temp)display();
    JZG=1;

  }
  FMQ=0;
display();
  
}
}
/*
*********************************************************************************************************
** 函数名称 :display()
** 函数功能 :LED数码管显示
** 输入参数 :无
** 输出参数 :无
** 用到的全局变量 :shuma[10]
**
** Created by:   
** Created Date:   
*********************************************************************************************************
*/
void display(void)
{
P1=duanma[count/10];SW=1;
delay(10);SW=0;   
P1=duanma[count%10];GW=1;
delay(10);GW=0;  

}
/*
*********************************************************************************************************
** 函数名称 :delay(unsigned char ms)
** 函数功能 :软件延时
** 输入参数 :unsigned char ms
** 输出参数 :无
**
** Created by:   
** Created Date:   2009/11/02
*********************************************************************************************************
*/
void delay(unsigned char ms)
{
char i,j;
  while(ms--)for(i=0;i<55;i++)for(j=0;j<10;j++);
}
/*
*********************************************************************************************************
** 函数名称 :run()
** 函数功能 :倒计时函数,时间倒数记到0,晶闸管导通,蜂鸣器响
** 输入参数 :无
** 输出参数 :无
**
** Created by:   
** Created Date:   
*********************************************************************************************************
*/

void run(void)
{  unsigned char k=0xff;
   JZG=0;
TR0=1;
ET0=1;EA=1;

while(count)
{
display();
} JZG=1;
while(k--){FMQ=~FMQ; display();}
}
/*
*********************************************************************************************************
** 函数名称 :void t0(void) interrupt 1 using 0
** 函数功能 :定时器终端服务函数,为倒计时函数提供1秒计时
** 输入参数 :无
** 输出参数 :无
** 用到的全局变量 :timeout; 中间变量
       count;  设定的时间
**
** Created by:   
** Created Date:   
*********************************************************************************************************
*/

void t0(void) interrupt 1 using 0
{
timeout++;
if(timeout==80000) /* 125*8000=1s */
{count--;  timeout=0;}
if(count==0)TR0=0;

}

相关帖子

沙发
muyiming|  楼主 | 2009-11-25 19:45 | 只看该作者
怎么只有看得人啊 没有会的啊

使用特权

评论回复
板凳
zhenxing2000| | 2009-11-25 22:04 | 只看该作者
你的共阴段码表好像有错误呀,倒是注释部分是正确的。

使用特权

评论回复
地板
328500920| | 2009-11-25 23:00 | 只看该作者
好长呀

使用特权

评论回复
5
muyiming|  楼主 | 2009-11-26 08:25 | 只看该作者
共阴极数码管的表倒是没有错,因为那和我的几口有关系,主要是定时顶部准确,尤其是我现在想让他显示每一分钟递减一次,我现在最多能够让他四秒减一次

使用特权

评论回复
6
muyiming|  楼主 | 2009-11-26 08:27 | 只看该作者
怎么没有人回哦  ,

使用特权

评论回复
7
zhaoyu2005| | 2009-11-26 09:20 | 只看该作者
既然原来有秒显示了,那就根据秒计数(不显示),再开个变量计分,秒够60了,让分减1,并刷新显示

使用特权

评论回复
8
muyiming|  楼主 | 2009-11-26 10:23 | 只看该作者
********************************************************************************************************/

#include <AT89X51.H>
/*******************************************************************************************************
  端口定义
*******************************************************************************************************/

sbit JZG =P3^7;           /**晶闸管    实际电路为   
sbit SW =P3^0;     /*十位                  
sbit GW =P3^1;           /*个位                  
sbit FMQ =P3^5;                  /*蜂鸣器               

/*******************************************************************************************************
  全局变量定义
*******************************************************************************************************/

unsigned short int timeout;//中间变量 (256-6)*timeout=count计时间隔
unsigned short int count;         //设定时间值;
unsigned char code duanma[]= {0xed,0x41,0xdc,0xd9,0x71,0xb9,0xbd,0xc1,0xfd,0xf9};
/*{0x3f,0x06,0x5b,0x4f,0x66,            //共阴极数码管段码
                            0x6d,0x7d,0x07,0x7f,0x6f};*/

/*******************************************************************************************************
  函数声明
*******************************************************************************************************/

void delay(unsigned char); //延时
void run(void);                           //倒计时
void display(void);                        //显示

/*
*********************************************************************************************************
** 函数名称 :main()
** 函数功能 :
** 输入参数 :无
** 输出参数 :无
** Created by:                               
** Created Date:                       
*********************************************************************************************************
*/

void main(void)                                //主函数
{  
unsigned char temp;

TMOD=0x20;
TH0=0x6;                  //125us
TL0=0x6;
ET0=1;
EA=1;
count=0;
        while(1)
{
        temp=P3&0x1c;//0xbc;
        if(temp!=0x1c)//0xbc
        {display();                                  //延时按键消抖        ,利用display()代替delay(),使显示稳定
         temp=P3&0X1C;//0XBC
         if(temp!=0x1c)//0xbc
                  switch(temp)
                {
                case 0x18:{count++;if(count>100)count=0;break;}//0xb8                   //P1.0按下
                case 0x14:{count--;if(count>100)count=99;break;}//0xb4           //P1.1按下
                case 0x0c:{if(count!=0)run();;break;}//0xac                                   //P1.2按下
                default :break;
                 }
                while((P3&0x1c)==temp)display(); //松手后执行 0xbc
                         JZG=1;
       
         }
         FMQ=0;
        display();
         
}
}
/*
*********************************************************************************************************
** 函数名称 :display()
** 函数功能 :LED数码管显示
** 输入参数 :无
** 输出参数 :无
** 用到的全局变量        :shuma[10]
**
** Created by:                               
** Created Date:                       

*********************************************************************************************************
*/

void display(void)
{
        P1=duanma[count%10];SW=0;
        delay(10);SW=1;   
        P1=duanma[count/10];GW=0;
        delay(10);GW=1;  
       
}

/*
*********************************************************************************************************
** 函数名称 :delay(unsigned char ms)
** 函数功能 :软件延时
** 输入参数 :unsigned char ms
** 输出参数 :无
**
** Created by:                               
** Created Date:                       

*********************************************************************************************************
*/

void delay(unsigned char ms)
{
        char i,j;

                while(ms--)for(i=0;i<55;i++)for(j=0;j<10;j++);
}
/*
*********************************************************************************************************
** 函数名称 :run()
** 函数功能 :倒计时函数,时间倒数记到0,晶闸管导通,蜂鸣器响
** 输入参数 :无
** 输出参数 :无
**
** Created by:                       
** Created Date:                       

*********************************************************************************************************
*/


void run(void)
{                unsigned char k=0xff;
   JZG=0;
        TR0=1;
        ET0=1;EA=1;
       
        while(count)
        {
        display();
        } JZG=1;
        while(k--){FMQ=~FMQ; display();}
}

/*
*********************************************************************************************************
** 函数名称 :void t0(void) interrupt 1 using 0
** 函数功能 :定时器终端服务函数,为倒计时函数提供1秒计时
** 输入参数 :无
** 输出参数 :无
** 用到的全局变量        :timeout; 中间变量
                                          count;  设定的时间
**
** Created by:                               
** Created Date:                       
*********************************************************************************************************
*/


void t0(void) interrupt 1 using 0
{

        timeout++;
        if(timeout==14546)        /*        125*8000=1s        */
        {count--;  timeout=0;}
        if(count==0)TR0=0;


}
哈哈 搞定啊

使用特权

评论回复
9
kooshare| | 2009-11-26 10:28 | 只看该作者
本帖最后由 kooshare 于 2009-11-26 10:30 编辑

void t0(void) interrupt 1 using 0
{
timeout++;
if(timeout==80000) /* 125*8000=1s */
{count--;  timeout=0;}
if(count==0)TR0=0;

}

lz红色的部分有错误吧,1s的话红色的部分应该是8000,现在要1分钟,把8000改为480000就完事了。同事timeout类型改为unsigned int

使用特权

评论回复
10
muyiming|  楼主 | 2009-11-26 11:48 | 只看该作者
对上面的应该是8000,但是当吧8000改为480000后就会出现混乱,当然这个时候timeout 的类型是unsigned int, 8楼是我最后调制完后的程序我对照秒表计算了一下没有时间的差别了

使用特权

评论回复
11
LYXQ| | 2009-11-26 17:19 | 只看该作者
数据溢出了,用整形数做计数器你也不嫌累得慌。设3个计数器,秒分时,都用字符型的

使用特权

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

本版积分规则

2

主题

43

帖子

0

粉丝