用51单片机设计3位led数码显示管作秒表00.0-99.0求设计电路与c语言程序

用51单片机设计3位led数码显示管作秒表00.0-99.0求设计电路与c语言程序,第1张

#include "STC12C54.H"

#define uchar unsigned char

#define uint unsigned int

#define dataport P1//P1直接驱如缓动数码管的渣正模8个阳极

sbit wei1=P3^3//再有三个管脚接3个三极管驱动数码管的阴清嫌极

sbit wei2=P3^4

sbit wei3=P3^5

uint a=0//中断次数计数,一次50ms,20次为1 秒

//共阴数码管七段码

uchar TABLE[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}

//延时子程序

void delay1ms(uint t)

{

uint i,j,k

for(i=ti>0i--)

for(j=15j>0j--)

for(k=27k>0k--)

}

//显示子程序

void display(uint n)

{

uchar a1,a2,a3

a1=n/100%10

a2=n/10%10

a3=n%10

wei1=1

dataport=TABLE[a1]

delay1ms(1)

wei1=0

dataport=0x80|TABLE[a2]//这里多个小数点

delay1ms(1)

wei3=1

dataport=TABLE[a3]

delay1ms(1)

wei3=0

}

void init(void)

{

TMOD=0X01

TH0=(655536-50000)/256//定时50ms

TL0=(655536-50000)%256

EA=1

ET0=1

TR0=1

P1M0=0

P1M1=0xff//P1口设为推挽输出,驱动能力强

P3M0=0

P3M1=0x38//P3.3P3.4 P3.5口设为推挽输出

}

void main(void)//主程序

{

init()//初始状态设定

while(1)

{

display(a/2)//显示计数值,以十分之一秒为单位

}

}

void timer0(void)interrupt 1//中断子程序

{

TH0=(655536-50000)/256

TL0=(655536-50000)%256

a++;

if(a==1980)a=0//1980次是99秒

}

K1 EQU P1.0

K2 EQU P1.1

K3 EQU P1.2

ORG 0000H

LJMP MAIN

ORG 000BH

LJMP T0ISR

ORG 0030H

MAIN:

MOV TMOD,#01H

MOV TH0,#HIGH(65536-10000)

MOV TL0,#LOW(65536-10000)

SETB ET0

SETB TR0

SETB EA

MOV R0,#9

MOV R1,#9

MOV R2,#0

MOV R3,#99

CLR 00H

CLR 01H

LOOP:

JB K1,LP01

JNB K1,$

CLR 01H

INC R3

CJNE R3,#100,LOOP0

MOV R3,#0

SJMP LOOP0

LP01:

JB K2,LP02

JNB K2,$

CLR 01H

CJNE R3,#0,LP011

MOV R3,#99

SJMP LOOP0

LP011:

DEC R3

SJMP LOOP0

LP02:

JB K3,LOOP

JNB K3,$

SETB 01H

SJMP LOOP

LOOP0:

MOV A,R3

MOV B,#10

DIV AB

MOV R0,B

MOV R1,A

SJMP LOOP

T0ISR:

CLR TR0

MOV TH0,#HIGH(65536-10000)

MOV TL0,#LOW(65536-10000)

SETB TR0

MOV DPTR,#TABLE

T0C:

CPL 00H

JB 00H,T001

MOV P3,#0FDH

MOV A,R1

MOVC A,@A+DPTR

MOV P2,A

SJMP T002

T001:

MOV P3,#0FEH

MOV A,R0

MOVC A,@A+DPTR

MOV P2,A

T002:

JNB 01H,T0E

INC R2

MOV A,R2

CJNE A,#100,T0E

MOV R2,#0

MOV A,R0

JZ T003

DEC R0

SJMP T0E

T003:

MOV A,R1

JZ T004

DEC R1

MOV R0,#9

T0E:

RETI

T004:

CLR 01H

MOV R4,#16

T005:

CPL P0.0

LCALL DELAY

DJNZ R4,T005

RETI

DELAY:

MOV R6,#200

DLY:

MOV R7,#250

DJNZ R7,$

DJNZ R6,DLY

RET

TABLE: 共阴极数码管显示代码表

DB 3FH,06H,5BH,4FH,66H 01234

DB 6DH,7DH,07H,7FH,6FH 56789

END

我写了个六位数码管的程序,放到这里让你参考一下李胡,希望对你有用!

/*******************************************************************

数码管时钟秒表

功能简介:该程序有两个功能:时钟,秒表。key1,key2和key3键用来调节

时钟,根据LED的亮闪状态调节时钟(当八个LED全亮时为时钟显示状态,第一

个LED亮时为调节小时状态,第二个LED亮时为调节分钟状态,第三个LED亮时为

调节秒钟状态),key4键为秒表功能键。

实施步骤:第一步:开启定时器,完成数码管时钟走动功能;第二步:哪蔽拦完成

数码管时钟调节功能;第三步:完成数码管秒表显示功能。

*** 作提示:功能键有四个,第二行第以列按键为调节键,第二行第二列按键

为增加数据键,第二行第三列按键为减少键,第二行第四列按键为秒表功能键。

********************************************************************

********************************************************************/

#include <reg52.h>

#include<intrins.h>

#define uchar unsigned char

#define uint unsigned int

sbit beep=P2^3

sbit dula=P2^6

sbit wela=P2^7

uchar code table1[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf}//数码管位选编码

uchar code table2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,

0x79,0x71,0x00}

uchar temp //temp为按键变量

int light,flag//flag用来控制数码管显示的状态(并世显示时钟或者显示秒表),light用来控制时钟和秒表的led显示

uchar shi2,ge2,shi1,ge1 //这四个变量用来分离出实参的十位和个位

uchar num,num1,num2,num3 //num,num1用来计数,num2用来控制调节的时分秒,num3用来改变秒表状态下的显示状态

int miao,fen,shi //时钟变量

uchar mfen,mmiao,mmmiao //秒表变量

void delay(uint z)

{

uint i,j

for(i=0i<zi++)

for(j=0j<110j++)

}

void timeinit()

{

TMOD=0x11

TH0=(65536-46080)/256

TL0=(65536-46080)%256

TH1=(65536-4608)/256

TL1=(65536-4608)%256

EA=1

ET0=1

ET1=1

TR0=1

TR1=0

}

void timedisplay0() interrupt 1

{

TH0=(65536-46080)/256

TL0=(65536-46080)%256

num++

if(num==20)

{

num=0

miao++//开启时钟功能

if(miao==60)

{

miao=0

fen++

if(fen==60)

{

fen=0

shi++

if(shi==24)

shi=0

}

}

}

}

void timedisplay1() interrupt 3

{

TH1=(65536-4608)/256

TL1=(65536-4608)%256

num1++

if(num1==2)

{

num1=0

mmmiao++

if(mmmiao==100) //开启秒表功能

{

mmmiao=0

mmiao++

if(mmiao==60)

{

mmiao=0

mfen++

if(mfen==60)

mfen=0

}

}

}

}

void display(uchar add,uchar date) //数码管显示信息函数(带有小数点)

{

shi2=date/10

ge2=date%10

P0=0xff

wela=1

P0=table1[add]

wela=0

P0=0

dula=1

P0=table2[shi2]

dula=0

delay(1)

P0=0xff

wela=1

P0=table1[add+1]

wela=0

P0=0

dula=1

P0=table2[ge2]|0x80

dula=0

delay(1)

}

void display1(uchar add,uchar date) //数码管显示数据(不带有小数点)

{

shi1=date/10

ge1=date%10

P0=0xff

wela=1

P0=table1[add]

wela=0

P0=0

dula=1

P0=table2[shi1]

dula=0

delay(1)

P0=0xff

wela=1

P0=table1[add+1]

wela=0

P0=0

dula=1

P0=table2[ge1]

dula=0

delay(1)

}

void keyscan()

{

P3=0xfd

temp=P3 //第二行功能键

if(temp!=0xfd)

{

delay(5)

if(temp!=0xfd)

{

beep=0

switch(temp)

{

case 0xed: num2++ //第一个按键用来控制调节时,分,秒

TR0=0

light=1

if(num2==4)

{

num2=0

light=0

TR0=1

}

break

case 0xdd: if(num2==1) //第二键用来增加数据

{

shi++

if(shi==24)

shi=0

}

if(num2==2)

{

fen++

if(fen==60)

fen=0

}

if(num2==3)

{

miao++

if(miao==60)

miao=0

}

break

case 0xbd: if(num2==1) //第三个键用来减小数据

{

shi--

if(shi==-1)

shi=23

}

if(num2==2)

{

fen--

if(fen==-1)

fen=59

}

if(num2==3)

{

miao--

if(miao==-1)

miao=59

}

break

case 0x7d: flag=1 //第四个键用来开启秒表

num3++

TR1=1

if(num3==1)

mfen=mmiao=mmiao=0 //清除上次残留数据

if(num3==2)

TR1=0 //暂停秒表

if(num3==3)

{

mfen=mmiao=mmmiao=0 //秒表清零

TR1=0

}

if(num3==4)//重新开启秒表

TR1=1

if(num3==5)//暂停秒表

TR1=0

if(num3==6) //切换为显示时钟状态

{

flag=0

num3=0

}

break

}

while(temp!=0xfd)

{

temp=P3

}

beep=1

}

}

}

int main()

{

timeinit()

beep=1

while(1)

{

keyscan()

if(light==0)

{

if(miao%2==0) //当数码管显示时钟状态时,八个led将以亮一秒灭一秒的状态循环下去

P1=0

else

P1=0xff

}

else

{

if(num2==1)

P1=0xfe

if(num2==2)

P1=0xfd

if(num2==3)

P1=0xfb

}

if(flag==0) //显示时钟

{

display(1,shi)

display(3,fen)

display1(5,miao)

}

else //显示秒表

{

display(1,mfen)

display(3,mmiao)

display1(5,mmmiao)

}

}

return 0

}


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

原文地址:https://54852.com/yw/12516062.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-08-25
下一篇2025-08-25

发表评论

登录后才能评论

评论列表(0条)

    保存