求用单片机89C523位数码管做一个电子跑表的程序救急啊

求用单片机89C523位数码管做一个电子跑表的程序救急啊,第1张

#include <reg51.h>

//LCD的口线

sbit E=P3^5

sbit RW=P3^6

sbit RS=P3^7

//8字LED的连接方法

//P0.7,P0.6,P0.5,P0.4,P0.3,P0.2,P0.1,P0.0

//G, F A E B H C D

unsigned char code ledcode[]={0x84,0xf5,0x46,0x54,0x35,0x1c,0x0c,0xd5,

0x04,0x14,0x05,0x2c,0x8e,0x64,0x0e,0x0f}//数码管段码表

unsigned char js100ms,jsgw,jssw,t0100ms,t0sm

void time0(void)

void main(void)

{

E=0 //取消LCD对LED的影响

RW=0

RS=1

js100ms=0x00

jsgw=0x00

jssw=0x00

t0100ms=0x14

t0sm=0x01 //从第一个LED开始显示

TH0=0xee

TL0=0x00

TMOD=0x01

TR0=1

IE=0x82

while(1)

{}

}

void time0(void) interrupt 1

{

TH0=0xee

TL0=0x00

t0100ms--

if(t0100ms==0x00)

{

t0100ms=0x14

js100ms++

if(js100ms==0x0a)

{

js100ms=0x00

jsgw++

if(jsgw==0x0a)

{

jsgw=0x00

jssw++

if(jssw==0x0a)

{jssw=0x00}

}

}

}

t0sm++

if(t0sm==0x04)

{t0sm=0x01}

P0=0xff

switch(t0sm)

{

case 0x01: { P2=0xdfP0=ledcode[js100ms]}break

case 0x02: { P2=0xefP0=ledcode[jsgw]&0xFB}break

case 0x03: { P2=0xf7P0=ledcode[jssw]}break

default: break

}

}

或者汇编

JS100MS EQU 32H 计数器明纯0.1S

JSGW EQU 30H 计数器的个位

JSSW EQU 31H 计数器的十位

T0_100MS EQU 33H 产生1S

LEDSM EQU 34H 现在扫到第几个LED

ORG 0000H

AJMP MAIN

ORG 000BH

AJMP TIME0_1

ORG 0050H

MAIN:

MOV JS100MS,#00H 上电时从00.0开始

MOV JSSW,#00H

MOV JSGW,#00H

MOV T0_100MS,#14H 5MS*20=100MS

MOV LEDSM,#01H

MOV TH0,#0EEH 16位的定时器,定时5MS

MOV TL0,#00H

MOV TMOD,#01H

SETB TR0

MOV IE,#82H 定时器0中断

SJMP $

ORG 0100H

TIME0_1: MOV TH0,#0EEH

MOV TL0,#00H

DJNZ T0_100MS,TODISP

MOV T0_100MS,#14H

INC JS100MS

MOV A,JS100MS

CJNE A,#0AH,TODISP

MOV JS100MS,#00H

INC JSGW

MOV A,JSGW

CJNE A,#0AH,TODISP

MOV JSGW,#00H

INC JSSW

MOV A,JSSW

CJNE A,#0AH,TODISP

MOV JSSW,#00H 溢出99.9则回到00.0

TODISP: MOV P0,#0FFH 在位选时关显示

INC LEDSM

MOV A,LEDSM

CJNE A,#04H,TODISP1

MOV LEDSM,#01H 扫孝侍完第三个又从第一个开激慎咐始

TODISP1: MOV A,LEDSM

CJNE A,#01H,TODISP2

MOV P2,#0DFH

MOV A,JS100MS

MOV DPTR,#LEDCODE

MOVC A,@A+DPTR

AJMP TOP0

TODISP2: CJNE A,#02H,TODISP3

MOV P2,#0EFH

MOV A,JSGW

MOV DPTR,#LEDCODE

MOVC A,@A+DPTR

CLR ACC.2 把H点点亮

AJMP TOP0

TODISP3: MOV P2,#0F7H

MOV A,JSSW

MOV DPTR,#LEDCODE

MOVC A,@A+DPTR

TOP0: MOV P0,A

RETI

8字LED的连接方法

P0.7,P0.6,P0.5,P0.4,P0.3,P0.2,P0.1,P0.0

G, F A E B H C D

LED字段码表

LEDCODE: DB 84H 0

DB 0F5H 1

DB 46H 2

DB 54H 3

DB 35H 4

DB 1CH 5

DB 0CH 6

DB 0D5H 7

DB 04H 8

DB 14H 9

DB 05H A

DB 2CH B

DB 8EH C

DB 64H D

DB 0EH E

DB 0FH F

END

如果发电路可以量身打造哦QQ514586810

#include<pic.h>

//blink程序,纯纤没PORTD作为输出八路LED信竖洞号

void delay(unsigned int t)

{//延时1s子程序

unsigned int i,j

for(i=0i<=ti++)

{

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

{

asm("nop")

}

}

}

main()

{

TRISD=0X00//D口都为输出

PORTD=0x01//初始值做纳

while(1)

{

delay(1)

PORTD=PORTD<<1

if(PORTD==0x00)

{

PORTD=0x01

}

}

}

用定时器产生固定的时间(一般为毫秒级)州袜卖,然后对它计数(产生秒),以秒,分,时进位就是了(电子表),加两个按键实现复册逗位和停止就行了(马表了)!

这是思路,具体程序如下:

0-9999999.9 跑马表

Count EQU 40H

TimeCount EQU 3FH

K1 BIT P1.4 启动好颂计时

K2 BIT P1.5 暂停计时

K3 BIT P1.6

K4 BIT P1.7 计时单元清零

BEEP BIT P3.7

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

ORG 0000H

JMP MAIN

ORG 000BH

JMP TIMER0

ORG 0030H

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

主程序

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

MAIN:

MOV SP,#60H

MOV TMOD,#01

SETB EA

SETB ET0

MOV TH0,#4CH 50ms定时

MOV TL0,#00H

CALL M_CLR 计时单元清零

MAIN1:

JB K1,MAIN2

CALL BEEP_BL

CALL DELAY 调显示延时

SETB TR0 启动中断

MAIN2:

JB K2,MAIN3

CALL BEEP_BL

CALL DELAY 调显示延时

CLR TR0停止中断

MAIN3:

JB K4,MAIN4

CALL BEEP_BL

CALL DELAY 调显示延时

CALL M_CLR 计时单元清零

MAIN4:

CALL DISP

JMP MAIN1

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

计时单元清零子程序

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

M_CLR:

MOV R0,#Count

MOV A,#00H

CLR_1:

MOV @R0,A 清零

INC R0

CJNE R0,#49H,CLR_1

RET

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

键延时子程序

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

DELAY:

MOV R4,#05H

DELAY1:

CALL DISP

DJNZ R4,DELAY1

RET

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

显示子程序

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

DISP:

MOV R0,#Count 获得显示单元首地址

MOV R1,#07FH 从第一个数码管开始

MOV R2,#08H 共显示8位数码管

DISP1:

MOV A,@R0 获得当前位地址

MOV DPTR,#TABLE 获得表头

MOVC A,@A+DPTR查表获得显示数据

MOV P0,A 显示数据

MOV P2,R1 开始显示当前位

MOV A,R1 准备显示下一位

CJNE A,#0BFH,DISP2

CLR P0.7 加小数点

DISP2:

RR A

MOV R1,A 下一位

INC R0取下一个单元地址

LCALL DELAY2MS延时 2 MS

DJNZ R2,DISP1 重复显示下一个

MOV P2,#0FFH 关闭显示

RET 显示完成,返回

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

显示延时子程序

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

DELAY2MS:

MOV R6,#10

DEL1:

MOV R7,#100

DJNZ R7,$

DJNZ R6,DEL1

RET

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

中断服务子程序

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

TIMER0:

PUSH ACC

MOV TH0,#4CH 50ms定时

MOV TL0,#00H

INC TimeCount

MOV A,TimeCount

CJNE A,#2,T_END

MOV TimeCount,#00H

INC Count 小数位

MOV A,Count

CJNE A,#10,T_END

MOV Count,#00H

INC Count+1 个位

MOV A,Count+1

CJNE A,#10,T_END

MOV Count+1,#00H

INC Count+2 十位

MOV A,Count+2

CJNE A,#10,T_END

MOV Count+2,#00H

INC Count+3 百位

MOV A,Count+3

CJNE A,#10,T_END

MOV Count+3,#00H

INC Count+4 千位

MOV A,Count+4

CJNE A,#10,T_END

MOV Count+4,#00H

INC Count+5 万位

MOV A,Count+5

CJNE A,#10,T_END

MOV Count+5,#00H

INC Count+6 十万位

MOV A,Count+6

CJNE A,#10,T_END

MOV Count+6,#00H

INC Count+7 百万位

MOV A,Count+7

CJNE A,#10,T_END

MOV Count+7,#00H

T_END:

POP ACC

RETI

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

蜂鸣器响一声子程序

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

BEEP_BL:

MOV R6,#100

BL2:CALL DEX1

CPL BEEP

DJNZ R6,BL2

RET

DEX1: MOV R7,#180

DE2:NOP

DJNZ R7,DE2

RET

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

TABLE:

DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H

DB 80H ,90H,0FFH

DB 88H,83H,0C6H,0A1H,86H,8EH

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

END

#include <reg51.h>

#include <intrins.h>

#define uchar unsigned char

#define uint unsigned int

uchar Count

sbit K1 = P1^4

sbit K2 = P1^5

sbit K3 = P1^6

sbit K4 = P1^7

sbit DIN = P0^7 //小数点

sbit BEEP = P3^7 //蜂鸣器

uchar code LEDData[ ] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,

0x80,0x90,0xff}

uchar data display[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}

uchar code scan_bit[] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}

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

延时函数

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

void Delay(uint num)//延时函数

{

while( --num )

}

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

蜂鸣器响一声

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

void beep()

{

unsigned char y

for (y=0y<150y++)

{

Delay(50)

BEEP=!BEEP //BEEP取反

}

BEEP=1 //关闭蜂鸣器

}

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

显示函数

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

play()

{

uchar i

for(i=0i<8i++)

{

P0=LEDData[display[i]] //显示个位

P2=scan_bit[i]

if(scan_bit[i]==0xbf)

DIN=0 //加小数点

Delay(100)

}

P2=0xff//关闭显示

}

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

键延时函数

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

key_time()

{

uchar k

for(k=0k<15k++)

play()

}

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

主函数

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

main()

{

uchar j

P0=0xff

P2=0xff

Count=0x00

TMOD=0x01

TH0=0x4cTL0=0x00 //50ms定时

EA=1ET0=1

while(1)

{

if(K1==0)

{

beep()

key_time()

TR0=1 //启动中断

}

if(K2==0)

{

beep()

key_time()

TR0=0 //停止中断

}

if(K4==0)

{

beep()

key_time()

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

display[j]=0x00 //计时单元清零

}

play()

}

}

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

Time0中断函数

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

void Time0(void) interrupt 1 using 0

{

TH0=0x4c //50ms定时

TL0=0x00

Count++

if(Count==2)

{

Count=0

display[0]++//0.1S

}

if(display[0]==10)

{

display[0]=0

display[1]++//个位

}

if(display[1]==10)

{

display[1]=0

display[2]++//十位

}

if(display[2]==10)

{

display[2]=0

display[3]++//百位

}

if(display[3]==10)

{

display[3]=0

display[4]++//千位

}

if(display[4]==10)

{

display[4]=0

display[5]++//万位

}

if(display[5]==10)

{

display[5]=0

display[6]++ //十万位

}

if(display[6]==10)

{

display[6]=0

display[7]++ //百万位

}

if(display[7]==10)

{

display[7]=0

}

}

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


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

原文地址: http://outofmemory.cn/yw/12303473.html

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

发表评论

登录后才能评论

评论列表(0条)

保存