#include<reg51h>
#define uchar unsigned char
uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//0-9
unsigned char sec=0,scanled;
unsigned char key,mode,time;
unsigned char disdat[2];
sbit keyqd=P1^0;
sbit keyzt=P1^1;
sbit keyql=P1^2;
void dischg()
{
disdat[0]=sec%10;
disdat[1]=sec/10;
}
void t0isr() interrupt 1 //秒计时
{
TH0=0x3c;
TL0=0xb0;
time++;
if(time==20)
{
time=0;
if(sec<99)sec++;
}
dischg();
}
void t1isr() interrupt 3 //显示
{
TH1=0xec;
TL1=0x78;
switch(scanled)
{
case 0:
P3=0x02;
P2=ledtab[disdat[1]];
break;
case 1:
P3=0x01;
P2=ledtab[disdat[0]];
break;
default:break;
}
scanled++;
scanled%=2;
}
main()
{
TMOD=0x11;
TH0=0x3c;
TL0=0xb0;
TH1=0xec;
TL1=0x78;
TR1=1;
TR0=0;
ET0=1;
ET1=1;
EA=1;
scanled=0;
time=0;
mode=1;
dischg();
while(1)
{
if(keyqd==0)
{
while(keyqd==0);
TR0=1;
}
if(keyzt==0)
{
while(keyzt==0);
TR0=0;
}
if(keyql==0)
{
while(keyql==0);
sec=0;
}
dischg();
}
}
/
proteus仿真中晶振电路及复位电路自行添加
晶振:12M
/
#include <reg51h>
sbit K1=P2^0; //
sbit K2=P2^1; //
bit flag=0; //
int num;
int L[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管段选数据 根据实际电路修改
int wei[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //数码管位选信号 根据实际电路修改
unsigned char dat[4];
/延时/
void delay(int i)
{
int x,y;
for(x=i;x>0;x--)
for(y=125;y>0;y--);
}
void main(void)
{
TMOD = 0x01; //定时器0 方式一
TH0 = 0x0FC; //10ms计时高8位
TL0 = 0x18; //10ms计时低8位
EA = 1; //开启总中断
ET0 = 1; //开启定时器0中断
TR0 = 1; //开启定时器0计数
while(1)
{
if(!K1) //判断K1键
{
delay(10); //按键去抖
if(!K1)
{
flag=~flag;
while(!K1); //等待按键d起
}
}
if(!K2) //判断K2键
{
delay(10); //按键去抖
if(!K2)
{
num=0;
}
}
}
}
void Timer0Interrupt(void) interrupt 1 //10ms中断
{ int i;
TH0 = 0x0D8; //中断初值重装
TL0 = 0x0F0;
if(flag) num++; //中断次数记录
if(num==10000) //10次中断为1010ms=1s
{
num=0;
}
dat[0]=L[num%10000/1000];
dat[1]=L[num%1000/100]|0x80;;
dat[2]=L[num%100/10];
dat[3]=L[num%10];
for(i=0;i<4;i++) //数码管显示
{
P1=dat[i]; //P1段选 根据实际电路修改
P3=wei[i]; //P3位选 根据实际电路修改 建议修改为其他IO口
delay(1);
P3=0xff; //去重影
}
}
附件为keil和proteus仿真(含电路)
个人原创手打 望采纳
其实,这与keil 没什么关系,主要是取决于用什么语言写程序,是汇编还是C语言,keil 不过是用来编译的软件。其次,既然是用数码管显示,就应该先画仿真图,或用实物开发板来显示,应该给开发板的原理图才好写程序。最先,至于倒计时就非常简单了,定义一个计时变量,作减法计数即可,每减一个数都送数码管显示出来。如下面仿真图,是两位倒计时的例子。
以上就是关于用模拟单片机AT89C51做一个秒表,要程序,电路图,,急,全部的内容,包括:用模拟单片机AT89C51做一个秒表,要程序,电路图,,急,、51单片机00.00~99.99秒表,K1开始和暂停,K2清零、想问下如何用keil写用数码管显示数字倒计时程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)