当前位置:首页 » 编程语言 » c语言定时器0延时
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言定时器0延时

发布时间: 2023-01-03 00:23:22

A. 用c语言编写,单片机LED灯并用定时器延时,每隔0.5秒使LED依次点亮


#include"reg51.h"
sfrAUXR=0x8e;//如果是用的AT89C51,把这句删了
sbitled=P1^0;//定义LED为P10,可以改为其他IO
unsignedcharjishi;
voidTimer0Init(void)//50毫秒@12.000MHz
{
AUXR&=0x7F;//定时器时钟12T模式
TMOD&=0xF0;//设置定时器模式
TL0=0xB0;//设置定时初值
TH0=0x3C;//设置定时初值
TF0=0;//清除TF0标志
TR0=1;//定时器0开始计时
EA=1;//开总中断
}
voidmain()
{
Timer0Init();//初始化定时器
while(1);
}
voidtm0_isr()interrupt1//50毫秒中断一次
{
jishi++;
if(jishi>10)//中断十次之后
{
jishi=0;//重置计时
led=!led;//取反LED状态。
}

}

B. C语言 编一段定时器0延时一分钟的程序

试试用sleep函数:
函数名: sleep
功 能: 执行挂起一段时间
用 法: unsigned sleep(unsigned seconds);

C. 怎么用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;
}

D. c语言中,一般用定时器的简单的延时怎么样实现

用定时器只有中断啊,你可以弄50ms中断 100ms中断。你要简单的延迟,延迟函数就够了
delay(int x) //x毫秒延迟函数
{
int i,j;
for(i=0;i<x;i++)
for(j=0;j<110;j++); 大概是1ms,准确还是要中断
}

E. 单片机C语言延迟程序

下面的延时的基本程序(中断加计数器)
********
void
T0_int(void)
interrupt
1
{

TH0
=
0x4C;
//重新装载,50MS定时器初值

TL0
=
0x00;

T0_count++;

if(T0_count==20)
//1S到

{

T0_count
=
0;

//在这写程序

}
}
main()
{

TMOD
=
0x01;//定时器0,工作方式1,16位计数

TH0
=
0x4C;
//50MS定时器初值

TL0
=
0x00;

IE
=
0x82;
//开总中断,开T0中断

EA
=
1;

ET0
=
1;

TR0
=
1;

T0_count
=
0;

i
=
0;
loop:

goto
loop;
}
还有:
for(us=0;us<60;us++);
/*延时500us*/
for(us=0;us<1;us++);
/*
延时15微秒*/
for(us=0;us<5;us++);
/*
延时51微秒*/

F. 定时器延时问题(51单片机,c语言)

你的这两个函数void delayms(uint)和void display(uchar,uchar,uchar,uchar)我可以肯定的告诉你,没有问题。你的这个程序其实就是想显示0000~5959之间的数,而且这个数是每20秒+1顺序递增的。之所以没有任何反应,那是你的主程序没有挂起,也就是在while(1)里没有没有大括号,程序执行一次就结束了,所以你什么都看不到。应该这样
while(1)
{//加入的成对大括号

for(thou=0;thou<=5;thou++) //千位
for(hun=0;hun<=9;hun++) //百位
for(ten=0;ten<=5;ten++) //十位
for(one=0;one<=9;one++) //个位
{
while(num!=20) //循环一秒
{
display(thou,hun,ten,one);//数码管显示四个数字
}
num=0;
}
}
这样你就可以看到程序运行的结果了,但结果是这样的:四个LED显示管闪得很严重,计划是一亮一灭的,而且0000~5959这个数字几乎显示得不成样子。主要是delayms(5),这个延迟程序你应该尽量控制在20ms之内(主要是人眼残辉的时间极限),短了感觉就全亮,长了就一闪一灭。
不过我很看不惯你的这个程序,我给你一个CPU负担更小,而显示又非常好的程序供你参考:
#include<AT89X52.H>
#define uint unsigned int
#define uchar unsigned char

sbit LED4=P2^0; //数码管千分位
sbit LED3=P2^1; //数码管百分位
sbit LED2=P2^2; //数码管十分位
sbit LED1=P2^3; //数码管个分位

uchar ms20,s1;//20毫秒和1s变量定义(声明)

//定时器T0初始化,10ms秒初值
void InitTimer0(void)
{
TMOD=0x01;
TH0=0x0D8;
TL0=0x0F0;
EA=1;
ET0=1;
TR0=1;
}

void Display(uchar dat4,uchar dat3,uchar dat2,uchar dat1)
{
static uchar k;
P2=P2|0xf0;
switch(k++)
{
case 0:
P0=dat4;
LED4=1;
break;

case 1:
P0=dat3;
LED3=1;
break;

case 2:
P0=dat2;
LED2=1;
break;

case 3:
P0=dat1;
LED1=1;
break;

default:k=0;return;
}
}

void Timer0(void) interrupt 1//1ms中断
{
TH0=0x0D8;
TL0=0x0F0;
ms20++;
s1++;
}

void Main(void)
{
uchar thou,hun,ten,one;
InitTimer0();
while(1)
{
if(s1>=100)//每1秒钟one+1
{
s1=0;
if(one++>=9)
{
one=0;
if(ten++>=5)
{
ten=0;
if(hun++>=9)
{
hun=0;
if(thou++>=5) thou=0
}
}
}
}
if(ms20==2)//每20毫秒调用一次显示函数
{
Display(thou,hun,ten,one);
ms20=0;
}
}
}

G. 单片机C语言编程关于延时函数

单片机的C语言关于延时函数主要有两种
一种是用for循环,通过单片机执行空指令达到延时的目的
如:
for(i=0;i<100;i++)
{
;
}
这个简单的语句会执行100次空指令
每一次指令的时间可以大概确定
因此这个是最简单的延时函数
第二种是通过定时器的方式来实现
定时器是通过对单片机的晶振进行计数
然后在定时器中断服务函数里面实现定时时间的计算及设置
51单片机的定时器0中断服务函数为
void
time0()
interrupt
1
{
...
}