本帖最后由 鬼推磨 于 2020-3-11 17:57 编辑
成功了,
经过反复测试修改,。终于找到问题。纠正了,。下面是正确的代码了,
以后写程序就可以使用定时器来做延时,精准可靠,放弃使用delay延时不准,
特别是新手可以借鉴下面的代码。为这个问题网上找资料搞了好几天了,
#include "reg52.h"
#define uchar unsigned char
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
u16 a =0;//计中断次数的全局变量
sbit led=P2^6;
sbit led1=P2^7;
//晶振频率是11.0592M,可算出,计数脉冲个数是921个=1ms
//TH0=(65536-921)/256=252=0xFC
//TL0=(65536-921)%256=103=0x67
////////T0定时器///////////////////
void Timer0Init()//晶振频率是11.0592M
{
//0X00:0 0 方式0 13位计数器
//0X01:0 1 方式1 16位计数器
//0X10:1 0 方式2 自动重装8位计数器
//0X11:1 1 方式3 T0分为2个8位独立计数器,T1为无中断重装8位计数器
TMOD|=0X01;// 工作方式1,16位计数器。此处0X01;下面定时1000就是1秒,若设置为0X10下面1000就是0.1秒
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0x67;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
void main()
{
Timer0Init(); //定时器0初始化
while(1)
{
led=0;//亮
TR0=1;//打开定时器0
while(a!=1000); //1000 次中断是1000ms=1s
TR0=0; //关闭定时器0
a=0; //中断计数清零
led=1;//灭
TR0=1;//打开定时器0
while(a!=1000); //1000 次中断是1000ms=1s
TR0=0; //关闭定时器0
a=0;//中断计数清零
led1=0;//亮
TR0=1;//打开定时器
while(a!=1000); //1000 次中断是1000ms=1s
TR0=0; //关闭定时器0
a=0;//中断计数清零
led1=1;//灭
TR0=1;//打开定时器0
while(a!=1000); //1000 次中断是1000ms=1s
TR0=0; //关闭定时器0
a=0;//中断计数清零
}
}
//中断程序:
void Timer0() interrupt 1//晶振频率是11.0592M
{
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0x67;
a++;
}
、、、
//////////////////////////////////////////////////////
新问题来了:吧上面void main()里面代码换成下面的,
下面代码只是加了个按键IF判断。
里面定时中断延时就不执行了,没有反应了,
这句代码出问题了while(k!=650); //650ms
不知何故,望大师们帮忙解答。,谢谢
void main()
{
Timer0Init(); //定时器0初始化
a=0;//清零
while(1)
{
if(k3==0)
{
delay(10);
if(k3==0)
{
k1=0;
TR0=1;
while(k!=650); //650ms
TR0=0;
k=0;
k1=1;
TR0=1;
while(k!=350); // 350ms
TR0=0;
k=0;
k1=0;
}
}
}
}
|