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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機智能路燈,為什么按鍵按下的時候,TIME沒有倒計時,請求幫助

[復制鏈接]
跳轉到指定樓層
樓主
ID:419073 發表于 2018-11-5 21:11 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include<reg51.h>
#include<intrins.h>  //其中有nop函數的定義

    /*對于延時很短的,要求在us級的,采用“_nop_”函數,這個函數相當匯編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;  //定義數據命令選擇端
    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代表需要延時的毫秒數
{
    unsigned int x,y;
    for(x=xms;x>0;x--)
        for(y=110;y>0;y--);
}
  //顯示函數,在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,它在處理上位機發來的某些指令的時候,耗時較長。如復位命令,全屏清除命令等。另外,LCD1602的CPU速度較慢,上位機較快時,LCD1602CPU來不及完成上條命令,會對后續命令不予理睬,這樣就造成了命令序列不能正確完整地到達LCD1602CPU,以至于顯示不正常。*/

uchar Lcd1602_ReadBusy()   //判斷lcd1602是否處于忙的狀態,即讀忙
    {
       uchar temp;
       RS=0;
       RW=1;
       _nop_();
       P0=0xff;     //讀某IO口數據前,先將該口置為1            

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

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

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

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



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

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

void Lcd1602_init()   //初始化函數
    {
       delay_ms(15);
       Lcd1602_Write_Com(0x38);   //顯示模式設置
       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);  //顯示光標
    }


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中斷函數
                                                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;
                                                                                }
                                                                  }
                                                                }
                                                  }
                                                  
                                                }




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

使用道具 舉報

沙發
ID:213173 發表于 2018-11-6 12:03 | 只看該作者
你在加電開機后第一次發生定時器0中斷時就把定時器關了,主循環中也沒有再次打開定時器,你拿什么來計時?
void timer0() interrupt 1
{
        TR0=0;
        TH0=(65535-50000)/256;//50000us=50ms
        TL0=(65535-50000)%256;
        if(START==1)//繼電器開啟倒計時開始
        {
回復

使用道具 舉報

板凳
ID:419073 發表于 2018-11-6 17:02 | 只看該作者
那我應該怎么改    求指導
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品久久久久 | 久草成人网 | 亚洲狠狠爱一区二区三区 | 久久九 | 黄色片在线 | 精品一区二区在线看 | 日韩人体在线 | 九九热在线免费视频 | 中文天堂网 | 国产激情 | 亚洲视频免费在线 | 国产激情偷乱视频一区二区三区 | 午夜精品一区二区三区三上悠亚 | 亚洲一区久久久 | 亚洲啪啪 | 99精品免费 | 国产69久久精品成人看动漫 | 日本成人中文字幕在线观看 | 亚洲最新网址 | 琪琪午夜伦伦电影福利片 | 亚洲欧美中文日韩在线v日本 | 亚洲高清在线观看 | 久久久久黄| 日日干日日射 | 91久久精品一区二区二区 | 午夜视频在线观看网址 | 中文字幕亚洲精品 | 国产午夜影院 | 亚洲欧洲视频 | 天天操天天玩 | 亚洲国产精品一区二区久久 | 久久午夜电影 | 日韩不卡在线 | www.国产 | 99热视| 日本久久网站 | 午夜精品久久久久久久久久久久 | 91久久久精品国产一区二区蜜臀 | 青青久久 | 成人国产精品久久久 | 国产精品久久久久久亚洲调教 |