9分.59秒.99秒表c语言程序怎么写

9分.59秒.99秒表c语言程序怎么写,第1张

这是可以到9分59秒9的秒表程序,到001秒,根本无法看清楚。

KEYVAL EQU 30H

DAT  EQU 33H

SCANLED EQU 39H

CLK  EQU 77H

SEC  EQU 78H

SEC1 EQU 79H

SEC2 EQU 7AH

DOT  BIT 00H

ORG 0000H

LJMP MAIN

ORG 0003H

LJMP EXTINT0

ORG 000BH

LJMP T0ISR ;50ms定时

ORG 001BH

LJMP T1ISR ;扫描显示

ORG 0030H

MAIN:

MOV SP,#5FH

MOV TMOD,#11H

MOV TH0,#03CH

MOV TL0,#0B0H

MOV TH1,#0ECH

MOV TL1,#078H

MOV KEYVAL,#2

MOV 33H,#10H

MOV 34H,#10H

MOV 35H,#10H

MOV 36H,#10H

MOV CLK,#0

SETB IT0

SETB EX0

CLR TR0

CLR ET0

MOV R2,#0

SETB TR1

SETB ET1

SETB EA

LOOP:

MOV A,KEYVAL

LOOP1:

JNZ LOOP2 ;启动

SETB TR0

SETB ET0

SJMP LOOP

LOOP2:

DEC A

JNZ LOOP3 ;暂停

CLR TR0

CLR ET0

SJMP LOOP

LOOP3:

DEC A

JNZ LOOP ;清零

MOV 36H,#0

MOV 35H,#0

MOV 34H,#0

MOV 33H,#0

SJMP LOOP

EXTINT0:

PUSH ACC

INC KEYVAL

MOV A,KEYVAL

CJNE A,#3,EXT00

EXT00:

JC EXT01

MOV KEYVAL,#0

EXT01:

POP ACC

RETI

T0ISR:

PUSH ACC

CLR TR0

MOV TH0,#3CH

MOV TL0,#0B0H

SETB TR0

INC CLK

MOV A,CLK

CJNE A,#2,T0ISRE

MOV CLK,#0

INC 36H

MOV A,36H

CJNE A,#10,T0ISRE

MOV 36H,#0

INC 35H

MOV A,35H

CJNE A,#10,T0ISRE

MOV 35H,#0

INC 34H

MOV A,34H

CJNE A,#6,T0ISRE

MOV 34H,#0

INC 33H

MOV A,33H

CJNE A,#10,T0ISRE

MOV 33H,#0

T0ISRE:

POP ACC

RETI

T1ISR:

PUSH ACC

CLR TR1

MOV TH1,#0ECH

MOV TL1,#78H

SETB TR1

MOV DPTR,#LEDTAB

T100:

MOV R0,#DAT

MOV A,SCANLED

ADD A,R0

MOV R0,A

MOV A,SCANLED

JNZ T101

MOV P2,#01H

SETB DOT

SJMP T1DIS

T101:

DEC A

JNZ T102

MOV P2,#02H

CLR DOT

SJMP T1DIS

T102:

DEC A

JNZ T103

MOV P2,#04H

SETB DOT

SJMP T1DIS

T103:

MOV P2,#08H

CLR DOT

T1DIS:

MOV A,@R0

MOVC A,@A+DPTR

JNB DOT,T1DIS1

ORL A,#01H

T1DIS1:

CPL A

MOV P0,A

INC SCANLED

MOV A,SCANLED

CJNE A,#4,T1END

MOV SCANLED,#0

T1END:

POP ACC

RETI

LEDTAB: DB 0FCH ;"0" 00H

DB 60H ;"1" 01H

DB 0DAH ;"2" 02H

DB 0F2H ;"3" 03H

DB 66H ;"4" 04H

DB 0B6H ;"5" 05H

DB 0BEH ;"6" 06H

DB 0E0H ;"7" 07H

DB 0FEH ;"8" 08H

DB 0F6H ;"9" 09H

DB 0EEH ;"A" 0AH

DB 3EH ;"B" 0BH

DB 9CH ;"C" 0CH

DB 7AH ;"D" 0DH

DB 9EH ;"E" 0EH

DB 8EH ;"F" 0FH

DB 00H ;" " 10H

END

#include "STC12C54H"

#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=t;i>0;i--)

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

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

}

//显示子程序

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;//P33P34 P35口设为推挽输出

}

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秒

}

秒表计时器的代码

#include <stdioh>

#include <conioh>

#include <windowsh>

#include <stdlibh>

struct tm //定义时间结构体,包括时分秒和10毫秒

{

int hours,minutes,seconds;

int hscd;

}time,tmp,total; //time用以计时显示,tmp用以存储上一阶段时间,total记总时间

int cnt;

FILE fout;

//每次调用update函数,相当于时间过了10ms

void update(struct tm t)

{

(t)hscd++; //10ms单位时间加1

cnt++;

if ((t)hscd==100) //计时满1s,进位

{

(t)hscd=0;

(t)seconds++;

}

if ((t)seconds==60) //计时满一分,进位

{

(t)seconds=0;

(t)minutes++;

}

if ((t)minutes==60) //计时满一小时,进位

{

(t)minutes=0;

(t)hours++;

}

if((t)hours==24) (t)hours=0;

//delay();

Sleep(10); //Sleep是windows提供的函数,作用是暂停程序,单位毫秒,所以此处暂停10ms

}

void display(struct tm t)

{

//此处输出计时结果,\r为回车不换行,既一直在同一行更新时间

printf("%d:",(t)hours);

printf("%d:",(t)minutes);

printf("%d:",(t)seconds);

printf("%d\r",(t)hscd);

//printf("Now, press ‘e’ key to stop the clock…");

}

void time_init() //初始化时间

{

timehours=timeminutes=timeseconds=timehscd=0;

}

void get_total() //计算总时间

{

totalhscd = cnt % 100;

cnt /= 100;

totalseconds = cnt % 60;

cnt /= 60;

totalminutes = cnt % 60;

cnt /= 60;

totalhours = cnt;

}

int main()

{

char m;

time_init();

cnt = 0;

fout = fopen("timeouttxt","w");

printf("按回车键开始计时!\n");

while(1)

{

m = getch();

if(m != ‘\r’) //读入一个输入,如果是回车,那么跳出次循环

printf("输入错误,仅能输入回车键!\n");

else

break;

}

printf("已经开始计时,但是你可以按回车键以分段计时!\n");

while(1)

{

if(kbhit()) //此处检查是否有键盘输入

{

m=getch();

if(m == ‘\r’) //如果等于回车,那么计时结束,跳出循环

break;

else if(m == ‘ ‘) //如果等于空格,显示此次计时,初始化计时器

{

tmp = time; //记录上一段计时器结果

fprintf(fout,"%d:%d:%d:%d\n",tmphours,tmpminutes,tmpseconds,tmphscd); //写入文件

time_init();

printf("\n");

}

else

{

printf("输入错误,仅支持输入回车键或者空格键!\n");

}

}

update(&time); //更新计时器

display(&time); //显示计时器时间

}

tmp = time; //输出最后一次即使结果,写入文件

fprintf(fout,"%d:%d:%d:%d\n",tmphours,tmpminutes,tmpseconds,tmphscd);

get_total(); //计算总的时间,显示,并写入文件

printf("\n总时间:%d:%d:%d:%d\n",totalhours,totalminutes,totalseconds,totalhscd);

fprintf(fout,"统计时间:%d:%d:%d:%d\n",totalhours,totalminutes,totalseconds,totalhscd);

fclose(fout);

printf("已经保存到当前目录下的timeouttxt文件中按任意键结束!");

getch();

}

你把这个second的数据类型改成unsigned char second;

本身second最大计数直到60 定义成int太浪费空间

你本身定的数据TAB[]是unsigned char 类型的 放进去int类型可能会报错

你试下

//----------延迟------------

void delay()

{

unsigned int i=100;

while(i--); //这条语句等价于 while(i) { i--; }

//首先判断i是否为0,如果不为0就将i减1,然后再判断,如此循环,直到i为0执行下一条语句

}

//-----------定时器-----------

void ds0() interrupt 1

{

TH0=(65536-10000)/256; //寄存器TH0初始值,16位整数的高8位

TL0=(65536-10000)%256; //寄存器TL0初始值,16位整数的低8位

//其实定时时间确定后,这两个值都是常数,可以把他们计算出来赋值,但这样写是为了一目了然,且定时时间改变后可以直接修改10000就行了,其实用一个宏定义更方便

// #define TIME 10000

// TH0=(65536-TIME)/256;

// TL0=(65536-TIME)%256;

ti_10ms++;

if(ti_10ms>=9999)

{ti_10ms=0;} //每次中断进来后ti_10ms就加1,当等于9999即中断10000次重新赋0

}

//--------定时器初始化---------

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

EA=1;

ET0=1;

PT0=1;

TR0=0;

TMOD=0x01;

//设置定时器的工作模式等等,查看定时器的各个寄存器的每一位就知道什么意思了

以上就是关于9分.59秒.99秒表c语言程序怎么写全部的内容,包括:9分.59秒.99秒表c语言程序怎么写、用51单片机设计3位led数码显示管作秒表00.0-99.0求设计电路与c语言程序、C语言,计时器等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: https://outofmemory.cn/zz/9286389.html

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

发表评论

登录后才能评论

评论列表(0条)

保存