Ⅰ 用C語言怎麼在單片機AT89C51上編寫一個延時10秒的程序
1、十秒對於單片機來說是很長很長的時間了,單片機十秒的時間什麼事都不能做,只在跑這延時程序,那是什麼概念,用中斷的話,單片機正常運行其他程序,只是時間到了才過來處理延時以後的程序,效率不知道高了多少 。
2、常式:
//假設晶振12MHZ
#include"reg51.h"
unsignedintYSJS=0;
voidmain(void)
{
TMOD|=0X10;//定時器1工作於方式1,16位定時器
TH1=0XFF;//定時器1定時時間=500uS
TL1=0X06;
ET1=1;//使能定時器1中斷
EA=1;//開總中斷
while(1)
{
}
}
voidTIMER1(void)interrupt3//定時器1中斷函數使用默認寄存器組
{
TH1=0XFF;//定時器1定時時間=500us
TL1=0X06;
YSJS++;
if(YSJS==20000)//500uS*20000=10000000us=10s
{
P1=P1^0X01;//P1.0十秒鍾翻轉一次
YSJS=0
}
}
Ⅱ 用c語言編寫程序,用於c51單片機四位共陰數碼管顯示,顯示分秒的計時器。
/*
用proteus做的時鍾
可以顯示年月日時分秒
可調整時間
有圖
*/
#include<reg52.h>
#define ucharunsignedchar
#defineuintunsignedint
#definetimh0xee
#definetiml0x00
sbitK1=P1^0;
sbitK2=P1^1;
sbitK3=P1^2;
sbitK4=P1^3;
sbitK5=P1^4;
sbitK6=P1^5;
sbitpoit=P0^7;
uintyear=2011,year0=0;
ucharmon=6,mon0=0,day=26,day0=0,hour=23,hour0=0,min=15,min0=0,sec=0,sec0=10,temp0=0;
ucharR;
ucharcod1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchartemp[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
voiddelay(uintz)
{
uintx,y;
for(x=0;x<z;x++)
for(y=0;y<100;y++);
}
voidexter_init()
{
IT0=1;
EX0=1;
}
voidtime_init()
{
TMOD=0x01;
TH0=timh;
TL0=timl;
ET0=1;
EA=1;
TR0=1;
}
voidre_time(uchara)
{
uchari,j;
for(j=0;j<a;j++)
{ for(i=0;i<14;i++)
{
P0=cod1[temp[i]];
if(i==3||i==5||i==9||i==11) poit=0;
P2=i;
delay(1);
P2=0x0f;
}
}
}
voidsyn()
{
if(sec!=sec0)
{sec0=sec;
temp[12]=sec0/10;
temp[13]=sec0%10;}
if(year!=year0)
{year0=year;
temp[0]=year0/1000;
temp[14]=year0%1000;
temp[1]=temp[14]/100;
temp[14]=temp[14]%100;
temp[2]=temp[14]/10;
temp[3]=temp[14]%10;}
if(mon!=mon0)
{mon0=mon;
temp[4]=mon0/10;
temp[5]=mon0%10;}
if(day!=day0)
{day0=day;
temp[6]=day0/10;
temp[7]=day0%10;}
if(hour!=hour0)
{hour0=hour;
temp[8]=hour0/10;
temp[9]=hour0%10;}
if(min!=min0)
{min0=min;
temp[10]=min0/10;
temp[11]=min0%10;}
}
main()
{
exter_init();
time_init();
while(1)
{
re_time(10);
}
}
voidtxter()interrupt0
{
ucharF;
F=1;
EA=0;
while(!K6);
delay(1);
do
{ re_time(1);
if(!K1)
{
min++;
if(min>=60)min=0;
while(!K1);
}
syn();
re_time(1);
if(!K2)
{
hour++;
if(hour>=24)hour=0;
while(!K2);
}
syn();
re_time(1);
if(!K3)
{
day++;
R=(year%4==0)&&(year%100!=0);
R=(R&&(day>=29)&&(mon==2))||(!R&&(day>=30)&&(mon==2))||((mon!=2)&&(day>=31));
if(R)day=1;
while(!K3);
}
syn();
re_time(1);
if(!K4)
{
mon++;
if(mon>12)mon=1;
while(!K4);
}
syn();
re_time(1);
if(!K5)
{
year++;
if(year>9999)year=2000;
while(!K5);
}
syn();
re_time(1);
if(!K6)
{
F=!F;
while(!K6);
}
re_time(1);
syn();
re_time(1);
}while(F);
sec=0;
EA=1;
}
/*****************************************************
************定時器0函數
*******************************************************/
voidtimer()interrupt1
{
temp0++;
if(temp0>=200)
{
temp0=0;
sec++;
if(sec>=60)
{
sec=0;
min++;
if(min>=60)
{
min=0;
hour++;
if(hour>=24)
{
hour=0;
day++;
R=(year%4==0)&&(year%100!=0);
R=(R&&(day>=29)&&(mon==2))||(!R&&(day>=30)&&(mon==2))||((mon!=2)&&(day>=31));
if(R)
{
day=0;
mon++;
if(mon>=13)
{
mon=1;
year++;
}
}
}
}
}
}
syn();
TH0=timh;
TL0=timl;
}
Ⅲ 單片機C語言中while的延時時間
用KEIL軟體可以計算時間,將while的起始位置和終止位置加紅點(雙擊即可);
然後左側的SEC後面的就是執行的時間。
再給你幾個延時程序做參考:
軟體延時:(asm)
晶振12MHZ,延時1秒
程序如下:
DELAY:MOV72H,#100
LOOP3:MOV71H,#100
LOOP1:MOV70H,#47
LOOP0:DJNZ70H,LOOP0
NOP
DJNZ71H,LOOP1
MOV70H,#46
LOOP2:DJNZ70H,LOOP2
NOP
DJNZ72H,LOOP3
MOV70H,#48
LOOP4:DJNZ70H,LOOP4
定時器延時:
晶振12MHZ,延時1s,定時器0工作方式為方式1
DELAY1:MOVR7,#0AH;;晶振12MHZ,延時0.5秒
AJMPDELAY
DELAY2:MOVR7,#14H;;晶振12MHZ,延時1秒
DELAY:CLREX0
MOVTMOD,#01H;設置定時器的工作方式為方式1
MOVTL0,#0B0H;給定時器設置計數初始值
MOVTH0,#3CH
SETBTR0拍渣;開啟定時器
HERE:JBCTF0,NEXT1
SJMPHERE
NEXT1:MOVTL0,#0B0H
MOVTH0,#3CH
DJNZR7,HERE
CLRTR0;定時器要軟體清零
SETBEX0
RET
C語言延時程序:
10ms延時子程序(12MHZ)
voiddelay10ms(void)
{
unsignedchari,j,k;
for(i=5;i>0;i--)
談殲for(j=4;j>0;j--)
for(k=248;k>0;k--);
}
1s延時子程序(12MHZ)
voiddelay1s(void)
{
unsignedcharh,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)
voiddelay200ms(void)
{
unsignedchari,j,k;
for(i=5;i>0;i--)
for(j=132;j>0;j--)
for(k=150;k>0;k--);
}
500ms延時子程序程序:(12MHZ)
voiddelay500ms(void)
{
unsignedchari,j,k;
for(i=15;i>0;i--)
for(j=202;j>0;j--)
for(k=81;k>0;k--);
}
不襲侍悄過實際得到的延時會存在差異,所以最好用實驗的方法調整延時參數。
Ⅳ 51單片機 C語言 怎樣測量高電平持續的時間
假設定時器不溢出,P1.0為高電平輸入引腳:
while(P1^0==1);//等待眼前的高電平過去
while(P1^0==0);//等待下一個高電平來到
TR0=1;//啟動定時器
while(P1^0==1);//等待高電平結束
TR0=0;//關閉定時器
HIGH=TL0+TH0*256;//讀取時間