欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
51單片機LED延時閃爍delay(50000); 用定時器延時代替delay(50000)延時怎么樣寫?
[打印本頁]
作者:
鬼推磨
時間:
2020-3-11 15:34
標題:
51單片機LED延時閃爍delay(50000); 用定時器延時代替delay(50000)延時怎么樣寫?
51單片機LED延時閃爍delay(50000); 用定時器延時代替delay(50000)延時怎么樣寫?
LED閃爍實驗 *
實現現象:下載程序后D11指示燈閃爍
注意事項:無
***************************************************************************************/
#include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器
typedef unsigned int u16; //對數據類型進行聲明定義
typedef unsigned char u8;
sbit led=P0^0; //將單片機的P0.0端口定義為led
sbit led1=p0^1;
/*******************************************************************************
* 函 數 名 : delay
* 函數功能 : 延時函數,i=1時,大約延時10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函 數 名 : main
* 函數功能 : 主函數
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void main()
{
while(1)
{
led=0;
delay(50000); //大約延時450ms
led=1;
delay(50000); //大約延時450ms
led1=0;
delay(50000); //大約延時450ms
led1=1;
delay(50000);
}
}
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
以上程序中 delay(50000); 用定時器延時代替delay(50000)延時怎么樣寫?
作者:
鬼推磨
時間:
2020-3-11 15:48
下面是在網上找了點資料。,三次定時中斷調用。
我試了,沒有反應。不知道那錯了了
U8 a =0;//計中斷次數的全局變量
void main()
{
TMOD=0X01;
TH0=(65536-50000)/
256;//定時50ms
TL0=(65536-50000)%256;
ET0=1; EA=1;
while(1)
{
led=0;
TR0=1;
while(a!=9); //9 次中斷450ms
TR0=0; a=0
led=1;
TR0=1;
while(a!=9); //9 次中斷450ms
TR0=0; a=0
led1=0;
TR0=1;
while(a!=9); //9 次中斷450ms
TR0=0; a=0
led1=1;
TR0=1;
while(a!=9); //9 次中斷450ms
TR0=0; a=0
}
}
中斷程序:
void timer0(void) interrupt 1
{
TH0=(65536-50000)/256;//定時50ms
TL0=(65536-50000)%256;
a++;
}
作者:
鬼推磨
時間:
2020-3-11 16:55
本帖最后由 鬼推磨 于 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;
}
}
}
}
作者:
鬼推磨
時間:
2020-3-11 17:53
新問題又來了:吧上面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;
}
}
}
}
作者:
余生不負
時間:
2020-3-11 17:56
定時器這樣用真的很費勁,為什么不用if判斷
作者:
之一知足
時間:
2020-3-11 18:33
用這個程序,仔細理解定時器怎么用
#include "reg51.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit led=P2^0;
u16 t;
void Timer1Init()
{
TMOD|=0X10;//選擇為定時器1模式,工作方式1,僅用TR1打開啟動。
TH1=0XFF; //給定時器賦初值,定時0.1ms
TL1=0X9C;
ET1=1;//打開定時器1中斷允許
EA=1;//打開總中斷
TR1=1;//打開定時器
}
void main()
{
Timer1Init();//定時器1初始化
while(1)
{
if(t == 5000)//5000*0.1=500ms
{
t==0;
led=~led;
}
}
}
void Timer1() interrupt 3
{
TH1=0XFF; //給定時器賦初值,定時0.1ms
TL1=0X9C;
t++;
}
作者:
az12580
時間:
2020-3-11 18:41
可以先不加中斷,只用定時器,從簡單到復雜。先設置定時器TMOD的模式為1,即TMOD=0x01;
作者:
zhb2004xp
時間:
2020-3-11 19:01
你這是要LED1,450ms狀態反轉一次嗎?
unsigned char a =0;//計中斷次數的全局變量
void main()
{
EA=1;
ET0=1;
TMOD=0X01;
TH0=(65536-50000)/256;//定時50ms
TL0=(65536-50000)%256;
TR0=1;
while(1);
}
void timer0(void) interrupt 1
{
TH0=(65536-50000)/256;//定時50ms
TL0=(65536-50000)%256;
a++;
if(a>=9)
{
a=0;
LED1=~LED1;
}
}
作者:
余生不負
時間:
2020-3-11 19:08
之一知足 發表于 2020-3-11 18:33
用這個程序,仔細理解定時器怎么用
#include "reg51.h"
typedef unsigned int u16;
這才是定時器真正的使用方法。
作者:
鬼推磨
時間:
2020-3-11 20:18
之一知足 發表于 2020-3-11 18:33
用這個程序,仔細理解定時器怎么用
#include "reg51.h"
typedef unsigned int u16;
led=0;
delay(50000); //大約延時450ms
led=1;
delay(50000); //大約延時450ms
led1=0;
delay(50000); //大約延時450ms
led1=1;
delay(50000);
這個delay(50000); 怎么用你代碼替換調用呢。
N多個子程序需要用到這個延時。
子程序需要用到延時用一句話代碼調用。我還實驗過,
你這個代碼沒有辦法在子程序運行不工作
還有個問題。你這個代碼只能在main()里運行。并且在加一個延時。沒有沒有反應
while(1)
{
if(t == 5000)//5000*0.1=500ms
{
t==0;
led=~led;
}
if(t == 3000)//3000*0.1=300ms 比如另外一個發光管LED1,你這個就沒法運行了,編譯通過,下載開發板沒有反應
{
t==0;
led1=~led1;
}
}
}
作者:
鬼推磨
時間:
2020-3-11 22:17
#include<reg51.h>
sbit LED=P2^7;
void delay(unsigned int times)
{
unsigned int i ;
TR0=1;
for(i=0;i<times;i++)
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
while(TF0==0);
TF0=0;//中斷標志位
}
TR0=0;
}
void main()
{
TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
while(1)
{
delay(50); //延時50毫秒
LED=~LED;
}
}
又找到一個版本,。吧定時器中斷搞延時里,
這樣又變成老方法的delay(50); //延時50毫秒調用了,
我測試了,好像不能長時間調用,短時間2000以內是可以的,
下面10秒就不行。運行起來,沒有10秒就滅了,好像只亮2秒就過了。不知道是什么問題
LED=0;
delay(10000); //延時10秒
LED=1;
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1