『壹』 單片機 60秒倒計時
我是用匯編語言做的,如果顯示的速度不理想 你改下延時程序段的數值就OK了,課堂上這個60S倒計時的課題用了很多方法做過
ORG 0000H
LJMP START
ORG 0100H
START:MOV R0, #59
MOV DPTR, #TABLE
LOOP:LCALL DISPLAY
DEC R0
CJNE R0,#0,LOOP
JMP START
DISPLAY:MOV A, R0
MOV B, #10
DIV AB
MOV R1, A
MOV R2, B
MOV R3, #50
LOOP1:MOV A, R2
LCALL CHANG
CLR P2.6
LCALL DLY10MS
SETB P2.6
MOV A, R1
LCALL CHANG
CLR P2.7
LCALL DLY10MS
SETB P2.7
DJNZ R3, LOOP1
RET
CHANG:MOVC A, @A+DPTR
MOV P0, A
RET
DLY10MS:MOV R6, #256
D1:MOV R7, #256
NOP
NOP
NOP
NOP
DJNZ R7, $
DJNZ R6, D1
RET
TABLE:DB 28H,7EH,0A4H,64H,72H,61H,21H,7CH,20H,60H
END
『貳』 請幫忙寫一個程序:單片機控制液晶顯示器60秒倒計時(C語言)
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^5;
sbit RW=P2^6;
sbit EN=P2^7;
uchar code temp[]="00";
uint aa,ee,date1;
void delay(uint aa)
{
uint bb,cc;
for(bb=0;bb<aa;bb++)
for(cc=0;cc<100;cc++);
}
void write_ling(uint com)
{
RS=0;
P0=com;
delay(5);
EN=1;
delay(10);
EN=0;
}
void write_shuju(uint shuju)
{
RS=1;
P0=shuju;
delay(5);
EN=1;
delay(10);
EN=0;
}
void inite() //中斷、1602初始化
{
TMOD=0x01;
TH0=(65536-46080)/256;
TH0=(65536-46080)%256;
EA=1;
ET0=1;
TR0=1;
RW=0;
EN=0;
date1=60;
write_ling(0x38);
write_ling(0x0c);
write_ling(0x06);
write_ling(0x80);
write_ling(0x01);
write_ling(0x80+7);
for(aa=0;aa<2;aa++)
{
write_shuju(temp[aa]);
delay(5);
}
}
void display(uint date)
{
uint ge,shi;
ge=date%10;
shi=date/10;
write_shuju(0x30+shi);//0x30--0x39對應的是1602顯示0--9的ASCLL碼值
write_shuju(0x30+ge);
}
void timer0() interrupt 1
{
TH0=(65536-46080)/256;//11.0592MHZ晶振50Ms
TH0=(65536-46080)%256;
ee++;
if(ee==14)//加上前面延時子函數的延時, 在我的板子上ee=14的時候大概就是一秒鍾
{
ee=0;
date1--;
if(date1==0)
{
date1=60;
}
write_ling(0x80+7);
display(date1);
}
}
void main()
{
inite();
while(1);
}
小弟不才,希望這個程序對你有幫助!
『叄』 51單片機匯編語言倒計時60秒循環程序
可以在SJMP $這里改成判斷R2是不是為0,如是就重新載入60…如果不是就跳回重新判斷R2
『肆』 求教,利用51單片機編寫兩個數碼管60秒倒計時,個位是從5開始計時之後才是9開始倒計時,十位顯示不
如樓上所說,你沒有初始化num這個參數,那麼默認值就是0,也相當於256,所以一開始進入中斷就是256-1,也就是255,個位是5,十位數是25,所以顯示就成了你現在的模樣。因此初始化以下就好了。
『伍』 單片機六十秒倒計時程序
;數碼管段選接P2口,位選接P3.0和P3.1,
;採用定時器T0定時10ms,60H為1s計數單元,計數100次為1sORG 0000H ;程序從0地址開始
LJMP MAIN ;跳到MAIN處執行
ORG 000BH ;定時器T0
LJMP TIME0
ORG 0030H
MAIN:MOV TMOD,#01H ;設置T0工作在模式1
MOV TH0,#0D8H ;賦初值,定時10ms
MOV TL0,#0F0H
MOV IE,#82H ;開CPU中斷,開定時器0中斷
MOV R3,#60
SETB TR0 ;啟動T0定時器工作
MOV 60H,#100 ;給60H單元賦初值
CLR 4FH ;清零4FH單元
DISPLAY: ;顯示子程序
MOV DPTR,#TAB ;DPTR指向編碼表位置
MOV A,R3 ;將R3的內容復制到A
MOV B,#10
DIV AB ;A除B,商給A,余數給B
MOVC A,@A+DPTR ;根據A的值取出編碼表中的編碼
MOV P2,A ;由P1口輸出A的內容
CLR P3.0 ;清零P2.0
SETB P3.0 ;置位P2.0 MOV A,B
MOVC A,@A+DPTR ;根據A的值取出編碼表中的編碼
MOV P2,A ;由P1口輸出A的內容
CLR P3.1 ;清零P2.1
SETB P3.1 ;置位P2.1
JNB 4FH,DISPLAY ;判斷1秒時間是否到,沒有到,則跳轉到DIAPLAY處
CLR 4FH ;1秒到,清4FH
LJMP DISPLAY ;調用顯示子程序 TIME0:MOV TH0,#0D8H ;賦初值
MOV TL0,#0F0H
DJNZ 60H,TT ;60H單元自減1,判斷是否為0,不為0則跳轉到TT處
MOV 60H,#100 ;60H單元為0,則重新給其賦值100
SETB 4FH ;同時置位4FH單元
DEC R3 ;R3自加1
CJNE R3,#00H,TT ;判斷R3是否為0,否則跳轉TT處
CLR TR0
TT:RETI
TAB: ;編碼表
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;共陰
END ;程序結束
『陸』 利用單片機設計實現一個60秒倒計時顯示裝置,並且計時到後發出報警聲音。
#include<reg52.h>
sbitbz=P3^1;
unsignedchara[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90};
unsignedcharn,time=60;
main()
{
P1=a[0];
P2=a[6];
TMOD=0X01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
TR0=1;
while(1);
}
timer0()interrupt1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
if(time!=0)
{
n++;
if(n==100)
{
n=0;
time--;
P1=a[time%10];
P2=a[time/10];
}
}
elsebz=~bz;
}
『柒』 單片機實現60秒倒計時 求教
寫程序最好不要出現超過1ms的死延時,特別是在普通8位單片機的編程,需要時間的地方盡量用定時器來做,單片機運行效率高
『捌』 單片機60秒倒計時程序怎麼寫啊!!!這個圖的!!!急用啊!!!!
/*代碼你可以參考一下,晶振按11.059200MHz寫的。
提示一下,按你這模擬是不能做實物的,要加上限流電阻*/
#include"reg52.h"
unsignedcharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//共陽數碼管段選
voidmain()
{
TMOD=0x01;
TH0=0xFC;
TL0=0x66;
EA=1;
ET0=1;
TR0=1;
while(1);
}
voidTimer0Interrupt(void)interrupt1
{
staticunsignedinti=0;
staticchartime=60;
TH0=0xFC;
TL0=0x66;
P3=table[time%10];
P2=table[time/10];
i++;
if(i>=1000)
{
i=0;
time--;
if(time<0)
{
time=60;
}
}
}
『玖』 小白求救,51單片機利用兩個數碼管實現60秒倒計時
個位數能夠顯示正常,那麼就說明十位數的處理代碼出了問題;
給出代碼看看吧