欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 單片機智能路燈,為什么按鍵按下的時候,TIME沒有倒計時,請求幫助 [打印本頁]

作者: 創(chuàng)美    時間: 2018-11-5 21:11
標(biāo)題: 單片機智能路燈,為什么按鍵按下的時候,TIME沒有倒計時,請求幫助
#include<reg51.h>
#include<intrins.h>  //其中有nop函數(shù)的定義

    /*對于延時很短的,要求在us級的,采用“_nop_”函數(shù),這個函數(shù)相當(dāng)匯編NOP指令,延時幾微秒。NOP指令為單周期指令,可由晶振頻率算出延時時間,對于12M晶振,延時1uS。*/

#define uchar unsigned char
#define uint unsigned int
void set_POS(uchar);
void Lcd1602_WriteData(uchar);


        sbit BUZZER=P2^5;
        sbit key=P1^0;
    sbit RS=P2^6;  //定義數(shù)據(jù)命令選擇端
    sbit RW=P2^5;  //定義讀寫選擇端
    sbit E=P2^7;   //定義使能端
//注意:具體為哪一個IO口由你自己的接線來定,并不是一定要這樣寫!

    uchar text1[]="nice to meet you";   //第一行要顯示的字符

    uchar data BUF1_str[16]={"                "};    //第二行要顯示的字符

         uchar text2[]="watch out!";   //第二行要顯示的字符
         uint sec,min,rl_sec,rl_min,cnt=0,START=0;


void delay_ms(unsigned int xms)  // xms代表需要延時的毫秒數(shù)
{
    unsigned int x,y;
    for(x=xms;x>0;x--)
        for(y=110;y>0;y--);
}
  //顯示函數(shù),在LCD上顯示字符串
void display_str(uchar* str,uchar lineno)
                                        {
                                           uchar k;
                                           set_POS(lineno);
                                           for(k=0;k<16;k++)
                                          Lcd1602_WriteData(str[k]);
                                        }


    //為什么要判忙?
    /*因為LCD1602控制芯片也是一個CPU,它在處理上位機發(fā)來的某些指令的時候,耗時較長。如復(fù)位命令,全屏清除命令等。另外,LCD1602的CPU速度較慢,上位機較快時,LCD1602CPU來不及完成上條命令,會對后續(xù)命令不予理睬,這樣就造成了命令序列不能正確完整地到達(dá)LCD1602CPU,以至于顯示不正常。*/

uchar Lcd1602_ReadBusy()   //判斷l(xiāng)cd1602是否處于忙的狀態(tài),即讀忙
    {
       uchar temp;
       RS=0;
       RW=1;
       _nop_();
       P0=0xff;     //讀某IO口數(shù)據(jù)前,先將該口置為1            

    /*原因:電路中存在的一個普遍的現(xiàn)象:高電平很容易被低電平拉低,而低電平一般不可能被高電平拉高。所以在讀數(shù)據(jù)之前將單片機IO口拉高才不會影響原來數(shù)據(jù)線上的數(shù)據(jù)!*/

       _nop_();
       E=1;
       _nop_();
       temp=P0;   //讀取此時lcd1602的狀態(tài)字
       _nop_();
       E=0;
       return (temp&0x80);  //如果忙

       /*狀態(tài)字為temp(8位2進(jìn)制數(shù))的最高位,最高位為1表示禁止讀寫,為0表示允許讀寫,即temp&0x80得1表示忙,得0表示不忙*/

    }          /*在lcd1602的資料中,讀寫操作都有對應(yīng)的時序圖,想要理解lcd1602的具體工作流程還得認(rèn)真研究時序圖!*/



void Lcd1602_Write_Com(uchar com)  //寫命令函數(shù)
    {
       while(Lcd1602_ReadBusy());  //判忙
       RS=0;   //命令
       RW=0;   //寫
       _nop_();
       P0=com;   //準(zhǔn)備發(fā)送命令
       _nop_();
       E=1;      //由時序圖知,使能端為高電平時才允許數(shù)據(jù)交換
       _nop_();
       _nop_();
       E=0;      //由時序圖知,使能端在完成數(shù)據(jù)交換后要拉低
       _nop_();
       _nop_();   
    }

void Lcd1602_WriteData(uchar dat)  //寫數(shù)據(jù)
    {
       while(Lcd1602_ReadBusy());   //判忙
       RS=1;   //數(shù)據(jù)
       RW=0;   //寫
       _nop_();
       P0=dat;
       _nop_();
       E=1;
       _nop_();
       _nop_();
       E=0;
       _nop_();
       _nop_();   
    }

void Lcd1602_init()   //初始化函數(shù)
    {
       delay_ms(15);
       Lcd1602_Write_Com(0x38);   //顯示模式設(shè)置
       delay_ms(5);
      Lcd1602_Write_Com(0x38);
       delay_ms(5);
       Lcd1602_Write_Com(0x38);
       Lcd1602_Write_Com(0x0c);  //顯示開
       Lcd1602_Write_Com(0x01);  //顯示清屏
       Lcd1602_Write_Com(0x06);  //顯示光標(biāo)
    }


void set_POS(uchar position)
                                {
                                        Lcd1602_Write_Com(position|0x80);
                                }
                                  //初始化定時器0
                                void inittimer0(void)
                                {
                                  TMOD=0X01;//定時器寄存器配置
                                  TH0=(65535-50000)/256;//定時50000us=50ms
                                  TL0=(65535-50000)%256;
                                  TR0=1;//啟動定時器0
                                  ET0=1;
                                  EA=1;//開總中斷
                                }



    void main()
    {

                     inittimer0();//初始化定時器0
                delay_ms(10);
                Lcd1602_init();//初始化LCD

                                 BUF1_str[6]='T';
                BUF1_str[7]='I';
                BUF1_str[8]='M';
                BUF1_str[9]='E';

                                min=0;sec=20;rl_min=0;rl_sec=10;
                START=1;
while(1)
{
                                uchar i,j;
                                        P2=0x00;
                                                  Lcd1602_init();
                    
                                                               
                                                 if(key==0)       
                                                 {
                                                  P2=0x01;
                                               
                                                  Lcd1602_Write_Com(0x80);   //0x80是第一行的第一個字符的地址
                               
                                                       for(i=0;i<10;i++)
                                                             
                                                          Lcd1602_WriteData(text1[i]);
                                  
                                                   BUF1_str[11]=min%100/10+'0';
                                BUF1_str[12]=min%10+'0';
                                BUF1_str[13]=':';
                                BUF1_str[14]=sec%100/10+'0';
                                BUF1_str[15]=sec%10+'0';
               
                                  display_str(BUF1_str,0x40);//第二行
                                                                    delay_ms(3000);


                                                                                 P2=0x00;
                                                                                  
                                                         Lcd1602_Write_Com(0x01);
                                                                                  delay_ms(10);
                                                 Lcd1602_Write_Com(0x80+0x40);
                                                                          for(j=0;j<10;j++)
                                                                           Lcd1602_WriteData(text2[j]);
                                                                       delay_ms(9000);                       
                               
                  }
                         
                 }

}
                                                //定時器0中斷函數(shù)
                                                timer0() interrupt 1
                                                {
                                                  TR0=0;
                                                  TH0=(65535-50000)/256;//50000us=50ms
                                                  TL0=(65535-50000)%256;
                                                        if(START==1)//繼電器開啟倒計時開始
                                                        {
                                                    cnt++;
                                                    if(cnt>=20)//20*50ms=1s
                                                    {
                                                      cnt=0;
                                                            sec--;
                                                            if(sec==0)
                                                            {
                                                                                sec=59;
                                                                          min--;
                                                                                if(min>250)
                                                                                {
                                                                                        START=2;
                                                                                        sec=0;
                                                                                        min=0;
                                                                                        BUZZER=0;//開啟蜂鳴器
                                                                                        cnt=0;
                                                                                }
                                                                  }
                                                                }
                                                  }
                                                  
                                                }





作者: wulin    時間: 2018-11-6 12:03
你在加電開機后第一次發(fā)生定時器0中斷時就把定時器關(guān)了,主循環(huán)中也沒有再次打開定時器,你拿什么來計時?
void timer0() interrupt 1
{
        TR0=0;
        TH0=(65535-50000)/256;//50000us=50ms
        TL0=(65535-50000)%256;
        if(START==1)//繼電器開啟倒計時開始
        {
作者: 創(chuàng)美    時間: 2018-11-6 17:02
那我應(yīng)該怎么改    求指導(dǎo)





歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1