本课题以89C52单片机为核心,设计出电子跑表,具有以下功能:

本课题以89C52单片机为核心,设计出电子跑表,具有以下功能:,第1张

我刚刚给别人做了这个设计,他的没有按键,我又从新给你弄了弄,完成你的所有要求,并且仿真成功了,看看吧。

#include<reg51h>

#define uchar unsigned char

#define uint unsigned int

uint a,m,n=0,k;//n为999存放变量

sbit key1=P3^0;

sbit key2=P3^1;

void delay(uint ms)//延时函数

{

uint i,j;

for(i=0;i<ms;i++)

for(j=0;j<120;j++);

}

void smg(uchar wx,uchar dx)//数码管显示

{

uchar tablewx[]={0x01,0x02,0x04,0x08};

uchar tabledx[]={0xC0,0xF9,0xA4,0xB0,0x99, 0x92, 0x82, 0xF8,0x80,0x90};

P1=tablewx[wx];

P2=tabledx[dx];

delay(3);

}

void t0start()//定时器t0初始化函数

{

TMOD=0x01;

TH0=0x3c;

TL0=0xb0;

ET0=1;

EA=1;

TR0=1;

}

void main()

{

t0start();

while(1)

{

if(key1==0&&TR0==1)

delay(30);

if(key1==0&&TR0==1)

TR0=0;

if(key1==0&&TR0==0)

delay(30);

if(key1==0&&TR0==0)

TR0=1;

if(key2==0)

{

n=0;

k=0;

}

smg(0,n/100);

smg(1,n%100/10);

smg(2,n%10);

smg(3,k);

}

}

void t0() interrupt 1//t0中断函数

{

TH0=0x3c;

TL0=0xb0;

a++;

m++;

if(m==2)

{

m=0;

k++;

if(k==10)

k=0;

}

if(a==20)

{

a=0;

n++;

}

}

MOV DPTR,#TAB

MOVC A,@A+DPTR

CPL A ;理解这句

MOV P0,A

MOV DPTR,#TAB 这句是将TAB处的内容的地址移入DPTR寄存器(51单片机中唯一的一个16位的)

MOVC A,@A+DPTR 这句将(A寄存器中的内容+DPTR)中的地址处的数据移入A

比如此时 A=0,DPTR=300,这时就将300+0寄存器里的数据移到A

如果A=2,DPTR=300,这时就将(300+2)寄存器里的数据移到A

CPL A ; A求反,

MOV P0,A 将A的值移入P0口,用数码管等显示出来结果

#include<reg52h>

unsigned int s;

unsigned char key;

sbit d1=P3^7;

void delay() //动态显示延时

{

int k;

for(k=0;k<100;k++);

}

void delay1() //去抖动延时

{

unsigned char code table[] = {

0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

P2=table[s%10]; P3=0xf8; delay(); P3=0xf0;

P2=table[s/10%10]; P3=0xf4; delay(); P3=0xf0;

P2=table[s/100%10]; P3=0xf2; delay(); P3=0xf0;

P2=table[s/1000]; P3=0xf1; delay(); P3=0xf0;

}

void main()

{

TMOD = 0x01;

TH0 = (65536 - 10000) / 256;//初值,每10ms中断一次

TL0 = (65536 - 10000) % 256;

ET0=1;

EA=1;

while(1) {

delay1();

if(!d1) {

delay1();

if(!d1) { //去抖动

while(!d1) delay1();//等待释放

key++;

if(key == 4) key = 1;

}

}

if(key == 1) TR0 = 1;//开始计时

else if(key == 2) TR0 = 0;//停止

else s = 0;

}

}

void time0() interrupt 1 //内部中断

{

TH0 = (65536 - 10000) / 256;

TL0 = (65536 - 10000) % 256;

s++;

if(s == 10000) s = 0;

}

以上就是关于本课题以89C52单片机为核心,设计出电子跑表,具有以下功能:全部的内容,包括:本课题以89C52单片机为核心,设计出电子跑表,具有以下功能:、MCS-51单片机查表程序的问题、利用51单片机动态显示0-60秒表等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存