(超详细)基于51单片机的跑表

/基于单片机的跑表(间隔0.01s)/
#include “reg52.h”
#define u8 unsigned char
#define u16 unsigned int
u16 num;//用来存放读取到的键值
sbit key1=P3^1; //key1按键对应IO口
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;//138译码位选端
u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
/code表示将数据从RAM改存进ROM区,节省内存/
display(u16);//数码管显示函数声明
delay(u16);//延时函数声明
void main()
{
EA=1;//开总中断
ET0=1;//开定时器0分开关
TMOD=0x01;//配置为定时器0,方式1(即16位定时器)
TH0=(65536-10000)/256;//设置定时器初值,12MHz石英晶振定时为10ms
TL0=(65536-10000)%256;
TR0=1;//启动定时器0
while(1)
{
display(num);//数码管显示相应值
if(key1== 0)
{
delay(10);//延时10ms消抖
if(key1==0)
{
TR0=0;//按键后暂停,即关闭定时器
while(!key1) //松手后又开始计时
{
display(num);
}
TR0=1;
}
}
}

}
void time0() interrupt 1 //中断服务程序。其中‘0’是外部中断入口程序
{
TH0=(65536-10000)/256; //重装初值
TL0=(65536-10000)%256;
num++;
if(num==1000)//从000~999计时
num=0;

}
display(u16 num)
{
P0=0xff;//消隐
LSA=0;
LSB=1;
LSC=0;//第三个数码管
P0=smgduan[num/100];
delay(10);

P0=0xff;	
LSA=1;
LSB=0;
LSC=0;//第二个数码管
P0=smgduan[num%100/10];
delay(10);

P0=0xff;	
LSA=0;
LSB=0;
LSC=0;//第三个数码管
P0=smgduan[num%100%10];
delay(10);

return num;
}
delay(u16 x)//延时ms函数
{
u8 i,j;
for(i=x;i>0;i–)
{
for(j=120;j>0;j–);
}
return x;
}

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值