久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8535|回復: 10
打印 上一主題 下一主題
收起左側

51單片機LED延時閃爍delay(50000); 用定時器延時代替delay(50000)延時怎么樣寫?

[復制鏈接]
回帖獎勵 1 黑幣 回復本帖可獲得 1 黑幣獎勵! 每人限 1 次
跳轉到指定樓層
樓主
ID:475031 發表于 2020-3-11 15:34 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
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)延時怎么樣寫?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:475031 發表于 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++;
}
回復

使用道具 舉報

板凳
ID:475031 發表于 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;       
         }
                                                 
                                 }
       


}  



         }




回復

使用道具 舉報

地板
ID:475031 發表于 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;       
         }
                                                 
                                 }
       


}  



         }

回復

使用道具 舉報

5#
ID:316880 發表于 2020-3-11 17:56 | 只看該作者
定時器這樣用真的很費勁,為什么不用if判斷
回復

使用道具 舉報

6#
ID:342451 發表于 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++;
}
回復

使用道具 舉報

7#
ID:685726 發表于 2020-3-11 18:41 | 只看該作者
可以先不加中斷,只用定時器,從簡單到復雜。先設置定時器TMOD的模式為1,即TMOD=0x01;
回復

使用道具 舉報

8#
ID:234075 發表于 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;
        }
}
回復

使用道具 舉報

9#
ID:316880 發表于 2020-3-11 19:08 | 只看該作者
之一知足 發表于 2020-3-11 18:33
用這個程序,仔細理解定時器怎么用
#include "reg51.h"
typedef unsigned int u16;

這才是定時器真正的使用方法。
回復

使用道具 舉報

10#
ID:475031 發表于 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;
                }


        }               
}
回復

使用道具 舉報

11#
ID:475031 發表于 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;



回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久热国产精品视频 | 日韩在线播放视频 | 免费性视频 | 少妇无套高潮一二三区 | 国产精品激情 | 二区三区av| 亚洲第一成人av | 国产视频久久 | 国产精品久久久久久高潮 | 欧美成人h版在线观看 | 成人午夜在线 | 99成人在线视频 | 91大神在线资源观看无广告 | 国产一区二区在线视频 | 久久国产精品久久 | 日韩一区二区三区在线 | 国产欧美一区二区三区在线播放 | 欧美一级在线 | 男女午夜免费视频 | 亚洲成人精品一区二区 | 九九热这里 | 亚洲精品视频在线观看视频 | 免费视频二区 | 国内自拍第一页 | 欧美日韩一卡二卡 | 亚洲视频中文字幕 | 一区2区 | 欧美一区二区三区四区五区无卡码 | 91中文 | 午夜爽爽男女免费观看hd | 欧美激情综合 | 精品成人佐山爱一区二区 | 日韩国产在线 | 久久亚洲精品国产精品紫薇 | 美女视频久久 | 夜夜骚| 国产激情视频网址 | 亚洲乱码一区二区三区在线观看 | 日韩久草 | 国产在线观看一区 | 国产亚洲精品精品国产亚洲综合 |