173 2438 5004
KEROS加密芯片——品牌直销 | 免费样品 | 技术支持
当前位置:网站首页 > 资讯中心 正文 资讯中心

单片机循环定时程序

htxw 2023-03-14 资讯中心 18 ℃

怎样用单片机定时器设计0到9秒的循环程序

#define uint unsigned int

#define uchar unsigned char

#include reg52.h

uint i;

uchar code TAB[]=[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void main(void)

{

TMOD=0x22; /*定时器0设置为工作方式2,基准定时(256-6)/1M=0.25ms*/

TH0 =6; //赋T0的预置值6,溢出4000次就是1秒钟

TL0 =6;

ET0=1; //打开定时器0中断

EA=1; //打开总中断

TR0=1; //启动定时器

while(1) //程序循环

{

P3=TAB[(i)];//p3送数

}

}

//定时器0中断

void timer0(void) interrupt 1 using 1

{

static uint t; //注意t的范围,这里涉及到C51变量取值范围这个知识点

t++;

if(t==4000) //T0的预置值6,溢出4000次就是1秒钟,晶振12MHz

{

t=0;

i++;

i=i%10;

}

}

怎么用51单片机定时1个小时 好像是循环,具体汇编程序是怎样的??

简单啊。

大致说来就是

你先开启个定时器,根据你选用的晶振,计算出你要用定时器定时的基准时间,

就假设是10毫秒吧。

然后给定时器的THx,TLx写入初值,开启中断,进行定时。

然后就等待中断。

在你响应中断的程序中,再次给单片机送入初值,

由于是10毫秒中断一次,因此我们设置几个“软件计数器”

比如每此中断,软甲计数器+1,

例如“软件计数器1”在中断程序中计数100次,则是10ms*100=1s

而“软件计数器2”在1的基础上继续计数100次,则是1S*100=100S

而“软件计数器3”在2的基础上继续计数36次,则是100S*36=3600S=1小时。

用定时器控制16路流水灯循环单片机,且定时时间可调,谢谢!

用一个定时器足以,不需要两个定时器。思路如下在主程序中显示数码管,在定时器中断函数中显示LED。里面的软件延时完全可以不要,浪费CPU的资源。让CPU在哪里等待还不如让它去干别的事。voidmain(void){uchartemp=0x1;//LED显示的初始值//一些初始化的东西while(1){Display();//数码管显示函数}}voidTimer0(void)interrupt1{uchari;//循环变量//重装定时器初值,50ms中断一次p++;if(p=20)//一秒钟改变一次状态{for(i=0;i8;i++){P1=temp;temp=1;//左移一位,流水灯}p=0;}}呵呵,这就是简单的后台任务处理思想

51单片机定时器定时 2秒灯亮 3秒灯灭,如此循环

如果想实现无限循环那就采用死循环方式,可以无限的循环如while(1){};然后设定定时器定时时间为1s(此值需要根据单片机确定是否可以设定这么大),其次,设定一个变量对时间进行计数,根据计数情况做出相应的改变,程序可以这样设定:

unsigned

char

gucledstatus

=

0x00;

//全局变量,表示灯当前的状态

0为灭,1为亮

volatile

unsigned

int

gustimecnt;

//全局变量对时间计数

int

main()

{

//增加定时器初始化并开放中断

while(1)

{

if(gucledstatus

==

0x01)

//当前为亮状态

{

if(gustimecnt

=

7200)

//两个小时时间到

{

gustimecnt

=

0x00;

//清零

gucledstatus

=

0x00;

//灯为灭状态

//此处加程序代码,控制灯为灭的状态

}

else

{

//此处加程序代码,控制灯为亮的状态,此处会重复执行,可以进行控制

}

}

else

if(gucledstatus

==

0x00)

//灯为灭的状态

{

if(gustimecnt

=

3600)

//1个小时

{

gustimecnt

=

0x00;

gucledstatus

=

0x01;

//亮状态

//增加程序代码,控制灯亮

}

else

{

//增加程序代码,控制灯灭,此处会重复执行,可以进行控制

}

}

}

return

0;

}

在中断函数中,对gustimecnt进行递增即可!

15单片机的定时器编写一秒一加的程序,从0到99一循环

#includereg52.h

#define uchar unsigned char

#define uint unsigned int

uchar num=0,a=0;

//共阴数码管七段码

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77};

void Delay1ms(uint i) //1ms延时程序

{

uint j;

for(;i0;i--)

{

for(j=0;j164;j++)

{;}

}

}

void main(void )//主程序

{

TMOD=0X01;

TH0=(65536-50000)/256;

TR0=(65536-50000)%256;

ET0=1;

EA=1;

TR0=1;

while(1)

{

if(a==20)//判断是否够1秒

{

a=0;

num++;

if(num==100)num=0;

}

display[num];

}

void timer0(void ) interrupt 1//定时器中断子程序

{

TH0=(65536-50000)/256;

TR0=(65536-50000)%256;

a++;

}

void display(uint n)//显示子程序,用锁存器,可显示4位数

{

uchar a1,a2,a3,a4;

a1=n/1000;

a2=n/100%10;

a3=n/10%10;

a4=n%10;

P0=table[a1]; //显示千位

dula=1;

dula=0;

P0=0xfe;

wela=1;

wela=0;

Delay1ms(2);

P0=table[a2]; //显示百位

dula=1;

dula=0;

P0=0xfd;

wela=1;

wela=0;

Delay1ms(2);

P0=table[a3]; //显示十位

dula=1;

dula=0;

P0=0xfb;

wela=1;

wela=0;

Delay1ms(2);

P0=table[a4]; //显示个位

dula=1;

dula=0;

P0=0xf7;

wela=1;

wela=0;

Delay1ms(2);

}

单片机循环定时程序的介绍到此就结束了,感谢您耐心阅读,谢谢。

本文标签:单片机循环定时程序

<