㈠ 單片機 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秒的秒錶設計(單片機AT89C51)
1.要求從0-60秒計時,到60後LED發光,當從新計時是LED熄滅。
--60,保持不變?
--何時重新計時?
2.用蠢含悄定時計數器定時,用按鍵控制啟帶渣停。
--剛開機時,是啟動,還是停止?
3.若啟動後計時沒到60秒,按鍵停止後,則重新計時。
--按鍵停止後,立即就重新計時?
--是不是保持顯示,等待再次按鍵,再重新計時?
--否則,按鍵的作用,就不是停止了,而是重新計時老唯了。
4.要求用匯編語言
--這個可以辦到。
㈢ 單片機60秒計時器的程序,用AT89C51實現
//1:用AT89C51單片機的定時/計數器T0產生一秒的
//定時時間,作為秒計數時間,當一秒產生時,秒
//計數加1,秒計數到60時,自動從0開始。單片機
//晶振頻率為12MHZ
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f};
void display(uchar fen,uchar miao);
uchar a,fen,miao,shu;
void delay(uint z);
void init();
void main()
{
init();
while(1)
{
display(fen,miao);
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a++;
if(a==20)
{
a=0;
shu++;
fen=shu/10;
miao=shu%10;
if(shu==60)
shu=0;
}
}
void init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void display(uchar fen,uchar miao)
{
P1=0xFe;
P2=table[fen];
delay(5);//延時5毫秒
P1=0xFf;
P2=table[miao];
delay(5);//延時5毫秒
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
㈣ 利用單片機設計實現一個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;
}
㈤ 51單片機計時60毫秒怎麼算呀,計數周期是啥意思呀
一般51單片機的晶振頻率是fosc=12M,單片機內部計時的頻率是fosc/12 即1MHZ
因此計數周期1us
內部定時器是16位,最多 計脈沖數為65536個,因此最長定時時間是65.536 ms
要定時60 ms,需經過的脈沖個數是60000個,由於51單片機的定時器是加法計數,因此初值應該寫入(65536-60000)
這樣經過60mS後,計數器的值就是 (65536-60000)+60000=65536,剛好溢出,溢出標志位TF置1或產生中斷
定時器初值又分高8位和低8位,高8位的1代表256,因此高8位是256的倍數,低8位是256的余數
因此 C語言編程就這樣 寫:
TH0=(65536-60000)/256
TL0=(65536-60000)%256
㈥ 51單片機 匯編語言 兩個七段共陽數碼管 60S倒計時
C語言的我這里有。
以下是24倒計時的程序。你修改TABLE: 中的數據內容就可以達到你的要求的了。裡面用到了兩片7447晶元。。。
ORG 0000h
AJMP START
ORG 0030H
START: CLR P3.1 ;D1亮
JB P3.7,START ;按下K1倒計時啟動
SETB P3.1 ;D1滅
CLR P3.0 ;D2亮
MOV TMOD,#01H ;設定時器TIMER0工作在模式1
MOV DPTR,#TABLE
NEXT: MOV A,#00H
MOVC A,@A+DPTR
MOV P1,A
MOV R3,#20 ;延時1秒
LCALL DELAY
INC DPTR ;數據指針加1
CJNE A,#0FFH,NEXT
MOV P1,#0FFH
SETB P3.0
LJMP START
; ****延時0.5秒子程序****
DELAY: SETB TR0 ;起動TIMER0開始計時
AGAIN: MOV TL0,#LOW(65536-50000) ;設定時器TL0的值
MOV TH0,#HIGH(65536-50000) ;設定時器TH0的值
LOOP2: JBC TF0,LOOP3 ;判斷TF=1?,是則跳轉至LOOP3,並清除TF0
JMP LOOP2 ;TF0不為1則跳轉至LOOP2
LOOP3: DJNZ R3,AGAIN ;R3是否為0?不是則跳轉至AGAIN
CLR TR0 ;是則停止TIMER0計數
RET
;*****顯示數碼表*****
TABLE:
DB 24H,23H,22H,21H,20H,19H,18H,17H,16H,15H,14H,13H
DB 12H,11H,10H,09H,08H,07H,06H,05H,04H,03H,02H,01H
DB 0FFH ;結束碼
END
㈦ 用單片機匯編語言編寫60秒計時器!
;數碼管段選接P1口,位選接P2.0和P2.1,
;採用定時器T1定時10ms,60H為1s計數單元,計數100次為1s
ORG
0000H
;程序從0地址開始
LJMP
MAIN
;跳到MAIN處執行
ORG
001BH
;定時器T1
LJMP
TIME1
ORG
0030H
MAIN:MOV
TMOD,#01H
;設置T1工作在模式1
MOV
TH1,#068H
;賦初值,定時10ms
MOV
TL1,#0F0H
MOV
IE,#88H
;開CPU中斷,開定時器1中斷
SETB
TR1
;啟動T1定時器工作
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
P1,A
;由P1口輸出A的內容
SETB
P2.0
;置位P2.0
CLR
P2.0
;清零P2.0
MOV
A,B
MOVC
A,@A+DPTR
;根據A的值取出編碼表中的編碼
MOV
P1,A
;由P1口輸出A的內容
SETB
P2.1
;置位P2.1
CLR
P2.1
;清零P2.1
JNB
4FH,DISPLAY
;判斷1秒時間是否到,沒有到,則跳轉到DIAPLAY處
CLR
4FH
;1秒到,清4FH
LJMP
DISPLAY
;調用顯示子程序
TIME1:MOV
TH1,#068H
;賦初值
MOV
TL1,#0F0H
DJNZ
60H,TT
;60H單元自減1,判斷是否為0,不為0則跳轉到TT處
MOV
60H,#100
;60H單元為0,則重新給其賦值100
SETB
4FH
;同時置位4FH單元
INC
R3
;R3自加1
CJNE
R3,#60,TT
;判斷R3是否為60,否則跳轉TT處
MOV
R3,#0
;R3為60,則給R3賦0
TT:RETITAB:
;編碼表
DB
0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
;編碼
END
;程序結束
㈧ 用單片機的定時/計數器實現60s倒計時,並用兩位數碼管靜態顯示倒計時秒值;
請問靜信枝態顯滑顫敏示能顯洞含示兩位數字嗎??
下面是電路圖:
㈨ 怎樣用單片機c語言實現60秒倒計時
這個很簡單的嘛。。自己看看書多做做就知道了。。像這樣簡單的都來問的話,那你工作的話就基本上完全是不會了。。
跟你提個思路吧,首先是,定義一個變數,用來保存初值60,然後進行定時器初始化,開啟定時器中斷,打開全部中斷。然後就是在定時器中斷處理函數裡面進行計數了,,當計時滿一秒的時候,就將最開始的初值為60的變數,進行減一操作。然後在主函數裡面進行顯示就可以了。。
㈩ 52單片機不用定時中斷如何實現60S秒錶功能
#include<reg52.h>
sbit AA=P0^7;//數碼管顯示用IO埠
sbit BB=P0^6;
sbit CC=P0^5;
sbit DD=P0^4;
sbit K1=P3^2;
sbit K2=P3^5;
sbit K3=P3^7;
int s,m;
char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};
void YS(int x); //延遲函數聲明
void XS(int d); //顯示函數聲明
void main()
{
s=m=0;
TMOD=0x01;//設置定時器工作方式
TH0=(65536-1000)/256;//1毫秒
TL0=(65536-1000)%256;//定時器裝初始值
EA=1;//開總中斷
ET0=1;//開定時器 0 的中斷
while(1)
{
XS(s); //顯示
if(K1==0){ TR0=1; }//開啟定時侍嘩者器,開始計時
if(K2==0){ TR0=0; }//關閉定時器,暫停計時
if(K3==0){ s=m=0; }//清空數據
}
}
void YS(int x) //延遲子函數
{
int y;
for(;x>0;x--)
for(y=100;y>0;y--);
}
void XS(int d) //顯老薯示子函數
{
char d1,d2,d3,d4;
d4=d%10; //取個位 %求余
d3=(d/10)%10; //取十蘆春位
d2=(d/100)%10;
d1=(d/1000)%10;
P2=table[d4]; AA=0; YS(1); AA=1;//個位顯示
P2=table[d3]; BB=0; YS(1); BB=1;//十位顯示
P2=table[d2]; CC=0; YS(1); CC=1;//百位顯示
P2=table[d1]; DD=0; YS(1); DD=1;//千位顯示
}
void timer() interrupt 1 //中斷處理子函數
{
TH0=(65536-922)/256;//1毫秒
TL0=(65536-922)%256;
m++;
if(m>=10) //判斷定時是否到達1s 即 1000 ms
{ m=0; s++; }
if(s>=9999) //判斷定時是否到達1s 即 1000 ms
{ s=0; }
}
絕對可用的,你試試吧,可能我的程序埠與你的不一樣,自己改一下就可以了