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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

12864時(shí)鐘(定時(shí)器)+18b20+按鍵調(diào)時(shí)單片機(jī)程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:454712 發(fā)表于 2019-5-6 13:35 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本帖最后由 1367067553 于 2019-5-11 15:34 編輯
  1. #include <reg51.h>                                //頭文件
  2. #include <intrins.h>
  3. #define uint unsigned int                //宏定義
  4. #define uchar unsigned char
  5. /*TS12864A-3 端口定義*/
  6. #define LCD_data  P0             //數(shù)據(jù)口
  7. sbit LCD_RS  =  P3^5;            //寄存器選擇輸入
  8. sbit LCD_RW  =  P3^6;            //液晶讀/寫控制
  9. sbit LCD_EN  =  P3^4;            //液晶使能控制
  10. sbit LCD_PSB =  P3^7;            //串/并方式控制
  11. /*鍵盤定義*/
  12. sbit LIE1 = P2^4;                                 //定義列
  13. sbit LIE2 = P2^5;
  14. sbit LIE3 = P2^6;
  15. sbit LIE4 = P2^7;
  16. sbit HANG1 = P2^0;                                 //定義行
  17. sbit HANG2 = P2^1;
  18. sbit HANG3 = P2^2;
  19. sbit HANG4 = P2^3;
  20. sbit D1 = P1^3;
  21. sbit DQ = P1^1;                                          //定義DS18B20口
  22. sbit beep =P1^2;                                  //蜂鳴器
  23. /*變量定義*/
  24. uchar ucKeyNumber;                          //記錄按鍵值
  25. uchar ucMatrixStatus;             //矩陣鍵盤狀態(tài)
  26. uint uiMatrixCount;                      //矩陣鍵盤計(jì)數(shù)
  27. uint uiMatrixLieSelect;                  //矩陣鍵盤計(jì)數(shù)
  28. uchar ucMatrixTemp;                          //按鍵端口
  29. uchar ucStatus,flag=0,king;              //定義標(biāo)志位
  30. uint uiCount,uiStatus;
  31. uchar miao=48,fen=59,shi=23,nian=19,yue=5;ri=2;
  32. uchar mun_char_table[]={"0123456789"};
  33. /*函數(shù)調(diào)用*/
  34. void My_T0(void);                    //定時(shí)器初始化
  35. void delay(int ms);                    //LCD12864延時(shí)函數(shù)
  36. void lcd_wcmd(uchar cmd);                //寫命令
  37. void lcd_wdat(uchar dat);                //寫指令
  38. void lcd_init();                                //LCD12864初始化
  39. void LCDWrituenumber(uchar x,uchar y,uchar ucDAT);    //寫字符
  40. void lcd_pos(uchar X,uchar Y);                                              //寫字符串
  41. void xianshi(void);                            //顯示
  42. void kaiji(void);                            //開機(jī)動(dòng)畫
  43. void Matrix_keyboar(void);            //按鍵掃描
  44. void keyRun(void);                            //按鍵執(zhí)行

  45. /*********ds18b20模塊*************/
  46. void delay_us(uint i)
  47. {
  48.         while(i--);
  49. }
  50. //********DS18B20初始化************//
  51. void DS18B20_Init(void)
  52. {
  53.     uchar x;
  54.     DQ = 1;
  55.         delay_us(100);
  56.         DQ = 0;
  57.         delay_us(1000);
  58.         DQ = 1;
  59.         delay_us(200);
  60.         x = DQ;                                //DQ管腳送出60-240us的0脈沖 以示初始化成功
  61.         delay_us(250);
  62. }
  63. //************寫一個(gè)字節(jié)************//
  64. void write_OneChar(uchar dat)
  65. {
  66.    uchar i=0;
  67.    for(i = 8;i > 0;i--)
  68.    {
  69.       DQ = 0;
  70.           DQ = dat&0x01;
  71.           delay_us(60);
  72.           DQ = 1;
  73.           dat>>=1;
  74.    }
  75. }
  76. //************讀一個(gè)字節(jié)***********//
  77. uchar Read_OneChar(void)
  78. {
  79.    uchar i=0;
  80.    uchar value = 0;
  81.    for(i = 8;i > 0;i--)
  82.    {
  83.           DQ = 0;
  84.           value>>=1;
  85.           DQ = 1;
  86.           if(DQ)value|=0x80;            
  87.           delay_us(50);
  88.     }
  89.         return(value);
  90. }
  91. //**************讀取溫度**************//
  92. uint ReadTemperature(void)
  93. {
  94.           uchar a = 0;
  95.           uchar b = 0;
  96.           uint t = 0;
  97.           float tt = 0;
  98.           DS18B20_Init();
  99.           write_OneChar(0xcc);
  100.           write_OneChar(0x44);
  101.           DS18B20_Init();
  102.           write_OneChar(0xcc);
  103.           write_OneChar(0xbe);
  104.           a = Read_OneChar();
  105.           b = Read_OneChar();
  106.           t = b;
  107.           t <<= 8;
  108.           t = t|a;
  109.           tt = t*0.0625;
  110.           t = tt*10+0.5;
  111.           return(t);
  112. }
  113. /**************************************************
  114. *函數(shù)類型:main.c
  115. *函數(shù)名稱:主函數(shù)
  116. **************************************************/
  117. void main(void)
  118. {  
  119.     lcd_init();                //12864初始化
  120.     DS18B20_Init();        //18B20初始化        
  121.     while(1)
  122.     {        
  123.            My_T0();
  124.        kaiji();
  125.        xianshi();            
  126.     }
  127. }
  128. /**************************************************
  129. *             LCD12864模塊                                       
  130. /**************************************************/
  131. void delay(int ms)           //LCD12864延時(shí)函數(shù)
  132. {
  133.     while(ms--)
  134.         {
  135.       uchar i;
  136.           for(i=0;i<250;i++)  
  137.            {
  138.             _nop_();                           
  139.                 _nop_();
  140.                 _nop_();
  141.                 _nop_();
  142.            }
  143.         }
  144. }               
  145. /*******************************************************************/
  146. /*寫指令數(shù)據(jù)到LCD                                                  */
  147. /*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。                             */
  148. /*******************************************************************/
  149. void lcd_wcmd(uchar cmd)
  150. {                           
  151.     LCD_RS = 0;
  152.     LCD_RW = 0;
  153.     LCD_EN = 0;
  154.     _nop_();
  155.     _nop_();
  156.     P0 = cmd;
  157.     delay(1);
  158.     LCD_EN = 1;
  159.     delay(1);
  160.     LCD_EN = 0;  
  161. }
  162. /*******************************************************************/
  163. /*寫顯示數(shù)據(jù)到LCD                                                  */
  164. /*RS=H,RW=L,E=高脈沖,D0-D7=數(shù)據(jù)。                               */
  165. /*******************************************************************/
  166. void lcd_wdat(uchar dat)
  167. {                          
  168.     LCD_RS = 1;
  169.     LCD_RW = 0;
  170.     LCD_EN = 0;
  171.     P0 = dat;
  172.     delay(1);
  173.     LCD_EN = 1;
  174.     delay(1);
  175.     LCD_EN = 0;
  176. }
  177. /*******************************************************************/
  178. /*  LCD初始化設(shè)定                                                  */
  179. /*******************************************************************/
  180. void lcd_init()
  181. {
  182.     LCD_PSB = 1;         //并口方式   
  183.     lcd_wcmd(0x34);      //擴(kuò)充指令操作
  184.     delay(5);
  185.     lcd_wcmd(0x30);      //基本指令操作
  186.     delay(5);
  187.     lcd_wcmd(0x0C);      //顯示開,關(guān)光標(biāo)
  188.     delay(5);
  189.     lcd_wcmd(0x01);      //清除LCD的顯示內(nèi)容
  190.     delay(5);
  191. }
  192. /*********************************************************        
  193. *                                     寫字符                                                                 *
  194. **********************************************************/
  195. void LCDWritueString(uchar x,uchar y,uchar *str)          //固定格式
  196. {
  197.         uchar i;
  198.         lcd_pos(x,y);
  199.         i = 0;
  200.     while(str[i] != '\0')
  201.     {
  202.        lcd_wdat(str[i]);      //顯示字符
  203.        i++;
  204.     }
  205. }
  206. /*********************************************************        
  207. *                                    寫字符串                                                         *
  208. *********************************************************/
  209. void LCDWrituenumber(uchar x,uchar y,uchar ucDAT)
  210. {
  211.         lcd_pos(x,y);
  212.         lcd_wdat((ucDAT / 10)+ 48);
  213.         lcd_wdat((ucDAT % 10) + 48);   
  214.          
  215. }
  216. /*************************************************
  217. *                設(shè)定顯示位置                    *               
  218. *************************************************/
  219. void lcd_pos(uchar X,uchar Y)
  220. {                          
  221.    uchar  pos;
  222.    if (X==0)
  223.      {X=0x80;}
  224.    else if (X==1)
  225.      {X=0x90;}
  226.    else if (X==2)
  227.      {X=0x88;}
  228.    else if (X==3)
  229.      {X=0x98;}
  230.    pos = X+Y ;  
  231.    lcd_wcmd(pos);     //顯示地址
  232. }
  233. /**********************************************
  234. *               定時(shí)器初始化                              *
  235. **********************************************/
  236. void My_T0(void)
  237. {
  238.     TMOD = 0x01;
  239.     TH0 = (65536-1000)/256;
  240.     TL0 = (65536-1000)%256;
  241.     EA = 1;
  242.     ET0 = 1;
  243.     TR0 = 1;
  244. }
  245. /***********************************************
  246. *             定時(shí)器T0服務(wù)函數(shù)                                   *
  247. ***********************************************/
  248. void Tim0() interrupt 1
  249. {
  250.            TH0 = (65536-1000)/256;
  251.     TL0 = (65536-1000)%256;
  252.         Matrix_keyboar();
  253.         keyRun();
  254.         uiStatus++;
  255.         if(king == 0)
  256.         {
  257.            uiCount++;
  258.         }
  259.     if(uiCount >= 1000)
  260.     {
  261.            uiCount = 0;
  262.            miao++;
  263.            if(miao >=60)
  264.            {
  265.              miao = 0;
  266.              fen++;
  267.            }
  268.            if(fen >= 60)
  269.            {
  270.               fen = 0;
  271.                   shi++;
  272.            }
  273.            if(shi >= 24)
  274.            {
  275.                   shi = 0;
  276.                   ri++;
  277.            }
  278.            if(ri >=31)
  279.            {
  280.               ri = 0;
  281.               yue++;
  282.            }
  283.            if(yue >= 12)
  284.            {
  285.               yue = 0;
  286.                   nian++;
  287.            }
  288.     }

  289. }
  290. /***********************************************
  291. *                  顯示函數(shù)                                           *
  292. ***********************************************/                                   
  293. void xianshi(void)
  294. {
  295.    if(flag == 1)
  296.    {   
  297.        uint temp;
  298.            lcd_pos(0,1);   
  299.            lcd_wdat(mun_char_table[shi/10]);
  300.            lcd_wdat(mun_char_table[shi%10]);
  301.            LCDWritueString(0,2," -");
  302.            lcd_pos(0,3);   
  303.            lcd_wdat(mun_char_table[fen/10]);
  304.            lcd_wdat(mun_char_table[fen%10]);
  305.            LCDWritueString(0,4," -");
  306.            lcd_pos(0,5);   
  307.            lcd_wdat(mun_char_table[miao/10]);
  308.            lcd_wdat(mun_char_table[miao%10]);
  309.            lcd_pos(1,1);   
  310.            lcd_wdat(mun_char_table[nian/10]);
  311.            lcd_wdat(mun_char_table[nian%10]);
  312.            LCDWritueString(1,2,"年");
  313.            lcd_pos(1,3);   
  314.            lcd_wdat(mun_char_table[yue/10]);
  315.            lcd_wdat(mun_char_table[yue%10]);
  316.            LCDWritueString(1,4,"月");
  317.            lcd_pos(1,5);   
  318.            lcd_wdat(mun_char_table[ri/10]);
  319.            lcd_wdat(mun_char_table[ri%10]);
  320.            LCDWritueString(1,6,"日");
  321.            LCDWrituenumber(1,0,20);
  322.            /*   顯示溫度   */
  323.            temp=ReadTemperature();                //把讀到的溫度賦值給temp
  324.            LCDWritueString(3,0,"當(dāng)前溫度:");
  325.            lcd_pos(3,5);   
  326.            lcd_wdat(mun_char_table[temp/100]);
  327.            lcd_wdat(mun_char_table[temp%100/10]);
  328.        lcd_pos(3,6);  
  329.            LCDWritueString(3,6,".");
  330.            lcd_wdat(mun_char_table[temp%10]);
  331.            LCDWritueString(3,7,"度");
  332.            if(temp >= 250)
  333.            {
  334.               beep = ~beep;                         //蜂鳴器滴滴
  335.            }
  336.            else
  337.               beep = 1;
  338.    }
  339. }
  340. /*******************************************
  341. *               開機(jī)動(dòng)畫                                   *
  342. *******************************************/
  343. void kaiji(void)
  344. {
  345.    switch(ucStatus)
  346.    {
  347.         case 0: LCDWritueString(0,0,"大學(xué)生單片機(jī)競(jìng)賽");
  348.                     if(uiStatus >= 500)
  349.                             {
  350.                               uiStatus = 0;
  351.                                      ucStatus = 1;
  352.                             }
  353.                             break;
  354.             case 1: LCDWritueString(0,0,"                ");
  355.                     if(uiStatus >= 500)
  356.                             {
  357.                               uiStatus = 0;
  358.                                      ucStatus = 2;
  359.                             }
  360.                             break;
  361.             case 2: LCDWritueString(1,2,"H001組");
  362.                     if(uiStatus >= 500)
  363.                             {
  364.                               uiStatus = 0;
  365.                                      ucStatus = 3;
  366.                             }
  367.                             break;
  368.             case 3: LCDWritueString(1,2,"                ");
  369.                     if(uiStatus >= 500)
  370.                             {
  371.                               uiStatus = 0;
  372.                                      ucStatus = 4;
  373.                             }
  374.                             break;
  375.                 case 4: LCDWritueString(2,2,"只因追求");
  376.                     if(uiStatus >= 500)
  377.                             {
  378.                               uiStatus = 0;
  379.                                      ucStatus = 5;
  380.                             }
  381.                             break;
  382.             case 5: LCDWritueString(2,2,"               ");
  383.                     if(uiStatus >= 500)
  384.                             {
  385.                               uiStatus = 0;
  386.                                      ucStatus = 6;
  387.                             }
  388.                             break;                                                           
  389.                 case 6: LCDWritueString(3,2,"源于熱愛");
  390.                     if(uiStatus >= 500)
  391.                             {
  392.                               uiStatus = 0;
  393.                                      ucStatus = 7;
  394.                             }
  395.                             break;
  396.             case 7: LCDWritueString(3,2,"               ");
  397.                     if(uiStatus >= 500)
  398.                             {
  399.                               uiStatus = 0;
  400.                                   ucStatus = 8;
  401.                                      flag = 1;
  402.                             }
  403.                             break;
  404.                 case 8:        break;
  405.    }
  406. }
  407. ///////////////////*******以下為按鍵模塊********///////////////////
  408. /***********************************************
  409. *                                 矩陣鍵盤掃描
  410. ***********************************************/
  411. void Matrix_keyboar(void)
  412. {        
  413.         switch(ucMatrixStatus)
  414.         {
  415.                  case 0: if(uiMatrixLieSelect == 0)
  416.                                   {
  417.                                           LIE1 = 0;LIE2 = 1;LIE3 = 1;LIE4 = 1; //每一列 第一個(gè)
  418.                                  }
  419.                                  else if(uiMatrixLieSelect == 1)
  420.                                  {
  421.                                           LIE1 = 1;LIE2 = 0;LIE3 = 1;LIE4 = 1; //每一列 第二個(gè)
  422.                                  }
  423.                                  else if(uiMatrixLieSelect == 2)
  424.                                  {                                                                                   
  425.                                           LIE1 = 1;LIE2 = 1;LIE3 = 0;LIE4 = 1;  //每一列 第三個(gè)
  426.                                  }
  427.                                  else if(uiMatrixLieSelect == 3)
  428.                                  {
  429.                                           LIE1 = 1;LIE2 = 1;LIE3 = 1;LIE4 = 0;  //每一列 第四個(gè)
  430.                                  }
  431.                                  else
  432.                                  {
  433.                                           LIE1 = 1;LIE2 = 1;LIE3 = 1;LIE4 = 1;  //沒有列按下
  434.                                  }
  435.                                  ucMatrixStatus = 1;
  436.                                  break;
  437.                  case 1: if((HANG1 == 1) && (HANG2 == 1)&& (HANG3 == 1)&& (HANG4 == 1) )//沒有行按下
  438.                                   {
  439.                                           ucMatrixStatus = 0;          //重新掃描
  440.                                          uiMatrixLieSelect++;                  //逐行掃描
  441.                                          if(uiMatrixLieSelect > 3)uiMatrixLieSelect = 0;
  442.                                  }
  443.                                  else
  444.                                  {
  445.                                           uiMatrixCount++;                 //計(jì)時(shí)
  446.                                          if(uiMatrixCount >= 10)   //消抖
  447.                                          {
  448.                                                   uiMatrixCount = 0;                 //清零
  449.                                                  if((HANG1 == 1) && (HANG2 == 1)&& (HANG3 == 1)&& (HANG4 == 1))
  450.                                                  {
  451.                                                          ucMatrixStatus = 0;          //回到第一步
  452.                                                  }
  453.                                                  else
  454.                                                  {
  455.                                                         ucMatrixTemp = P2;
  456.                                                         ucMatrixStatus = 2;
  457.                                                  }
  458.                                          }
  459.                                  }
  460.                                  break;
  461.                 case 2:  if((HANG1 == 1) && (HANG2 == 1)&& (HANG3 == 1)&& (HANG4 == 1))
  462.                                  {
  463.                                          switch(ucMatrixTemp)
  464.                                         {
  465.                                                 case 0XEE: ucKeyNumber = 1;break;    //S1
  466.                                                 case 0XDE: ucKeyNumber = 2;break;         //S2
  467.                                                 case 0XBE: ucKeyNumber = 3;break;         //S3
  468.                                                 case 0X7E: ucKeyNumber = 4;break;         //S4

  469.                                                 case 0XED: ucKeyNumber = 5;break;         //S5
  470.                                                 case 0XDD: ucKeyNumber = 6;break;         //S6
  471.                                                 case 0XBD: ucKeyNumber = 7;break;         //S7
  472.                                                 case 0X7D: ucKeyNumber = 8;break;         //S8

  473.                                                 case 0XEB: ucKeyNumber = 9;break;         //S9
  474.                                                 case 0XDB: ucKeyNumber = 10;break;         //S10
  475.                                                 case 0XBB: ucKeyNumber = 11;break;         //S11
  476.                                                 case 0X7B: ucKeyNumber = 12;break;         //S12

  477.                                                 case 0XE7: ucKeyNumber = 13;break;         //S13
  478.                                                 case 0XD7: ucKeyNumber = 14;break;         //S14
  479.                                                 case 0XB7: ucKeyNumber = 15;break;         //S15
  480.                                                 case 0X77: ucKeyNumber = 16;break;         //S16
  481.                                         }
  482.                                             ucMatrixStatus = 0;
  483.                                  }
  484.                                  break;
  485.         }
  486. }
  487. /*************************************************
  488. *                 按鍵執(zhí)行                                                 *
  489. *************************************************/
  490. void keyRun(void)
  491. {
  492.    switch(ucKeyNumber)
  493.    {
  494.        case 1: king = 1;D1 = 0;ucKeyNumber = 0;break;                          //暫停
  495.            case 2: miao++;if(miao>=59)miao=0;ucKeyNumber = 0;break;                  //秒加                                                   
  496.            case 3: miao--;if(miao<=0)miao=0;ucKeyNumber = 0;break;                      //秒減
  497.            case 4: fen++;if(fen>=59)fen=0;ucKeyNumber = 0;break;                  //分加
  498.            case 5: fen--;if(fen<=0)fen=0;ucKeyNumber = 0;break;                                  //分減
  499.            case 6: shi++;if(shi>=23)shi=0;ucKeyNumber = 0;break;                      //時(shí)加
  500.            case 7: shi--;if(shi<=0)shi=0;ucKeyNumber = 0;break;                                  //時(shí)減
  501.            case 8: king = 0;D1 = 1;ucKeyNumber = 0;break;                                          //開啟
  502.    }
  503. }
復(fù)制代碼

12864時(shí)鐘.rar

41.65 KB, 下載次數(shù): 18, 下載積分: 黑幣 -5

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

使用道具 舉報(bào)

沙發(fā)
ID:1 發(fā)表于 2019-5-6 17:23 | 只看該作者
本帖需要重新編輯補(bǔ)全電路原理圖,源碼,詳細(xì)說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 成人小视频在线观看 | 亚洲视频免费在线观看 | 亚洲国产成人精品在线 | 国产精品视频久久 | av天空 | 四虎成人精品永久免费av九九 | 免费久久久 | 国产日韩精品在线 | 欧美videosex性极品hd | 国产欧美日韩精品在线观看 | 男人天堂网址 | 日韩在线小视频 | www.黄色在线观看 | 国产精品一区二区在线播放 | 欧美精品在线一区二区三区 | 在线观看av网站永久 | 亚洲成网 | 国产精品精品视频一区二区三区 | 精品一区二区三区av | 免费在线观看黄视频 | 亚洲一区二区三区在线视频 | 亚洲国产网址 | 日韩国产免费观看 | 亚洲一页 | 国产精品日韩欧美一区二区 | av中文字幕网 | 欧美激情精品久久久久久 | 免费在线黄 | 国产精品久久二区 | 啪啪毛片| 亚洲国产一区在线 | 自拍偷拍精品 | 欧美片网站免费 | 麻豆久久精品 | 久久亚洲综合 | 五月综合久久 | 羞羞的视频网站 | 日本一本在线 | 天天干夜夜操 | a在线v| 亚洲国产激情 |