Ⅰ 已知單片機晶振頻率為12MHZ 定時要求10MS 寫出初始化程序
TMOD=0X01;//定時器0工作方式1
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
ET0=1;//允許中斷
EA=1;//開總中斷
TR0=1;//啟動定時器
Ⅱ 51單片機十秒簡易計時器
因為樓主說,(不要太大面積修改)。
所以,就沒有敢進行大面積的修改。
只簡單的改改,未必能好用,僅供參考:
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[] = {
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
sbit key1=P2^7;
sbit key2=P2^6;
sbit weiH=P3^0;
sbit weiM=P3^1;
sbit weiL=P3^2;
uint num=0,ge=0,shi=0,fen=0,k;
//num用來計數,ge為各位顯示,shi為十位顯示,fen為分鍾顯示
void delayms(uint xms) //i=xms即延時約xms毫秒
{
uint i,j;
for(i=xms;i>0;i--) for(j=110;j>0;j--);
}
uchar key1scan()
{
if(key1==0) {
delayms(10);
if(key1==0) {
while(!key1) showtime();//等待釋放期間,也進行顯示
return 1;
}
}
return 0;//添上了返回值
}
uchar key2scan()
{
if(key2==0) {
delayms(10);
if(key2==0) {
while(!key2) showtime();
return 1;
}
}
return 0;//添上了返回值
}
void showtime() //時間顯示
{
//這里去掉了while(1) ,避免了死循環
P1=0xff; weiL=1; P1=table[ge]; delayms(5); weiL=0;//顯示秒的個位
P1=0xff; weiM=1; P1=table[shi]; delayms(5); weiM=0;//顯示秒的十位
P1=0xff; weiH=1; P1=table[fen]; delayms(5); weiH=0;//顯示分鍾,
}
Ⅲ 1、 已知單片機的晶振為12M,請以子函數形式寫出10毫秒延時程序。該怎麼寫啊用C語言寫。
下面有你要的 選一個吧
下面幾個是單片機的延時程序(包括asm和C程序,都是我在學單片機的過程中用到的),在單片機延時程序中應考慮所使用的晶振的頻率,在51系列的單片機中我們常用的是11.0592MHz和12.0000MHz的晶振,而在AVR單片機上常用的有8.000MHz和4.000MH的晶振所以在網上查找程序時如果涉及到精確延時則應該注意晶振的頻率是多大。
軟體延時:(asm)
晶振12MHZ,延時1秒
程序如下:
DELAY:MOV 72H,#100
LOOP3:MOV 71H,#100
LOOP1:MOV 70H,#47
LOOP0:DJNZ 70H,LOOP0
NOP
DJNZ 71H,LOOP1
MOV 70H,#46
LOOP2:DJNZ 70H,LOOP2
NOP
DJNZ 72H,LOOP3
MOV 70H,#48
LOOP4:DJNZ 70H,LOOP4
定時器延時:
晶振12MHZ,延時1s,定時器0工作方式為方式1
DELAY1:MOV R7,#0AH ;;晶振12MHZ,延時0.5秒
AJMP DELAY
DELAY2:MOV R7,#14H ;;晶振12MHZ,延時1秒
DELAY:CLR EX0
MOV TMOD,#01H ;設置定時器的工作方式為方式1
MOV TL0,#0B0H ;給定時器設置計數初始值
MOV TH0,#3CH
SETB TR0 ;開啟定時器
HERE:JBC TF0,NEXT1
SJMP HERE
NEXT1:MOV TL0,#0B0H
MOV TH0,#3CH
DJNZ R7,HERE
CLR TR0 ;定時器要軟體清零
SETB EX0
RET
C語言延時程序:
10ms延時子程序(12MHZ)
void delay10ms(void)
{
unsigned char i,j,k;
for(i=5;i>0;i--)
for(j=4;j>0;j--)
for(k=248;k>0;k--);
}
1s延時子程序(12MHZ)
void delay1s(void)
{
unsigned char h,i,j,k;
for(h=5;h>0;h--)
for(i=4;i>0;i--)
for(j=116;j>0;j--)
for(k=214;k>0;k--);
}
200ms延時子程序(12MHZ)
void delay200ms(void)
{
unsigned char i,j,k;
for(i=5;i>0;i--)
for(j=132;j>0;j--)
for(k=150;k>0;k--);
}
500ms延時子程序程序: (12MHZ)
void delay500ms(void)
{
unsigned char i,j,k;
for(i=15;i>0;i--)
for(j=202;j>0;j--)
for(k=81;k>0;k--);
}
下面是用了8.0000MHZ的晶振的幾個延時程序(用定時0的工作模式1):
(1)延時0.9MS
void delay_0_9ms(void)
{
TMOD=0x01; /*定時器0工作在模式1下(16位計數器)*/
TH0=0xfd;
TL0=0xa8;
TR0=1; /*啟動定時器*/
while(TF0==0);
TR0=0;
}
(2)延時1MS
void delay_1ms(void)
{
TMOD=0x01; /*定時器0工作在模式1下(16位計數器)*/
TH0=0xfd;
TL0=0x65;
TR0=1; /*啟動定時器*/
while(TF0==0);
TR0=0;
}
(3)延時4.5ms
void delay_4_5ms(void)
{
TMOD=0x01; /*定時器0工作在模式1下(16位計數器)*/
TH0=0xf4;
TL0=0x48;
TR0=1; /*啟動定時器*/
while(TF0==0);
TR0=0;
}
Ⅳ 如何利用單片機匯編指令編程實現延時10ms利用匯編指令設計多重循環編程實現20ms延時
這是調用一個延時10毫秒的延時子程序 當然,子程序的名字可以自己定 DELY1MS: 這個名字一定要與調用中出現的名字一樣,否則的話,調用的就不是這個子程序了
DELAY10MS:
MOV R2,#20
DELAY10MS1:
MOV R3,#250
DJNZ R3,$
DJNZ R3,DELAY10MS1
RET
這是調用一個延時20毫秒的延時子程序 當然,子程序的名字可以自己定 DELY1MS: 這個名字一定要與調用中出現的名字一樣,否則的話,調用的就不是這個子程序了
DELAY20MS:
MOV R2,#40
DELAY20MS1:
MOV R3,#250
DJNZ R3,$
DJNZ R3,DELAY20MS1
RET
RETRET的作用是子程序返回。調用一個子程序,當單片機執行到RET語句的時候,單片機就會返回到調用的地方並繼續向下執行。
下面給你一個常式:
閃爍燈
ORG 00H
AJMP START
ORG 30H
START:
MOV P0,#00H
LCALL DELY;調用延時子程序
MOV P0,#0FFH
LCALL DELY;調用延時子程序
AJMP START
DELY:
MOV R7,#250
DL1:MOV R6,#250
DJNZ R6,$
DJNZ R7,DL1
RET
Ⅳ 設MCS-51單片機的晶振頻率為12MHZ,試編寫10ms的延時程序(要求誤差不超過0.003ms)。
C語言程序:
#include
void main (void)
{
TMOD = 0x10;
TH1 = (-50000>>8);
TL1 = -50000;
TCON = 0x40;
IE = 0x88;
while(1);
}
void T1_int (void) interrupt 3
{
TH1 = (-50000>>8);
TL1 = -50000;
}
匯編程序如下:
ORG 0000H
AJMP MAIN
ORG 001BH
AJMP T1INT
ORG 0100H
MAIN:
MOV TMOD, #10H
MOV TH1, #HIGH(-50000)
MOV TL1, #LOW(-50000)
MOV TCON, #40H
MOV IE, #88H
AJMP $
T1INT:
PUSH ACC
MOV TH1, #HIGH(-50000)
MOV TL1, #LOW(-50000)
POP ACC
RETI
Keil C51程序設計中幾種精確延時方法
延時通常有兩種方法:一種是硬體延時,要用到定時器/計數器,這種方法可以提高CPU的工作效率,也能做到精確延時;另一種是軟體延時,這種方法主要採用循環體進行。
使用定時器/計數器實現精確延時
單片機系統一般常選用11.059 2 MHz、12 MHz或6 MHz晶振。第一種更容易產生各種標準的波特率,後兩種的一個機器周期分別為1 μs和2 μs,便於精確延時。
本程序中假設使用頻率為12 MHz的晶振。最長的延時時間可達216=65 536 μs。若定時器工作在方式2,則可實現極短時間的精確延時;如使用其他定時方式,則要考慮重裝定時初值的時間(重裝定時器初值佔用2個機器周期)。
在實際應用中,定時常採用中斷方式,如進行適當的循環可實現幾秒甚至更長時間的延時。使用定時器/計數器延時從程序的執行效率和穩定性兩方面考慮都是最佳的方案。但應該注意,C51編寫的中斷服務程序編譯後會自動加上PUSH ACC、PUSH PSW、POP PSW和POP ACC語句。
執行時佔用了4個機器周期;如程序中還有計數值加1語句,則又會佔用1個機器周期。這些語句所消耗的時間在計算定時初值時要考慮進去,從初值中減去以達到最小誤差的目的。
Ⅵ 求單片機編程:利用定時器計數器T0方式1,輸出一個是10毫秒的方波,晶震是6兆赫子
#include<reg51.h>
void main()
{
TMOD=0x01;//定時器0方式1
TH0=(65536-2500)/256;//定時器5m s中斷一次的初值
TL0=(65536-2500)%256;
EA=1;//開總中斷
IT0=1;//定時器0中斷允許
TR0=1;//啟動定時器0
P1^0=0;//輸入方波初始為低電平
while(1)
{
}
}
void timer0 interrupt 1//定時器中斷
{
TH0=(65536-2500)/256;//重新送初值
TL0=(65536-2500)%256;
P1^0~=P1^0;
}
呵呵呵 請選擇正確答案
Ⅶ 編寫8051單片機定時器的初始化程序 (1)T0作為定時,定時時間為10ms (2)T1作
首先四中模式的前三種,t0和t1完全相同。而模式3隻適合定時器t0,t0在該模式下被拆成兩個獨立的8位計數器th0,tl0,其中tl0可以為8為定時器或計數器,並且使用原來t0的一些控制位和引腳,它們是:c、—t、gate、tr0,,—int0和tf0.該模式下的th0,此時只可用作簡單的內部定時器功能,它借用原來定時計數器t1的控制位tr1和益處標准tf1,同時佔用了t1的中斷源。T0:定時模式0:TMOD=0X00;定時模式1:TMOD=0x01,;定時模式2:TMOD=0x02,:定時模式3:TMOD=0x03;TMOD寄存器從高到底:GATE|C/-T|M1|M0|GATE|C/-T|M1|M0高四位控制定時器t1,底四位控制定時器t0.其中M0、M1是控制工作模式的,C/-T是控制定時還是計數的、GATE是選通控制。這些都是基本的東西,如果你是剛開學,建議你買本教材看看。
Ⅷ 51單片機,晶振為6M請幫忙寫一個10ms的延時程序,能有詳細解釋的。因為我還不知道這個延時的時間是怎麼算
延時有很多種方法,有一種是讓單片機去做無聊的循環,
還有一種是用定時器。
我本身也是菜鳥所以只能粗略的講一下。
第一種的演算法是
晶振的周期T1=1/f; 這里f=6MHz 所以T1=1/6 us;(微秒)
單片機花12個T1去執行一個指令,
所以一個機器周期等於12個晶振周期,
T2=12*T1=2us
10ms=1000 0us
所以你要得到10ms的延時就要想辦法讓機器去做5000條「無聊的指令」
所以
DEL: MOV R5,#05H
F1: MOV R6,#05H
F2: MOV R7,#32H
F3: DJNZ R7,F3
DJNZ R6,F2
DJNZ R5,F1
RET
這種方法是用於對時間要求不高的地方,我說的是其思想,程序中可能有錯的地方
用定時器的方法我不太會就不誤人了 (補充一下就是這個是用匯編寫的,你在主程序中用ACALL DEL調用就延時了。