⑴ 编一个AT89C51单片机00 —99 秒的汇编程序,要求有循环和暂停,用两个独立数码管显示
;利用中断的99秒计时器,动态扫描两位数码管
;P0口接J3,数据端口
;P2.2接J2B端子,表示段码锁存
;P2.3接J2A端子,标志位码锁存
LATCH1BITP2.2
LATCH2BITP2.3
ORG00H
JMPSTART
ORG0BH
JMPTIM0
START:MOVR3,#00;中断循环次数
MOVR4,#0;时间初值
MOVDPTR,#TABLE
MOVSP,#40H
MOVTMOD,#01H;定时器工作方式
MOVTH0,#HIGH(65536-3800)
MOVTL0,#LOW(65536-3800);初值4MS
SETBTR0
MOVIE,#82H;开中断
TIM0:
MOVTH0,#HIGH(65536-3800)
MOVTL0,#LOW(65536-3800)
INCR3
CJNER3,#250,X1;1S
MOVR3,#0
MOVA,R4;十进制转换
MOVB,#10
DIVAB
MOV20H,B;个位
MOV21H,A;十位
INCR4
CJNER4,#100,LEDSCAN;到100则清零
MOVR4,#0
LEDSCAN:CALLSCAN;调用数码管扫描
X1:PUSHACC
PUSHPSW
CALLSCAN
POPPSW
POPACC
RETI
SCAN:
MOVA,21H
MOVCA,@A+DPTR
MOVP0,A
SETBLATCH1
CLRLATCH1
MOVP0,#11111110B;扫描子程序
SETBLATCH2
CLRLATCH2
CALLDELAY1
MOVA,20H
MOVCA,@A+DPTR
MOVP0,A
SETBLATCH1
CLRLATCH1
MOVP0,#11111101B;0代表选通该位数码管
SETBLATCH2
CLRLATCH2
CALLDELAY1
RET
DELAY:MOVR5,#50;典型延时程序
D1:MOVR6,#40
D2:MOVR7,#248
CALLSCAN
DJNZR7,$
DJNZR6,D2
DJNZR5,D1
RET
DELAY1:MOVR6,#4;扫描延时
D3:MOVR7,#248
DJNZR7,$
DJNZR6,D3
RET
TABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;共阴字码表
是用动态扫描的方法显示的,用了2个锁存器,8个数码管的。
附上电路图
⑵ 求大神写一下单片机at89c52控制秒表电路循环显示0到99的程序
我写的是共阳极,你想共阴极,自己改RXD和TDX输入电平以及P2码值就好。
根据你题目要求连接的。两个LED动态显示,交替间隔时间常量stime我设的50ms,因为我是仿真软件,间隔太短显示不出交替效果,你用板子测试的话,可以把间隔调小。
另外你题目暂停按钮连在普通引脚, 如果按钮直接连外部中断0来实现暂停会更敏感。
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define an P2
#define stime 50 //LED交替闪烁间隔时间
void init();
void pause();
sbit wei1=P3^0;
sbit wei2=P3^1;
sbit s2=P1^4;
sbit s3=P1^6;
//共阳极
void delay(uint xms);
uint g=0;
uint s=0;
uint count=0;
uint ispause=0;
void main()
{
uchar nums[10]={0xc0,0xf9,0xa4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x98};
init();
while(1)
{
if(s2==0 && ispause==0)
{
if(s2==0)
{
while(s2==0);
ispause=1;
pause();
}
}
else if(s3==0 && ispause==1)
{
if(s3==0)
{
while(s3==0);
ispause=0;
pause();
}
}
if(s==0)
{
an=nums[g];
wei1=0;
wei2=1;
}
else
{
an=nums[s];
wei1=1;
wei2=0;
delay(stime);
an=nums[g];
wei1=0;
wei2=1;
delay(stime);
}
}
}
void pause()
{
EA=~EA;
}
void init()
{
TMOD=0x02; //T0 工作模式2 自动装填8位 200us
TH0=0x38;
TL0=0x38;
EA=1;
ET0=1;
TR0=1;
}
void ct() interrupt 1
{
if(count<5000)
count++;
else
{
count=0;
if(g==9)
{
g=0;
if(s==9)
s=0;
else
s++;
}
else
g++;
}
}
void delay(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=112;j>0;j--);
}
⑶ 单片机99秒倒计时
用定时器,很简单的,我这里有个程序你可以参考一下
#include "clock.h"
void delay(uint t)
{
uint i;
while(t--)
{
/* 对于12M时钟,约延时1ms */
for (i=0;i<100;i++)
{}
}
}
void main()
{
initial();
P0=0x00;
sec=min=hour=0;
flag=1;
while(1)
{
while(flag)
{
display(0,hour/10);
display(1,hour%10);
//display(2,3);
display(3,min/10);
display(4,min%10);
//display(5,6);
display(6,sec/10);
display(7,sec%10);
flag=0;
}
}
}
void display(uchar digit,uchar num)
{
P2=0x00;
P1=n[num];
P2=m[digit];
delay(1);
}
void initial(void)
{
//--INT0的配置----------
IT0=1; // INT0为0低电平触发(为1则为下降沿触发)
EX0=1; // INT0中断开,允许INT0中断
//--T0的配置:定时器------------
TMOD = 0x11; //定时器0,1 定时,工作方式1(16位装载方式)
TH0 = 0x3c;//定时50ms,12M晶体振荡器
TL0 = 0xb0;
TR0 = 1; //允许T0中断
ET0 = 1;
EA=1; // CPU所有中断开(IE最高位MSB)
}
void timer_0() interrupt 1 using 2
{
FT0++;
if(FT0==20)
{
sec++;
FT0=0;
}
if(sec>59)
{
min++;
sec=0;
}
if(min>59)
{
hour++;
min=0;
}
if(hour>24)hour=0;
TH0 = 0x3c;//定时50ms,12M晶体振荡器
TL0 = 0xb0;
flag=1;
}
//INT0中断 由P3.2引脚产生
void int_0() interrupt 0 using 0
{
if(key1==0)hour++;
if(key2==0)hour--;
if(key3==0)min++;
if(key4==0)min--;
if(hour<0)hour=0;
if(min<0)min=0;
}
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar n[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar m[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar FT0,sec,min,hour,flag;
sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^6;
sbit key4=P3^7;
void display(uchar,uchar);
void timer_0();
void initial(void);
void int_0(); //外部中断0
⑷ 怎么用c语言写单片机89C51的程序,要写的程序是,0~99秒的秒表,到99s停止,并且有滴的一声
可根据以下程序修改:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar a , b=0;
sbit wei1=P1.0;
sbit wei2=P1.1;
//共阴数码管七段码
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77};
void Delay1ms(uint i) //1ms延时程序
{
uint j;
for(;i>0;i--)
{
for(j=0;j<164;j++)
{;}
}
}
void display( uchar a)) //显示程序
{
P0= table[a/10];//十位
wei1=1;
Delay1ms(2) ;
wei1=0;
P0= table[a%10];//个位
wei2=1;
Delay1ms(2) ;
wei2=0;
}
void main(void )//主程序
{
TMOD=0x01;// 定时器1工作方式一
ET0=1;
EA=1;
TH0=(65536-50000)/256;//定时50ms
TL0=(65536-50000)%256;
TR0=1;
while(1)
{
display(b);
}
}
//中断子程序
//因为 中断程序很短,只花不到1ms,而中断间隔50ms,完全没必要关中断
void Timer0(void) interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a++;
if(a==100)//100次是5 秒
{ a=0;b++;}
if(b==100)
{ b=0;}
}
⑸ 单片机 0-99秒表程序 求解答!!
你在中断函数里面把定时器中断和定时器给禁止了,出来的时候没有开,在中断程序里后面的两句改为tr0=1;et0=1;就会跑了,希望答案对你有帮助
⑹ 单片机两位秒表0-99
用定时器产生1秒中断,在中断里计时变量(全局)递增,大于99时,清零。
⑺ 51单片机制作一个秒表
//功能:0~99秒的简易秒表设计,两个静态数码管,定时器采用中断方式
#include"reg51.h"
#define uchar unsigned char
#define uint unsigned int
uchar count=0;//对50ms定时时间进行计数
uchar miao=0; //秒计数器
//函数名:timer_1()
//函数功能:定时器T1的中断函数,T1在工作方式1下每50秒产生中断,执行该中断函数
//形式参数:无
//返回值:无
void timer_1() interrupt 3 //T1的中断类型号为3
{
TH1=(65536-50000)/256; //重新设置T1计数初值高8位
TL1=(65536-50000)%256; //重新设置T1计数初值低8位
count++; //50ms计数器加1
if(count==20) //1s时间到
{
count=0; //50ms计数器清0
miao++; //秒计数器加1
if(miao==100)miao=0; //miao计数到100,则从0开始计数
}
}
bit b=0;
void int_0() interrupt 0
{
if(b == 0){TR1 = 0;b = 1;}
else
{
b = 0;
TR1 = 1;
}
}
void int_1() interrupt 2
{
miao=0;
count = 0;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
TR1=1;
}
//函数名:disp
//函数功能:将i的值显示在两个静态连接的数码管上
//形式参数:i,取值范围0~99
//返回值:无
void disp(uchar i)
{
uchar led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//定义0~9显示码,共阳极数码管
P1=led[i/10]; //显示i高位
P2=led[i%10]; //显示i地位
}
void main()
{
TMOD=0x10;//设置T1在工作方式1
TH1=(65536-50000)/256;//设置T1计数初值高8位,定时时间50ms
TL1=(65536-50000)%256;//设置T1计数初值低8位
ET1=1;//开放T1中断允许
EX0 = 1;
IT0 = 1;
EX1 = 1;
IT1=1;
EA=1;//开放总中断允许
TR1=1;//启动T1开始计时
while(1)
{
disp(miao);//显示秒计数器值
}
}
⑻ 用51单片机0-99位的秒表,为什么后三位也会显示比较暗的数呢
“锅派”视频看多了吧?
估计LZ说的东西,是不开启的位,也有微亮的效果。这是典型的残影,从程序看得出来,LZ应该去了解过残影,或者说,教这个程序的人,比以前增加了残影改善。但那都是乱来的,因为他根本不明白残影产生的原理。
除了残影,难道LZ就没发现,按住按键,整个显示就没了吗??这才是这个程序最致命的地方。残影,只能算个瑕疵,而这个却叫“系统崩溃”。
还有,且不论你的命名规则乱来,就说这个 ge、shi、与 temp的使用,就可以知道LZ 对C语音的掌握远远没有理解就开始乱用了。
⑼ ‘求助’用51单片机定时器实现99秒表倒计时
K1EQUP1.0
K2EQUP1.1
K3EQUP1.2
ORG0000H
LJMPMAIN
ORG000BH
LJMPT0ISR
ORG0030H
MAIN:
MOVTMOD,#01H
MOVTH0,#HIGH(65536-10000)
MOVTL0,#LOW(65536-10000)
SETBET0
SETBTR0
SETBEA
MOVR0,#9
MOVR1,#9
MOVR2,#0
MOVR3,#99
CLR00H
CLR01H
LOOP:
JBK1,LP01
JNBK1,$
CLR01H
INCR3
CJNER3,#100,LOOP0
MOVR3,#0
SJMPLOOP0
LP01:
JBK2,LP02
JNBK2,$
CLR01H
CJNER3,#0,LP011
MOVR3,#99
SJMPLOOP0
LP011:
DECR3
SJMPLOOP0
LP02:
JBK3,LOOP
JNBK3,$
SETB01H
SJMPLOOP
LOOP0:
MOVA,R3
MOVB,#10
DIVAB
MOVR0,B
MOVR1,A
SJMPLOOP
T0ISR:
CLRTR0
MOVTH0,#HIGH(65536-10000)
MOVTL0,#LOW(65536-10000)
SETBTR0
MOVDPTR,#TABLE
T0C:
CPL00H
JB00H,T001
MOVP3,#0FDH
MOVA,R1
MOVCA,@A+DPTR
MOVP2,A
SJMPT002
T001:
MOVP3,#0FEH
MOVA,R0
MOVCA,@A+DPTR
MOVP2,A
T002:
JNB01H,T0E
INCR2
MOVA,R2
CJNEA,#100,T0E
MOVR2,#0
MOVA,R0
JZT003
DECR0
SJMPT0E
T003:
MOVA,R1
JZT004
DECR1
MOVR0,#9
T0E:
RETI
T004:
CLR01H
MOVR4,#16
T005:
CPLP0.0
LCALLDELAY
DJNZR4,T005
RETI
DELAY:
MOVR6,#200
DLY:
MOVR7,#250
DJNZR7,$
DJNZR6,DLY
RET
TABLE:;共阴极数码管显示代码表
DB3FH,06H,5BH,4FH,66H;01234
DB6DH,7DH,07H,7FH,6FH;56789
END
⑽ 单片机秒表
用定时器加数码管做就可以了吧