⑴ 單片機 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);
}
小弟不才,希望這個程序對你有幫助!
⑶ 用單片機的定時/計數器實現60s倒計時,並用兩位數碼管靜態顯示倒計時秒值;
請問靜信枝態顯滑顫敏示能顯洞含示兩位數字嗎??
下面是電路圖:
⑷ 單片機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;
}
}
}
⑸ 寫一個滿足此電路圖單片機c程序,實現60s倒計時。註:protues用到了74ls138解碼器,cd4511.
//晶振:11.0592M T1-250微秒按鍵P30 P31 P32 P33
/*變數的定義:
show_val: 顯示的值0-59
init_val: 初始值
state_val: 狀態值 0-計數狀態;1-設置狀態;2-閃爍狀態
shan_val:
key_val1: 四個按鍵的值 0-無鍵;1-設置鍵 2-增一鍵
3-減一鍵 4-確定鍵
T1_cnt: 定時器計數溢出數
cnt_val: 倒計時的數值
led_seg_code:數碼管7段碼
*/
#include "reg51.h" //包含文件
sbit P3_0=P3^0; //設置鍵
sbit P3_1=P3^1; //增一鍵
sbit P3_2=P3^2; //減一鍵
sbit P3_3=P3^3; //確定鍵
unsigned char shan_val; //閃爍時LED的開/關狀態
unsigned char cnt_val; //保存倒計數的當前值
unsigned int T1_cnt; //保存定時器溢出次數
unsigned char key_val_new,key_val_old;//存放當前掃描的鍵和前一次按下的鍵值
unsigned char state_val; //狀態值
unsigned char show_val; //存放需要在數碼管顯示的數字
unsigned char init_val; //暫存倒計數的初始值
char codeled_seg_code[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//----------延時--------------
void delay(unsigned int i) //大約延時i*2個微秒
{ while(--i);}
//-----------按鍵掃描-------------
unsigned char scan_key()
{ unsigned char i;
i=P3&0x0f;
delay(100); //延時,去抖動
if(i==(P3&0x0f))
{ if (P3_0==0)
{ while(P3_0==0); i=1; }
else
{ if (P3_1==0)
{while(P3_1==0); i=2;}
else
{ if (P3_2==0)
{while(P3_2==0); i=3;}
else
{ if (P3_3==0)
{while(P3_3==0); i=4;} }
} } }
else
{ i=0; }
return i;
EA=1;
}
//---------數碼管顯示--------------
void led_show(unsigned char v)
{
unsigned char i;
if(1) //動態掃描
{i=v/100; //取要顯示的數的個位
P0=led_seg_code[i]; //轉換為7段碼
P2=0xfb; //顯示個位
delay(15); //延時
i=(v%100)/10; //取十位
P0=led_seg_code[i]; //轉換為7段碼
P2=0xfd; //顯示十位
delay(5); //延時
i=(v%100)%10;
P0=led_seg_code[i];
P2=0xfe;
delay(5);
}
else
{P0=led_seg_code[0]; //處於閃爍狀態
if(shan_val)
{P2=0xff; } //將數碼管的關閉
else
{P2=0xfc; } //將數碼管的打開
}
}
//----------定時器T1中斷服務程序---------------
void timer1() interrupt 3 //T1中斷,250us中斷一次
{ T1_cnt++;
switch (state_val)
{case 0:
if(T1_cnt>3999) //如果計數>3999, 計時1s
{ T1_cnt=0;
if(cnt_val!=0)
{ cnt_val--;}
else
{state_val=2;} //定時計數到0時,切換狀態
show_val=cnt_val;
}
break;
case 2:
if(T1_cnt>1999) //如果計數>1999, 計時0.5s
{ T1_cnt=0; shan_val=!shan_val; } //閃爍狀態
break;
}
}
//---------主程序----------------
main()
{init_val=200; //初始化各變數
cnt_val=init_val;
show_val=cnt_val;
state_val=0;
key_val_old=0;
T1_cnt=0;
shan_val=0; //初始化51的寄存器
TMOD=0x20; //用T1計時 8位自動裝載定時模式
TH1=0x19; //250微秒溢出一次; 250=(256-x)*12/11.0592 -> x= 230.4
TL1=0x19;
EA=1; //打開總中斷允許
ET1=1; //開中斷允許
TR1=1; //開定時器T1
while(1)
{
key_val_new=scan_key(); //
255表示無鍵按下
if(key_val_new!=0)
{ // 只有當前掃描的鍵值與上次掃描的不同,才判斷是有鍵按下
//key_val_old=key_val_new;
switch (key_val_new)
{ case 1: //設置鍵
state_val=1; //處於設置狀態
TR1=0; //停止計時
show_val=init_val; //顯示原來的倒計數初始值
break;
case 2: if(state_val==1) //只有在設置狀態,增1鍵才有用
{ if (init_val>0) //更改原來的倒計數初始值
{init_val--; }
else
{init_val=200;}
show_val=init_val;//顯示更改後的倒計數初始值
}
break;
case 3: if(state_val==1) //只有在設置狀態,減1鍵才有用
{ if (init_val<200) //更改原來的倒計數初始值
{init_val++; }
else
{init_val=0;}
show_val=init_val; //顯示更改後的計數初始值
}
break;
case 4: if(state_val!=0) //如果已處於計數模式,確認鍵不起作用
{ cnt_val=init_val; //將初始值賦給計數變數
show_val=cnt_val; //將計數變數的數字顯示
TR1=1; //啟動定時器T1
state_val=0; //將狀態切換為計數模式
}
break;
}
}
led_show(show_val);
//動態掃描
}
}
⑹ 利用單片機設計實現一個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秒倒計時實現
在單片機控制系統中,實現60秒倒計時的功能是一種常見的應用場景。本文將介紹一種基於單片機的倒計時實現方法。具體實現中,我們使用了一個包含十個字元的字元表,這些字元代表了0到9這十個數字。通過這些字元,我們可以顯示倒計時的時間。
以下是實現60秒倒計時的代碼片段。代碼首先定義了一個字元表,包含十個數字對應的段碼。接著,定義了秒數和分鍾數變數。主函數中,開啟了全局中斷,設置了定時器1的中斷模式,並初始化定時器1的控制寄存器和定時初值。主循環等待中斷發生。
在中斷服務程序中,首先更新定時器1的初值,以保持定時器的准確性。然後,增加秒數。當秒數達到20時,重置秒數,並根據分鍾數進行相應的調整。最後,更新P0和P2埠,顯示當前的分鍾數和秒數。
整個倒計時過程中,定時器1的中斷周期為50毫秒,因此,每秒會產生20次中斷,從而實現了60秒倒計時的功能。通過這種方式,我們可以利用單片機實現精確的倒計時。
需要注意的是,這里的代碼片段僅用於演示目的,實際應用中可能需要根據具體的單片機型號和開發環境進行適當的修改。此外,代碼中的中斷服務程序使用了特定的中斷向量,因此在實際編寫中斷服務程序時,需要確保與單片機的中斷系統兼容。
通過這種方式,我們可以利用單片機的定時器功能,實現精確的倒計時。這種方法不僅適用於60秒倒計時,還可以根據需要調整倒計時的長度,適用於各種需要倒計時的應用場景。