#include <reg52.h>
#define uchar unsigned char //类型重定义
#define uint unsigned int
#define ulong unsigned long //类型重定义
sbit led=P0^0;
sbit K_1= P2^0; //按键
ulong num;
void delay(uint xms) //ms级延时子程序
{ uint x,y;
for(x=xms;x>0;x--)
for(y=130;y>0;y--);}
//=================================================
void main()
{
led=1; //上电初始化,led灯不亮
delay(100);
TMOD=0x01; //设定定时器0为工作方式1
TH0=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000
TL0=(65536-50000)%256; //
(开启总中断允许);
(开启定时器中断允许);
while(1)
{
if(K_1==0)
{
while(K_1==0);
TR0=1; //启动定时器0 */
led=0; //按键1按下时灯亮
}
if(num==200)
{num=0;
(关闭定时器0);
led=1; //200*50ms后灯灭
}
}
void interrupt_timer0(void) interrupt 1
{
(关闭T0中断);
TH0=(65536-50000)/256; //装载初始值,12MHZ晶振50ms数为50000
TL0=(65536-50000)%256; //
num++;
(开启T0中断);
}
PS:自己把小括号里面的东西加上吧。我忘记是什么了,
2.单片机定时器计数器如何使用使用12MHz晶振,其机器周期为1us
欲产生5000us周期方波,只需在p1.0以2500us时间交替输出高低电平
1.T0为方式0,则M1M0=00H。使用定时功能,C/T=0,GATE=0。T1不用,其有关位设为0。因此,TMOD=00H
2.方式0为13长度计数(TL0高3位不使用),设计数初值为X,则(8192-X)*1us=2500us,得X=5692D。X=1011000111100B。因为TL0高3位不用,所以10110001-00011100B得TH0=B1H,TL0=1CH
3.由控制寄存器TCON的TR0位来控制定时的启动和停止,TR0=1启动,TR0=0停止
C语言程序如下(编译器Keil C)
#include<REG51.H>
sbit FB=p1^0;
void initial(void)
{
TMOD=0x00;
TH0=0xb1;
TL0=0x1c;
IE=0x00;
TR0=1;
}
void main(void)
{
initial();
for(;;)
{
while(!TF0);
TF0=0;
FB=!FB;
}
}
汇编程序如下
ORG 0000H
AJMP START
ORG 30H
START: MOV P1.0,#0FFH
MOV TMOD,#00H
MOV TH0,#0B1H
MOV TL0,#1CH
SETB TR0
LOOP: JBC TF0,NEXT
LJMP LOOP
NEXT: CPL P1.0
MOV TH0,#0B1H
MOV TL0,#1CH
LJMP LOOP
END
3.51单片机的3个定时器怎样使用51单片机只有T0,T1。52才有T2的。
定时器设置方法:
做定时用一般采用16位模式,也就是TMOD=0x11(10或01单独一个定时器的话),初值的计算是这样的:
1. 假设时间是X毫秒,晶振为YMhz,那么:
THn=(65536-1000*X*Y/12)/256
TLn=(65536-1000*X*Y/12)%256
2. 之后就是TRn=1(开启定时器)
ETn=1(开启定时器中断)
EA=1
4.单片机楼主的程序并无大错,稍加修改即可正常运行。
下列程序已经实现了“(响4次/秒和响1次/秒),用定时器1控制发声时间(3秒)”。
//==========================
#include
sbit FM = P1^3; //FM是蜂鸣器.
unsigned char i, j, count;
int k;
//------------------------------------------
void main()
{
TMOD = 0x11; //把定时器0和1都设置为16位.
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256; //50000代表50毫秒.
TH1 = (65536 - 50000) / 256;
TL1 = (65536 - 50000) % 256; //50000代表50毫秒.
TR0 = 1; //启动定时器0
TR1 = 1; //启动定时器1
ET0 = 1; //打开中断T0
ET1 = 1; //打开中断T1
EA = 1; //打开总中断.
i = 0;
j = 0;
k = 1;
count = 5;
while(1);
}
//------------------------------------------
void timer0() interrupt 1 //中断1函数,使用定时器0
{
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256; //50000代表50毫秒.
j++;
if(j >= (count / 2)) FM = 0;//打开蜂鸣器.
else FM = 1;//关闭蜂鸣器.
//count由定时器1控制;
//count=5表示蜂鸣器每秒响4次,count=20表示每秒响1次.
if(j >= count) j = 0;
}
//------------------------------------------
void timer1() interrupt 3 //中断3函数,使用定时器1
{
TH1 = (65536 - 50000) / 256;
TL1 = (65536 - 50000) % 256; //50000代表50毫秒.
i++;
if(i == 60) { //60表示60x50毫秒=3秒.
i = 0;
k--;
if(k == 0) k = 2;
switch(k) {
case 1: count = 5; break; //把count=5赋给中断函数1中,让蜂鸣器每秒响4次.
case 2: count = 20; //把count=20赋给中断函数1中,让蜂鸣器每秒响1次.
}
}
}
//------------------------------------------
看网友的热心回答,水平参差不齐,嘲讽帅哥学童的回答确实别开生面,如此多的错误观点也敢亮出来,呵呵,叫人驳不胜驳!
请教一下:
----
2.千万不要
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
这样定义,因为做(65536-50000)/256;这个运算,很占用机械周期,要知道,减法用1个机器周期,。。工作周期至少多了20个,。
----
说说看,究竟是多少个?
你要是调试过程序,就会知道,“至少多了20个”究竟是多少个。
你要是调试过程序,就会知道,这个运算是否是由单片机进行的。
看来,这位学童还没有接触过单片机。
5.单片机 定时器程序中怎么用#include <reg52.h>
unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};
unsigned char num,cont;
void Init_Timer0(void)
{
TMOD = 0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void main(void)
{
unsigned char i;
P1=tab[i];
Init_Timer0();
num=0;
cont=0;
while(1);
}
void Timer0_isr(void) interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
cont++;
if(cont>20)
{
cont=0;
P1=tab[num];
num++;
num%=10;
}
}
6.如何用单片机定时用单片机本身的定时来做电子表,现在有很多时钟芯片,与单片机接口也很简单,它有专门的外部晶振,而且在时间精确是,是绝对准确的。只要能够按照时序与它产生通讯,就可以达到时间的精确。
毕竟,单片机本身不是专让用来做时钟的,而专门的时钟芯片才会有此条件。
定时器其实就是单片机的一个内部自身时钟的计数器,每一个周期计数器加1,所以使用定时器功能时候先要给定时器付初值,就是先写TH0TL0的值,写完初值后就等着定时器功能的那个计数器记满了数后也就是到了65536后就溢出了。
所以一次定时的过程就是65536-初值 之间的数 所代表的时钟周期,计数满了溢出要产生中断就要写一个中断服务子程序;
参考如下:
void main()
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;//定时器0初值,定时50ms 定时多少MS就多少*1000
EA=1;//开启总中断
ET0=1;//定时器0中断允许
TR0=1;//开启定时器0
while(1)
{
}
}
void timer0() interrrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
7.51单片机的定时器是怎么设置的单片机定时器的设置步骤为:
1、设置定时器的工作模式,共4种工作方式,两种模式(计数器/定时器)。比如:
MOV TMOD,#01;设置定时器0位定时器模式,工作方式1
2、根据定时时间赋初值。比如定时10毫秒,那么如果12M晶振的话是10000个机器周期。定时器是溢出申请中断,所以用溢出值减去定时周期为初值。
MOV TH0,#HIGH(65536-10000)
MOV TL0,#LOW(65536-10000)
3、开启中断、定时器。
SETB ET0
SETB EA
SETB TR0
8.怎么利用单片机定时器实现定时的编程过程定时器其实就是单片机的一个内部自身时钟的计数器,每一个周期计数器加1,所以使用定时器功能时候先要给定时器付初值,就是先写TH0TL0的值(如下),写完初值后就等着定时器功能的那个计数器记满了数后也就是到了65536后就溢出了,所以一次定时的过程就是65536-初值 之间的数 所代表的时钟周期,计数满了溢出要产生中断就要写一个中断服务子程序,子程序如下void timer0() interrrupt X 中断服务子程序中还要给定时器计数器的TH TL付初值 进行下一次的计数,明白了吧。。楼上的那个没写interrupt 选择定时器工作方式。哎呀,妈呀 累死我了
void main()
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;//定时器0初值,定时50ms 定时多少MS就多少*1000
EA=1;//开启总中断
ET0=1;//定时器0中断允许
TR0=1;//开启定时器0
while(1)
{
}
}
void timer0() interrrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}