⑴ 編一個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
⑽ 單片機秒錶
用定時器加數碼管做就可以了吧