『壹』 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;
『貳』 求51單片機語言用動態顯示設計0-60秒的計時器程序,原理圖如圖。
紅圈是有問題,改如下:
w1=1;w0=1;delay(1);
w1=0;P0=table(shi);delay(2);
w1=1;w0=0;P0=table(ge);delay(2);
『叄』 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單片機用定時器做動態顯示,從數字0閃爍到60,到60之後再回到00閃爍到60再從60到0無限循環
看到你的題目,我就很溫馨,這是我的專業課,可惜當年我用的都是編程語言,現在都是c語言了,不過這個還是很好做的,用跳轉指令就可以實現
『伍』 利用51單片機動態顯示0-60秒錶
#include<reg52.h>
unsigned int s;
unsigned char key;
sbit d1=P3^7;
void delay() //動態顯示延時
{
int k;
for(k=0;k<100;k++);
}
void delay1() //去抖動延時
{
unsigned char code table[] = {
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
P2=table[s%10]; P3=0xf8; delay(); P3=0xf0;
P2=table[s/10%10]; P3=0xf4; delay(); P3=0xf0;
P2=table[s/100%10]; P3=0xf2; delay(); P3=0xf0;
P2=table[s/1000]; P3=0xf1; delay(); P3=0xf0;
}
void main()
{
TMOD = 0x01;
TH0 = (65536 - 10000) / 256;//初值,每10ms中斷一次
TL0 = (65536 - 10000) % 256;
ET0=1;
EA=1;
while(1) {
delay1();
if(!d1) {
delay1();
if(!d1) { //去抖動
while(!d1) delay1();//等待釋放
key++;
if(key == 4) key = 1;
}
}
if(key == 1) TR0 = 1;//開始計時
else if(key == 2) TR0 = 0;//停止
else s = 0;
}
}
void time0() interrupt 1 //內部中斷
{
TH0 = (65536 - 10000) / 256;
TL0 = (65536 - 10000) % 256;
s++;
if(s == 10000) s = 0;
}
『陸』 單片機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--);
}
『柒』 怎麼用51單片機的數碼管寫一個秒錶60秒程序用定時器
這個應該不難啊。定時器確定相對准確的時間,在用數碼管顯示出來,設置一個標志,滿了59自動歸零
『捌』 51單片機能延時60秒時間嗎
用定時器寫;
#include <reg51.h>
sbit led = P1^0; //間隔60秒led亮滅
void Timer0_Init()
{
TMOD = 0X01; //使用定時器0,方式1
TH0=0X3C; //定時50毫秒
TL0=0XB0;
EA = 1; //使能總中斷
ET0=1; //使能定時器0中斷
TR0=1; //啟動定時器0
}
void main()
{
Timer0_Init();
while(1);
}
void Timer0() interrupt 1
{
static unsigned int count = 0;
TH0=0X3C; //定時50毫秒
TL0=0XB0;
count++; //每中斷一次就是50毫秒,中斷1200 次就是60秒,計數1200次
if(count == 1200) //60秒後清零count,同時led的電平取反,若樓主想輸出高電平就直
{ //接把led = 1即可
count=0;
led = ~led;
}
}
『玖』 51單片機 用定時器T1控制兩位數碼管做從0計數到60的實驗,每一秒加1,可是怎都不顯示,求高手幫忙找原因
通過定時器初值可以看出單片機使用的是11.0592MHz晶振
把函數void dispiay(uchar ge,uchar shi)
改成void display(uchar shi,uchar ge)
即可編譯通過
只是函數拼寫錯誤和變數順序錯誤
『拾』 單片機開發板定時器60秒怎麼編程
#include <reg51.h>
void InitTimer0(void)
{
TMOD = 0x01;
TH0 = 0x0F6;
TL0 = 0x3C;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void main(void)
{
InitTimer0();
}
void Timer0Interrupt(void) interrupt 1
{
unsigned char num1,num2;
TH0 = 0x0F6;
TL0 = 0x3C;
num1++;
if(num1==200) //定時1s
{
num1=0;
num2++;
if(num2=60) //定時60秒
num2=0;
}
}