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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1870|回復: 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久久精品免费看国产四区 | 91xxx在线观看 | 欧美日韩成人在线 | 欧美一区免费在线观看 | 久久久成人一区二区免费影院 | 亚洲精品在线看 | 九九热在线视频免费观看 | www.性色| 在线日韩| 欧美性受xxxx白人性爽 | a视频在线 | 国产精品久久久久久一级毛片 | 亚洲日本乱码在线观看 | 日日天天 | 成人免费视频播放 | 成人影院在线视频 | 欧美性生活视频 | 久久69精品久久久久久久电影好 | 男女一区二区三区 | 视频一区二区在线观看 | 国产成人99久久亚洲综合精品 | 成人免费看黄网站在线观看 | 国产区精品视频 | 欧美free性 | 欧美一区2区三区4区公司二百 | 精品一级电影 | 91免费在线播放 | 日日摸夜夜添夜夜添精品视频 | 综合久久综合久久 | 午夜一区 | 蜜桃色网 | 日韩在线视频观看 | 亚洲免费在线 | 国产免费黄网 | 中文字幕在线二区 | 99久久视频 | 久99久视频 |