Ⅰ 用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;//读取时间