定时器初始化程序 51单片机的C语言是什么

定时器初始化程序 51单片机的C语言是什么,第1张

写一个关于定时器0的初始化子函数给你,加上注释\x0d\void timer0() interrupt 1\x0d\{\x0d\TMOD=0X01;//选择定时器0\x0d\TH0=(65536-50000)/256;//装入50MS的初值\x0d\TL0=(65536-50000)%256;\x0d\EA=1;//打开总中断\x0d\ET0=1;//打开定时器0中断\x0d\TR0=1;//开启定时器0\x0d\}

#include

<reg51h>

#define

uchar

unsigned

char

sbit

LED=P1^0;

uchar

time;

void

InitTimer0(void)

{

TMOD

=

0x01;

//定时器0,工作方式1

TH0

=

0x3c;

TL0

=

0xb0;

//50ms中断一次

EA

=

1;

ET0

=

1;

TR0

=

1;

}

void

main(void)

{

InitTimer0();

while(1);

//

分号,表示在此一直循环执行,等待中断。相当于汇编的

AJMP

$

}

void

Timer0Interrupt(void)

interrupt

1

{

TH0

=

0x3c;

TL0

=

0xb0;

time++;

if(time==20)

//中断20次,1s

{

time=0;

LED=!LED;

//P10上的LED1s亮灭一次

}

}

定时器的初始化要放前面,为什么你打开外部中断的使能,却没打开定时器0的使能。

void Time0_Init() //定时器0

{

TH0=0xfe;

TL0=0x33;

TR0=1;

}

void main() //程序入口

{

TMOD=0x21; //定时器0和定时器1开启

PCON = 0x80;

SCON = 0x50;

TH1 = 0xfA; //设置波特率 9600

TL1 = 0xfA;

TR1 = 1; //启动定时器1

Time0_Init(); //调用定时0函数

ET1 =0; //这句多余了

ES = 1; //开串口中断

PS=1; //设计串行口中断优先级

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

EA = 1; //开总中断

//IT0=0; //这句多余了

//EX0=1; //为什么要打开外部中断??

}

void SERIAL_HANDLE(void) interrupt 4 //串口中断函数,打开了中断就必须有

{

}

void T0_HANDLE(void) interrupt 1 //定时器0中断函数,打开了中断就必须有

{

}

TMOD=0x01; //启用定时器工作模式1

TH0=(65536-50000)/256;//装定时器初值高8位,50ms中断一次

TL0=(65536-50000)%256;//装定时器初值低8位,50ms中断一次

EA=1;

ET0=1;

TR0=1;

void int0() interrupt 1 //这是中断函数

{

unsigned char i;

i++;

if(i==5)//判断是否到了505=250ms

i=0;//若到了,得清0

}

改动如下:

……

INT_SUB:

MOV TH0,#3CH;重新给定时/计数器设初值

MOV TL0,#0B0H

DJNZ R7,LOOP;判断记时次数是否够,一次50毫秒,共十次

RL A

MOV P1,A

MOV R7,#10;重新给计时循环次数赋值

LOOP:

RETI

END

这就可以了。

你这是实物电路板,还是仿真哪?

你用了定时器T0,而且写中断子程序,可是,T0却没有开中断哪。

加一行

ET0=1; //要加这一行

你的程序还有其它的问题,修改后的程序发在下面,并有仿真图。

#include <reg51h>

#include <intrinsh>

unsigned char code LED7Code[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,//0-9字模

0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳极7段数码管A-F字模,原来的是错误的

unsigned char num,temp;

void system_init()

{

EA=1; //开中断总开关

ET0=1;//加一行,开定时器T0中断

TMOD=0x01; //定时器0方式1

TH0=(65535-50000)/256; //定时50ms

TL0=(65535-50000)%256;

num=0;

temp=0;

TR0=1; //开定时器0

P0=LED7Code[num]; //不能是num++

}

void main()

{

system_init(); //参数初始化

while(1)

{

 if(temp==20) //定时1s,刷新数码管数字显示

{

temp=0; //标志位置零,计数程序修改后是这样的

num++; //原来的写法有问题

if(num>15)

num=0;

P0=LED7Code[num]; //显示字符,不能是num++

}

}

}

void Time() interrupt 1 using 1     //中断函数

{

  TH0=(65535-50000)/256; //定时50ms

  TL0=(65535-50000)%256;

temp++;

}

你用定时器响025秒静音025秒那就设置定时器025秒然后beep=~bepp;就能实现了

TH0=(65535-25000)/256;

TL0=(65535-25000)%256;

unsigned char count;这个用来累积定时器次数的进中断就++,+够10次就是025秒了,就翻转一次beep

以上就是关于定时器初始化程序 51单片机的C语言是什么全部的内容,包括:定时器初始化程序 51单片机的C语言是什么、求用C编写一个51单片机的延时函数,用T0定时器。、51单片机同时开启串口中断和定时器0中断的程序这样为什么错了等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9686805.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存