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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

12864+ds1302+dh11 (大佬繞道)

[復制鏈接]
跳轉到指定樓層
樓主
ID:454712 發表于 2019-4-30 15:29 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
/***********************************************
*                        12864+1302+dh11
***********************************************/
#include <reg51.h>                                //頭文件
#include <intrins.h>
#include <ds1302.h>       
#define uchar unsigned char                //宏定義
#define uint  unsigned int
/*TS12864A-3 端口定義*/
#define LCD_data  P0             //數據口
sbit LCD_RS  =  P3^5;            //寄存器選擇輸入
sbit LCD_RW  =  P3^6;            //液晶讀/寫控制
sbit LCD_EN  =  P3^4;            //液晶使能控制
sbit LCD_PSB =  P3^7;            //串/并方式控制sbit DATA=P1^1;                  //dh11口定義
sbit Beep = P1^2;                //蜂鳴器
uchar ucStatus;
uint  uiCount;
uint  uiStatus;

uchar mun_char_table[]={"0123456789"};
uchar RHL,RHH,CL,CH;   
uint m,n,flag=0;
void lcd_pos(uchar X,uchar Y);  //確定顯示位置
void My_T0(void);                                //定時器初始化
void Xianshi(void);                                //滾動文字
void LCDWrituenumber(uchar x,uchar y,uchar ucDAT);
void LCDWritueString(uchar x,uchar y,uchar *str) ;
void delayus(uchar n);
void Delay10ms(void);
void delay_ms(uint z);
uint integer(uchar x);
uchar readdht11_byte();
void read_dht11();
void wenxian(void);                                 //溫度顯示+固定字 數
//*************************************************//
//              LCD12864模塊                                       //
//*************************************************//
void delay(int ms)           //LCD12864延時函數
{
    while(ms--)
        {
      uchar i;
          for(i=0;i<250;i++)  
           {
            _nop_();                          
                _nop_();
                _nop_();
                _nop_();
           }
        }
}               
/*******************************************************************/
/*檢查LCD忙狀態                                                    */
/*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數據。      */
/*******************************************************************/
//bit lcd_busy()
// {
//                           
//    bit result;
//    P0=0X00;              //關掉數碼管的信號。阻止數碼管受到P0口信號的影響
//    LCD_RS = 0;
//    LCD_RW = 1;
//    LCD_EN = 1;
//    delay(1);
//    result = (bit)(P0&0x80);
//    LCD_EN = 0;
//    return(result);
// }
/*******************************************************************/
/*寫指令數據到LCD                                                  */
/*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。                             */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{   

//    while(lcd_busy());
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_EN = 0;
    _nop_();
    _nop_();
    P0 = cmd;
    delay(1);
    LCD_EN = 1;
    delay(1);
    LCD_EN = 0;  
}
/*******************************************************************/
/*寫顯示數據到LCD                                                  */
/*RS=H,RW=L,E=高脈沖,D0-D7=數據。                               */
/*******************************************************************/
void lcd_wdat(uchar dat)
{                          
//    while(lcd_busy());
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_EN = 0;
    P0 = dat;
    delay(1);
    LCD_EN = 1;
    delay(1);
    LCD_EN = 0;
}
/*******************************************************************/
/*  LCD初始化設定                                                  */
/*******************************************************************/
void lcd_init()
{
    LCD_PSB = 1;         //并口方式   
    lcd_wcmd(0x34);      //擴充指令操作
    delay(5);
    lcd_wcmd(0x30);      //基本指令操作
    delay(5);
    lcd_wcmd(0x0C);      //顯示開,關光標
    delay(5);
    lcd_wcmd(0x01);      //清除LCD的顯示內容
    delay(5);
}
///////////////////*********///////////////////////////
//*                 主程序                          *//
///////////////////*********////////////////////////*//
void  main()
{  
   SYSTEMTIME CurrentTime;            //系統時間 當前時間
   Initial_DS1302();                        //DS1302初始化      
   lcd_init();                  //初始化LCD
   My_T0();                                                //定時器初始化
   while(1)
   {   
        Xianshi();                                    //文字滾動   
            wenxian();                                        //溫度顯示
        if(flag == 1)
                {
        DS1302_GetTime(&CurrentTime);        //ds1302主函數中有什么就粘貼復制過去
                DateToStr(&CurrentTime);                //將日期格式轉換為字符串函數
                TimeToStr(&CurrentTime);                //將時間格式轉換為字符串
                LCDWrituenumber(0,1,CurrentTime.Hour);  //在第1行第1位顯示當前時間的時
                LCDWrituenumber(0,3,CurrentTime.Minute);//在第1行第3位顯示當前時間的分
                LCDWrituenumber(0,5,CurrentTime.Second);//在第1行第5位顯示當前時間的秒
                LCDWrituenumber(1,1,CurrentTime.Year);        //在第2行第2位顯示當前時間的年
                LCDWrituenumber(1,3,CurrentTime.Month);        //在第2行第4位顯示當前時間的月
                LCDWrituenumber(1,5,CurrentTime.Day);        //在第2行第6位顯示當前時間的日
                }

   }
}
/*********************************************************       
*                                     寫字符
**********************************************************/
void LCDWritueString(uchar x,uchar y,uchar *str)          //固定格式
{
        uchar i;
        lcd_pos(x,y);
        i = 0;
    while(str[i] != '\0')
    {
       lcd_wdat(str[i]);      //顯示字符
       i++;
    }
}
/*********************************************************       
*                                    寫字符串
*********************************************************/
void LCDWrituenumber(uchar x,uchar y,uchar ucDAT)
{
        lcd_pos(x,y);
        lcd_wdat((ucDAT / 10)+ 48);
        lcd_wdat((ucDAT % 10) + 48);   
          
}
///////////////////************///////////////////
//*                設定顯示位置                *//               
///////////////////************///////////////////
void lcd_pos(uchar X,uchar Y)
{                          
   uchar  pos;
   if (X==0)
     {X=0x80;}
   else if (X==1)
     {X=0x90;}
   else if (X==2)
     {X=0x88;}
   else if (X==3)
     {X=0x98;}
   pos = X+Y ;  
   lcd_wcmd(pos);     //顯示地址
}

///////////////////*******///////////////////
//                                定時器T0初始化                           //
//////////////////*********//////////////////
void My_T0(void)
{
        TMOD = 0x01;
        TH0 = (65536-1000)/256;
        TL0 = (65536-1000)%256;
        EA = 1;
        ET0 = 1;
        TR0 = 1;
}
//////////////////*******////////////////////
//                                定時器服務函數                           //
/////////////////*********///////////////////
void Tim0()interrupt 1
{
           TH0 = (65536-1000)/256;
        TL0 = (65536-1000)%256;
        uiCount++;
        uiStatus++;
        if(uiStatus == 4000)
        {
           uiStatus = 0;
           ucStatus = 8;
           flag = 1;
        }
}
//**************************************//
//                            顯示函數                        //
//**************************************//
void Xianshi(void)
{
   switch(ucStatus)
   {
            case 0:LCDWritueString(0,0,"大學生單片機競賽");
                   if(uiCount >= 500)
                           {
                              uiCount = 0;
                                     ucStatus = 1;
                           }
                           break;
            case 1:LCDWritueString(0,0,"                ");
                   if(uiCount >= 500)
                           {
                              uiCount = 0;
                                     ucStatus = 2;
                           }
                           break;
            case 2:LCDWritueString(1,2,"H001組");
                   if(uiCount >= 500)
                           {
                              uiCount = 0;
                                     ucStatus = 3;
                           }
                           break;
           case 3:LCDWritueString(1,2,"                ");
                   if(uiCount >= 500)
                           {
                              uiCount = 0;
                                     ucStatus = 4;
                           }
                           break;
           case 4:LCDWritueString(2,2,"只因追求");
                   if(uiCount >= 500)
                           {
                              uiCount = 0;
                                     ucStatus = 5;
                           }
                           break;
            case 5:LCDWritueString(2,2,"               ");
                   if(uiCount >= 500)
                           {
                              uiCount = 0;
                                     ucStatus = 6;
                           }
                           break;
                case 6:LCDWritueString(3,2,"源于熱愛");
                   if(uiCount >= 500)
                           {
                              uiCount = 0;
                                     ucStatus = 7;
                           }
                           break;
            case 7:LCDWritueString(3,2,"               ");
                   if(uiCount >= 500)
                           {
                              uiCount = 0;
                                     ucStatus = 0;
                           }
                           break;
                                      
   }
}
///////////////////////////////////////////////////
//*                                溫濕度模塊                      *//
///////////////////////////////////////////////////
void delayus(uchar n)        //很重要的延時
{   
    while(n--);
}

void Delay10ms(void)          //很重要的延時                 
{   
    uchar a,b;                              //12M晶振下延時
    for(b=249;b>0;b--)
    for(a=17;a>0;a--);
}

void delay_ms(uint z)                  //粗延時
{
   uint x,y;
   for(x=z;x>0;x--)
    for(y=614;y>0;y--);
}

void Start(void)                           //起始
{
    DATA=1;   
    delay_ms(10);   
    DATA=0;            
    Delay10ms(); //主機把總線拉低必須大于18msDHT11能檢測到起始信號      
    Delay10ms();
    Delay10ms();   
    DATA=1;
    delay_ms(1);        
}
uint integer(uchar x)
{  
    uchar h,l;  
    uint n;  
    l=x&0x0f;  
    h=(x&0xf0)>>4;  
    n=h*16+l;  
    return n;   
}

uchar readdht11_byte()
{   
    uchar i,dht;  
    for(i=8;i>0;i--)  
    {   
        dht=dht<<1;   
        while(!DATA); //等待50ms   
        delayus(30); //延時29us   
        if(DATA==1)   
        {
                dht=dht|0x01;   
                delayus(60);
        }   
        else     
        delayus(30); //延時29us              
    }
        return(dht);   
}
void read_dht11()
{   
    Start();
    DATA=0;       //數據線拉低>18ms  
    delay_ms(20); //延時>18ms
    DATA=1;       //拉高等待  
    delayus(30);  //延時29us  
    DATA=1;  
    if(!DATA)  
    {   
        while(!DATA);
        while(DATA);   
        RHH=readdht11_byte();//濕度整數數據  
        RHL=readdht11_byte();//濕度小數數據  
        CH=readdht11_byte();//溫度整數數據  
        CL=readdht11_byte();//溫度小數數據      
    }  
}
void wenxian(void)
{
     if(flag == 1)
         {
         LCDWritueString(0,2," -");
         LCDWritueString(0,4," -");
         LCDWritueString(1,0,"20");
     LCDWritueString(1,2,"年");
         LCDWritueString(1,4,"月");
         LCDWritueString(1,6,"日");
         LCDWritueString(2,0,"溫度:");
         LCDWritueString(3,0,"濕度:");
     read_dht11();
     m=integer(RHH);
         delay_ms(1);   
     n=integer(CH);
         lcd_pos(2,3);   
         lcd_wdat(mun_char_table[n/10]);
         lcd_wdat(mun_char_table[n%10]);
         lcd_pos(3,3);
         lcd_wdat(mun_char_table[m/10]);
         lcd_wdat(mun_char_table[m%10]);
         }
}

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 男人av网 | 久久久亚洲一区 | 成人免费视屏 | 天堂成人国产精品一区 | 欧美激情综合色综合啪啪五月 | 欧美日韩国产三级 | av中文网| 粉嫩一区二区三区四区公司1 | 黄色片在线看 | 亚洲一区 中文字幕 | 亚洲成人中文字幕 | 精品美女 | 中文字幕一区二区三区四区 | 三级视频在线观看电影 | 国产精品久久久久久久久久久久久 | 成人av高清| 亚洲日韩中文字幕一区 | 久久久久电影 | 日本在线视频一区二区 | 久久精品久久久 | 欧美一级大黄 | 狠狠色香婷婷久久亚洲精品 | 久久里面有精品 | www视频在线观看 | 国产一级片一区二区 | 欧美精品在线一区二区三区 | 午夜一级做a爰片久久毛片 精品综合 | 国产在线视频一区 | 特级做a爱片免费69 精品国产鲁一鲁一区二区张丽 | 亚洲国产一区二区三区在线观看 | 国产成人aⅴ| 精品乱子伦一区二区三区 | 欧美日韩高清 | 国产成人精品一区二区 | 久久久成人网 | 久久精品国产一区二区电影 | 日本在线黄色 | 成人久久久久 | 国产亚洲一区二区在线观看 | 狠狠入ady亚洲精品经典电影 | 国产成人综合在线 |