#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;
}
}
简单啊。
大致说来就是
你先开启个定时器,根据你选用的晶振,计算出你要用定时器定时的基准时间,
就假设是10毫秒吧。
然后给定时器的THx,TLx写入初值,开启中断,进行定时。
然后就等待中断。
在你响应中断的程序中,再次给单片机送入初值,
由于是10毫秒中断一次,因此我们设置几个“软件计数器”
比如每此中断,软甲计数器+1,
例如“软件计数器1”在中断程序中计数100次,则是10ms*100=1s
而“软件计数器2”在1的基础上继续计数100次,则是1S*100=100S
而“软件计数器3”在2的基础上继续计数36次,则是100S*36=3600S=1小时。
用一个定时器足以,不需要两个定时器。思路如下在主程序中显示数码管,在定时器中断函数中显示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;}}呵呵,这就是简单的后台任务处理思想
如果想实现无限循环那就采用死循环方式,可以无限的循环如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进行递增即可!
#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);
}
单片机循环定时程序的介绍到此就结束了,感谢您耐心阅读,谢谢。
本文标签:单片机循环定时程序