写一个关于定时器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中断的程序这样为什么错了等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)