
display(second)子函数与两个数码管的连接方式有关
void main(void )//主程序
{
TMOD=0x01;// 定时器1工作方式一
ET0=1;
EA=1;
TH0=(65536-10000)/256;//定时10ms
TL0=(65536-10000)%256;
TR0=0;//上电先不启动
while(1)
{
if(key1==0)//判断按键是否按下
{
Delay1ms(10);//延时消抖
if(key1==0)
{
while(key1==0);//等待按键抬起
TR0=!TR0;//启动或停止
}
}
if(key2==0&&TR0==0)//判断按键是否按下及是否在走时
{
Delay1ms(10);//延时消抖
if(key2==0)
{
while(key2==0);//等待按键抬起
a=0; second=0;
}
}
display(second);
}
}
//中断子程序
void Timer0(void) interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
a++;
if(a==100 ) second++;
if(second==60) second=0;
}
最低位,是001s 变化一次,一秒钟,变化 100 次。
这么快,人的眼睛,分辨不出来。
只能看到一个 8。
停止时,才能看到稳定的数字。
程序如下:
#include<reg52h>
sbit P3_5 =P3^5;
unsigned char counet, m[4] = {0,0,0,0};
void display()
{
unsigned char code Tab[] = {
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char code Bit[] = {8, 4, 2, 1};
unsigned char i, j;
for (i = 0; i < 4; i++) {
P0 = Tab[m[i]]; if (i == 2) P0 &= 127;
P2 = Bit[i]; for(; j > 0; j++); P2 = 0;
}
}
void wait_key()
{
while( P3_5) display();
while(!P3_5) display();
}
main()
{
TMOD = 0x02;
IE = 0x82;
while(1) {
wait_key(); TR0 = 1; TH0 = TL0 = 6;
wait_key(); TR0 = 0;
wait_key(); m[0] = m[1] = m[2] = m[3] = 0;
}
}
void time0() interrupt 1
{
counet++;
counet %= 40;
if(!counet) {
m[0]++; m[0] %= 10;
if(!m[0]) {
m[1]++; m[1] %= 10;
if(!m[1]) {
m[2]++; m[2] %= 10;
if(!m[2]) {
m[3]++; m[3] %= 10;
}}}}
}
其实,控制秒表的启动和停止,很简单。要做秒表,一定要用定时器吧,假如用T0,那开始初始化时,不写TR0=1,先不启动。
当按一下键,再启动,TR0=1,就开始计时了。
再 按一下键,就停止,TR0=0,就不计时了。
程序好写,先 定义一个按键
sbit key=P1^1; //具体是哪个 键,你自己改
主程序中,判断按键和启动/停止
if(key==0)
{
delay(); //具体延时时间自己定
if(key==0)
{
TR0=!TR0; //每按一次,取反 一次
while(key==0);
}
}
;================================================================
;功能:本程序实现P0口的对数码管动态显示秒表的分、秒、1/100秒;
; 计时程序由中断服务程序实现,采用定时计数器T0工作方式1;
; P2口实现对数码管的片选功能
;================================================================
;==========================初始化================================
SHUCHU EQU P2 ;定义P0口为输出口
PIANXUAN EQU P1 ;定义P2口为片选口
MIAO EQU 30H
FEN EQU 31H
MIAO0 EQU 32H
SHUZI EQU 33H
C_0 BIT 20H0
;======================系统程序开始==============================
ORG 00H
LJMP START
ORG 03H
LJMP ON_OFF
ORG 0BH
LJMP T0_1
ORG 13H
LJMP RESET
ORG 30H
START:
CALL INIT
SETB C_0
MOV MIAO,#00
MOV MIAO0,#00
MOV FEN,#00
MOV DPTR,#TAB
MOV R2,#5
MAIN:
JNB C_0,$
CLR C_0
LL: CALL DISPLAY
CALL SHIJIAN
JMP MAIN
;========================时间子程序=============================
;输入:"30H、31H、32H"
;输出:无
;实现的功能:分、秒、百分之秒的计算。
;===============================================================
SHIJIAN:
DJNZ R2,TIAOCHU
MOV R2,#5
INC MIAO0
MOV R3,MIAO0
CJNE R3,#100,TIAOCHU
MOV MIAO0,#00
INC MIAO
MOV R3,MIAO
CJNE R3,#60,TIAOCHU
MOV MIAO,#00
INC FEN
MOV R3,FEN
CJNE R3,#60,TIAOCHU
MOV FEN,#00
TIAOCHU:RET
;========================显示子程序=============================
;输入:"A"
;输出:"P2口"
;实现的功能:显示秒、分、百分之妙
;===============================================================
DISPLAY:MOV SHUZI,MIAO0
CALL JISUAN
MOVC A,@A+DPTR
MOV SHUCHU,A ;显示十位
MOV PIANXUAN,#10H ;片选
CALL DELAY
MOV PIANXUAN,#00H
MOV A,B
MOVC A,@A+DPTR
MOV SHUCHU,A ;显示个位
MOV PIANXUAN,#20H ;片选
CALL DELAY ;延时
MOV PIANXUAN,#00H
MOV SHUZI,MIAO
CALL JISUAN
MOVC A,@A+DPTR
MOV SHUCHU,A ;显示十位
MOV PIANXUAN,#04H ;片选
CALL DELAY
MOV PIANXUAN,#00H
MOV A,B
MOVC A,@A+DPTR
MOV SHUCHU,A ;显示个位
MOV PIANXUAN,#08H ;片选
CALL DELAY ;延时
MOV PIANXUAN,#00H
MOV SHUZI,FEN
CALL JISUAN
MOVC A,@A+DPTR
MOV SHUCHU,A ;显示十位
MOV PIANXUAN,#01H ;片选
CALL DELAY
MOV PIANXUAN,#00H
MOV A,B
MOVC A,@A+DPTR
MOV SHUCHU,A ;显示个位
MOV PIANXUAN,#02H ;片选
CALL DELAY ;延时
MOV PIANXUAN,#00H
RET
;========================计算子程序=============================
;输入:30H
;输出:"A和B"
;实现的功能:把33H中的数据十位和个位分离出来
;===============================================================
JISUAN:MOV A,SHUZI ;数据放在A中
MOV B,#10 ;除数放在B中
DIV AB ;商放在A中,余数放在B中
RET
;====================复位中断服务程序============================
;输入;无
;输出: 无
;实现的功能:把30H、31H、32H中的数据清零。
;================================================================
RESET:PUSH ACC
MOV 30H,#00H
MOV 3H,#00H
MOV 32H,#00H
CALL DELAY
POP ACC
RETI
;====================启停中断服务程序============================
;输入;无
;输出: 无
;实现的功能:关闭定时器
;================================================================
ON_OFF:CPL TR0
CALL DELAY
RETI
;====================定时中断0服务子程序========================
;输入:无
;输出:无
;实现的功能:实现定时20MS,影响标中断志位C_0
;===============================================================
T0_1:MOV TL0,50H ;设置定时初值
MOV TH0,51H
SETB C_0 ;定时标志位清0
RETI
;========================中断设置子程序=========================
;输入:无
;输出:无
;实现的功能:初始化设置定时器,设置初值,开中断0、中断1,定时器0
;===============================================================
INIT:MOV TMOD,#01H ;定时器0工作方式1
MOV DPTR,#65536-20000
MOV 50H,DPL
MOV 51H,DPH
MOV TL0,50H ;设置定时初值
MOV TH0,51H
MOV IE,#87H ;开定时器中断0
MOV TCON,#15H
RET
;======================延时程序==================================
;输入;无
;输出: 无
;实现的功能:延时一段时间
;================================================================
DELAY:MOV R6,#80
L7:MOV R5,#60
L8:DJNZ R5,$
DJNZ R6,L7
RET
;======================共阳查表数据==============================
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
;===========================结束=================================
END
以上就是关于AT89c51单片机程序控制两个数码管显示00-59秒表的程序要怎么编啊全部的内容,包括:AT89c51单片机程序控制两个数码管显示00-59秒表的程序要怎么编啊、利用51单片机设计一个秒表 (一定要按要求做到0.01秒)、51单片机中用数码管做秒表时怎么用一个独立按键控制开始和暂停,即第一次按下计时,在按下时暂停等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)