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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3444|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

1602顯STC89單片機空閑模式測試(升級別人的)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:358930 發(fā)表于 2019-1-19 13:28 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式


/*我們知道單片機內(nèi)部有一個電源管理寄存器PCON,這個寄存器的最低兩位,
IDL和PD這兩位分別用來設(shè)定是否使單片機進(jìn)入空閑模式和掉電模式。
1. 空閑模式
     當(dāng)單片機進(jìn)入空閑模式時,除CPU處于休眠狀態(tài)外,
                 其余硬件全部處于活動狀態(tài),
                 芯片中程序未涉及到的數(shù)據(jù)存儲器和特殊功能寄存器中的數(shù)據(jù)在空閑模式期間都將保持原值。
                 但假若定時器正在運行,那么計數(shù)器寄存器中的值還將會增加。
                 單片機在空閑模式下可由任一個中斷或硬件復(fù)位喚醒,需要注意的是,
                 使用中斷喚醒單片機時,程序從原來停止處繼續(xù)運行,當(dāng)使用硬件復(fù)位喚醒單片機時,程序?qū)念^開始執(zhí)行。
     讓單片機進(jìn)入空閑模式的目的通常是為了降低系統(tǒng)的功耗,
                 舉個很簡單的例子,大家都用過數(shù)字萬用表,
                 在正常使用的時候表內(nèi)部的單片機處于正常工作模式,當(dāng)不用時,
                 又忘記了關(guān)掉萬用表的電源,大多數(shù)表在等待數(shù)分鐘后,若沒有人為操作,
                 它便會自動將液晶顯示關(guān)閉,以降低系統(tǒng)功耗,
                 通常類似這種功能的實現(xiàn)就是使用了單片機的空閑模式或是掉電模式。
                 以STC89系列單片機為例,當(dāng)單片機正常工作時的功耗通常為4mA~7mA,
                 進(jìn)入空閑模式時其功耗降至2mA,當(dāng)進(jìn)入掉電模式時功耗可降至0.1μA以下。
2.  休眠模式
     當(dāng)單片機進(jìn)入掉電模式時,外部晶振停振、CPU、定時器、
                 串行口全部停止工作,只有外部中斷繼續(xù)工作。
                 使單片機進(jìn)入休眠模式的指令將成為休眠前單片機執(zhí)行的最后一條指令,進(jìn)入休眠模式后,
                 芯片中程序未涉及到的數(shù)據(jù)存儲器和特殊功能寄存器中的數(shù)據(jù)都將保持原值。
                 可由外部中斷低電平觸發(fā)或由下降沿觸發(fā)中斷或者硬件復(fù)位模式換醒單片機,
                 需要注意的是,使用中斷喚醒單片機時,程序從原來停止處繼續(xù)運行,
                 當(dāng)使用硬件復(fù)位喚醒單片機時,程序?qū)念^開始執(zhí)行。
                 下面的例子演示單片機進(jìn)入空閑和休眠模式,
                 并且演示出從空閑和休眠模式中喚醒的過程。

*/
#include <reg52.h>      //52系列單片機頭文件
#define uchar unsigned char
#define uint unsigned int
sbit RS = P2^6 ;
sbit RW = P2^5 ;
sbit EN = P2^7 ;


sbit STA7 = P0^7;         
uint num,num1;


void delayms(uint);

void delayms(uint xms)   
{
uint i,j;
for(i=xms;i>0;i--)        //i=xms即延時約xms毫秒
  for(j=110;j>0;j--);
}
/**
* 等待繁忙標(biāo)志
*/
void wait(void)
{
        P0 = 0xFF;
        
        do
        {
                RS = 0;
                RW = 1;
                EN = 0;
                EN = 1;
        }while (STA7 == 1);
        EN = 0;
}


/**
* 寫數(shù)據(jù)
*/
void w_dat(uint dat)
{
        wait();
        EN = 0;
        P0 = dat;
        RS = 1;
        RW = 0;
        EN = 1;
        EN = 0;
}


/**
* 寫命令
*/
void w_cmd(uint cmd)
{
        wait();
        EN = 0;
        P0 = cmd;
        RS = 0;
        RW = 0;
        EN = 1;
        EN = 0;
}


/**
* 發(fā)送字符串到LCD
*/
void write_zfc(uchar *p)//定義一個帶指針的函數(shù)?(字符串)
{
        while(*p!=0)//不能用";"
        w_dat(*p++);
}


/**
* 初始化1602
*/
void Init_LCD1602(void)
{
        w_cmd(0x38);  // 16*2顯示,5*7點陣,8位數(shù)據(jù)接口
        w_cmd(0x0C);  // 顯示器開、光標(biāo)開、光標(biāo)允許閃爍
        w_cmd(0x06);  // 文字不動,光標(biāo)自動右移
        w_cmd(0x01);  // 清屏
}


void main()
{
Init_LCD1602();   //LCD1602初始化        
        
        
TMOD=0x01; //設(shè)置定時器0為工作方式1(0000 0001)
TH0=(65536-50000)/256;     
TL0=(65536-50000)%256;
EA=1;
ET0=1;
EX0=1;
EX1=1;
TR0=1;
        
while(1)
{
  if(num>=20)//20個定時為一秒鐘
  {
   num=0;
   num1++;
          w_cmd(0xC0);//LCD1602顯示地址為第一排第一個
                write_zfc("NUM1:");               
                w_dat(num1/1000+0x30);
                w_dat(num1%1000/100+0x30);
                w_dat(num1%100/10+0x30);
                w_dat(num1%10+0x30);
                                
   if(num1==6)//UNM==6時進(jìn)入空閑或休眠模式
   {
    ET0=0;
    PCON=0x02; //(或PCON=0x01;)
   }
         
         
         
         
         if(num1>20)//大于20秒就從頭記數(shù),又會進(jìn)入UNM==6時進(jìn)入空閑或休眠模式
         {
                 num1=0;
   }
         
         
  }        
        w_cmd(0x80);//LCD1602顯示地址為第一排第一個
                write_zfc("NUM:");               
                w_dat(num/1000+0x30);
                w_dat(num%1000/100+0x30);
                w_dat(num%100/10+0x30);
                w_dat(num%10+0x30);  
}
}
void timer0() interrupt 1//定時器0 用來產(chǎn)生秒信號
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
}
void ex_int0() interrupt 0//外部中斷P3.2 進(jìn)行PCON=0;喚醒單片機        CPU
{
PCON=0;
ET0=1;
}
void ex_int1() interrupt 2//外部中斷P3.3 進(jìn)行PCON=0;喚醒單片機        CPU
{
PCON=0;
ET0=1;
}


/*
分析:
(1) EA=1;  開總中斷
ET0=1;  開定時器0中斷
EX0=1;  開外部中斷0
EX1=1;   開外部中斷1
TR0=1;  啟動定時器0
// (2)主程序中有“ET0=0;”下句是“PCON=0x02;”意思是在進(jìn)入休眠模式之前要先把定時器關(guān)閉,
這樣方可一直等待外部中斷的產(chǎn)生,如果不關(guān)閉定時器,定時器的中斷同樣也會喚醒單片機,
使其退出休眠模式,這樣我們便看不出進(jìn)入休眠模式和返回的過程。
(3)void ex_int0() interrupt 0  
{
  PCON=0;
  ET0=1;
}
這是外部中斷0服務(wù)程序,當(dāng)進(jìn)入外部中斷服務(wù)程序后,
首先將PCON中原先設(shè)定的休眠控制位清除(如果不清除,程序也可以正常運行,
大家最好親自做實驗驗證),接下來再重新開啟定時器0。
(4)下載程序后,實驗現(xiàn)象如下:數(shù)碼管從“00”開始遞增顯示,到“05”后,
再過一秒后,數(shù)碼管變成只顯示一個“5”,單片機進(jìn)入休眠或空閑模式,
用導(dǎo)線一端連接地,另一端接觸P3.2或P3.3,(或者直接按下板子上的int0鍵),
數(shù)碼管重新從“06”開始顯示,遞增下去。
整個過程演示了單片機從正常工作模式進(jìn)入休眠模式或空閑模式,
然后再從休眠模式或空閑模式返回到正常工作模式。
(5)測試過程大家可將數(shù)字萬用表調(diào)節(jié)到電流檔,然后串接入電路中,
觀察單片機在正常工作模式、休眠模式、空閑模式下流過系統(tǒng)的總電流變化情況,
經(jīng)測試可發(fā)現(xiàn)結(jié)果如下:正常工作電流>空閑模式電流>休眠模式電流。
*/

全部資料51hei下載地址:
1602顯并STC89空閑和休眠模式OK.zip (40.95 KB, 下載次數(shù): 20)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:536578 發(fā)表于 2019-6-27 12:50 來自手機 | 只看該作者
學(xué)習(xí)了 ,謝謝
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: av中文字幕在线观看 | 中文字幕三区 | 亚洲国产精品视频一区 | 91福利在线观看视频 | 精品视频久久久 | 成人亚洲视频 | 国产精品久久久久久久久久 | 九九综合| 久久极品| 婷婷色国产偷v国产偷v小说 | 久久午夜影院 | 日韩中文字幕视频 | 亚洲精品一二三区 | 老司机免费视频 | 久久精品综合网 | 国产精品久久久久久久7电影 | 青草青草久热精品视频在线观看 | av手机在线| 国产片淫级awww | 日本特黄a级高清免费大片 国产精品久久性 | 日韩国产中文字幕 | 日日夜夜天天 | 日韩电影一区 | 99精品国产一区二区青青牛奶 | 成人免费大片黄在线播放 | 久久精品国产一区二区电影 | 草久免费视频 | 精品日韩 | 国产精品高潮呻吟久久aⅴ码 | 国产传媒在线播放 | 欧美性猛交 | 91精品国产手机 | 91亚洲精华国产 | 国产精品免费观看 | 成人久久久久 | 国产激情一区二区三区 | 欧美三级久久久 | 日韩一区二区在线观看 | 美女视频黄色片 | 亚洲精品福利视频 | 久久99网 |