本帖最后由 鬼推磨 于 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;
}
}
}
}
|