用模拟单片机AT89C51做一个秒表,要程序,电路图,,急,

用模拟单片机AT89C51做一个秒表,要程序,电路图,,急,,第1张

#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写用数码管显示数字倒计时程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10081067.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存