導航:首頁 > 操作系統 > 單片機60s倒計時c

單片機60s倒計時c

發布時間:2022-09-27 12:58:56

Ⅰ 求C51單片機匯編語言控制兩位數碼管60秒倒計時的程序,最好能說明下思路

#include <at89x52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define seg P0
#define sw P2
int tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
int dis[]={0,0};
uint X;
uchar Count=0;
uchar sec=60;
void display()
{
int a;
int m=0x01;
dis[0]=sec/10;
dis[1]=sec%10;
for(a=0;a<2;a++)
{
seg=0xff;
seg=tab[dis[a]];
sw=m;
m=_crol_(m,1);
}
}
void TINT0() interrupt 1
{
TL0=-50000%256;
TH0=-50000/256;
if(++Count==20)
{
if(sec>0)sec--;
Count=0;
}
}
void Main()
{
TMOD=0x01;
EA=1;
ET0=1;
TR0=1;
TL0=-50000%256;
TH0=-50000/256;
while(1)
{
if(sec==0)sec=60;
display();
}

}

Ⅱ 關於51單片機60秒倒計時的c語言程序,delay和dispiay部分分別什麼意思啊,具體點

delay(int t)這個是延時子程序,如果採用20M晶振的話,調用一次延時t毫秒。
display()是數碼管動態掃描顯示子程序,位控位為P3.0、P3.1,段碼控制為P1。掃描間隔時間為5毫秒左右。

Ⅲ 小白求救,51單片機利用兩個數碼管實現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秒倒計時程序怎麼寫啊!!!這個圖的!!!急用啊!!!!

/*代碼你可以參考一下,晶振按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 51單片機六十秒倒計時

0位?就定時器里做一個1秒的定時,然後每秒對計數變數減一次,把這個計數變數送去顯示就好了.
懂事電子設計 Vgz

Ⅶ 51單片機如何使外部中斷顯示60秒倒計時求程序,謝謝。

ORG00H;
SJMPSTAR;
ORG1BH;
SJMPTIS;轉T1中斷服務程序
ORG30H;
STAR:MOVR2,#60H;倒計時初值
MOVR4,#20H;定時中斷溢出計數器
MOVIE,#88H;開中斷
MOVTMOD,#10H;
MOVTH1,#3CH;定時初值
MOVTL1,#0B0H;定時初值
SETBTR1;啟動
ACALLDIS;調用顯示子程序
SJMP$;
TIS:MOVTH1,#3CH;
MOVTL1,#0B0H;
DJNZR4,T1S1;定時1S到否
MOVR4,#20;到1S,重置R4=20
DJNZR2,T1S0;倒計時遞減
CLRTR1;倒計時結束,關定時器
T1S0:ACALLDIS;調顯示
T1S1:RETI;中斷返回
SEG7:INCA;A的值加一
MOVCA,@A+PC;取顯示斷段
RET;;
DB0C0H,0F9H,0A4H,0B0H;;0至3的共陽型顯示碼
DB99H,92H,82H,0F8H;;4至7的共陽型顯示碼
DB80H,90H,88H,83H;8至B的共陽型顯示碼
DB0C6H,0A1H,86H,8EH;;C至F的共陽型顯示碼
DIS:MOVA,R2;;單位元組十六進制數轉為十進制數
MOVB,#10;
DIVAB;
ACALLSEG7;
MOVP1,A;;顯示十位
MOVA,B;;
ACALLSEG7;;
MOVP2,A;;顯示個位
RET;;子程序返回
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);
}

小弟不才,希望這個程序對你有幫助!

Ⅸ 求用單片機c語言編寫的倒計時60s程序,為什麼在百度上找的程序驗證了現象不對

嘎嘎嘎,剛好寫過

60秒倒計時程序
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar temp,,shi,ge,num;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint);
void main()
{
temp=60;
num=0;
P2=0x00;

TMOD=0x01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1;
ET0=1;
TR0=1;

while(1)
{
shi=temp/10;
ge=temp%10;

P0=table[shi];
P2=0x02;
delay(5);

P0=table[ge];
P2=0x01;
delay(5);

}
}

void T0_time()interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num++;
if(num==40)
{
num=0;
temp--;
if(temp==0)
{
temp=60;
}
}
}

void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);

}

Ⅹ 單片機 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

閱讀全文

與單片機60s倒計時c相關的資料

熱點內容
bs刷裝備建立後文件夾沒有 瀏覽:77
找漫畫看應該下載什麼app 瀏覽:182
如何在vps上搭建自己的代理伺服器 瀏覽:744
nginxphp埠 瀏覽:403
內臟pdf 瀏覽:152
怎麼看雲伺服器架構 瀏覽:85
我的世界國際服為什麼登不進伺服器 瀏覽:996
微盟程序員老婆 瀏覽:930
intellij創建java 瀏覽:110
java連接odbc 瀏覽:38
啟動修復無法修復電腦命令提示符 瀏覽:359
手機編程是什麼 瀏覽:98
山東移動程序員 瀏覽:163
蘇州java程序員培訓學校 瀏覽:479
單片機液晶驅動 瀏覽:856
魔拆app里能拆到什麼 瀏覽:132
新預演算法的立法理念 瀏覽:146
wdcpphp的路徑 瀏覽:136
單片機p0口電阻 瀏覽:927
瀏覽器中調簡訊文件夾 瀏覽:596