找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4569|回复: 5
收起左侧

单按键定时程序

[复制链接]
ID:55472 发表于 2014-4-28 19:56 | 显示全部楼层 |阅读模式
用了一天时间,终于修改完了这个程序,请大神看看那些地方需要优化的。


#include <reg52.h>        //52系列头文件
#define uchar unsigned char         //宏定义
#define uint unsigned int      //宏定义
sbit key=P1^4;         //声明P1口的第5位是按键引脚
sbit tt=P2^6;         //声明P2口按键十位数是数码管位选引脚
sbit st=P2^7;         //声明P2口按键个位数是数码管位选引脚
sbit thdis=P2^0;        //
sbit ttdis=P2^1;        //
sbit tsdis=P2^2;        //
sbit oput1=P1^0;        //声明P1.0为输出引脚
uchar code table[]={       //编码定义
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90};

void delayms(uint);        //声明子函数
uchar num0,num1,hendreds,tens,single;   //声明显示变量的数据类型
uint  time0;         //声明计时变量的数据类型
/**************************************************
   初始化函数
***************************************************/
void init()
{
oput1=0;
TMOD=0x01;         //设置定时器0为工作方式1(0000 0001)
TH0=(65536-45827)/256;                      //装初值50ms一次中断
TL0=(65536-45827)%256;                      //
IE=0x82;         //开总中断,开定时器0中断
}
/**************************************************
   按键显示函数
***************************************************/
void display(uchar numdis)      //
{            
  tens=numdis/10;       //
  single=numdis%10;       //
               
  tt=0;          //十位数显示
  P0=table[tens];       //
  delayms(5);
  tt=1;
  P0=0xff;

  st=0;            //个位数显示
  P0=table[single];          //
  delayms(5);
  st=1;
  P0=0xfff;
}
/**************************************************
   倒数显示函数
***************************************************/
void tdisplay(uint tdis)
{
hendreds=tdis/100;
tens=tdis%100/10;
single=tdis%10;

thdis=0;
P0=table[hendreds];
delayms(5);
thdis=1;
P0=0xff;

ttdis=0;
P0=table[tens];
delayms(5);
ttdis=1;
P0=0xff;

tsdis=0;
P0=table[single];
delayms(5);
tsdis=1;
P0=0xff;
}
/**************************************************
   键盘扫描函数
***************************************************/
void keyscan()            
{
    if(key==0)
{
     delayms(10);
  if(key==0)
  {
     num1++;        //显示变量num自增1
     time0=num1*60;      //输出变量时间
     if(num1>5)       //如果显示到5就清0
          num1=0;
     while(!key);
  }
     }
  }
/**************************************************
  P1.0输出的时间
***************************************************/
void oput()
{
if((num1>0)&&(time0>0))
{
  oput1=1;
  TR0=1;
}
else
{
  oput1=0;
  TR0=0;
  num1=0;
  time0=0;
}
}
/**************************************************
  延时函数
***************************************************/
void delayms(uint xms)
{
     uchar i,j;
  for (i=xms;i>0;i--)      //i=xms 即延时约xms毫秒
         for(j=110;j>0;j--);
}
/**************************************************
  主函数
***************************************************/
void main()             //
{
    init();
while(1)         //大循环
{
  keyscan();
  display(num1);
  tdisplay(time0);
  oput();
  
}
}
/**************************************************
  中断函数
***************************************************/
void T0_time() interrupt 1      //
{
       TH0=(65536-45872)/256;     //
    TL0=(65536-45872)%256;
    num0++;
    if(num0==20)        //如果到时了20次,说明一秒时间到
    {
          num0=0;
    time0--;
  }
}

回复

使用道具 举报

ID:1 发表于 2014-4-28 21:28 | 显示全部楼层
现在这个程序有什么问题吗?
回复

使用道具 举报

ID:55472 发表于 2014-4-28 22:59 | 显示全部楼层
admin 发表于 2014-4-28 21:28
现在这个程序有什么问题吗?

这个程序没有什么问题,请大家讨论讨论有没有优化得更好一点。
回复

使用道具 举报

ID:92231 发表于 2015-11-6 14:30 来自手机 | 显示全部楼层
编译时,time0=0;出现错误,没有通过
回复

使用道具 举报

ID:92231 发表于 2015-11-6 14:30 来自手机 | 显示全部楼层
编译时,time0=0;出现错误,没有通过
回复

使用道具 举报

ID:1042173 发表于 2023-11-30 14:43 | 显示全部楼层
我的编译通过,,,,
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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