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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2705|回復: 1
收起左側

51單片機為基礎利用12864液晶利用兩個中斷制作的計時器和定時器 源程序注釋完整

[復制鏈接]
ID:640681 發表于 2019-11-12 20:13 | 顯示全部樓層 |閱讀模式
這是我在學習了中斷和LCD12864液晶后,將兩者結合寫出來的程序,實現了999倒計時功能,和計數器的功能。程序注釋完整可用,適合學51單片機的新手,希望大家多多參考學習哦~

單片機源程序如下:
  1. /*看書的時候要十分重點去看寄存器,看到前面我剛開始也是看完之后似懂非懂,我就一直看一直看反復記憶,等覺得自己差不多了就開始看中斷程序,看了程序之后,我的天哪其實定時器初始化要寫的東西并不多,程序比那些復雜的文字要簡單多了,再加上程序后面的分析,我差不多就理解了,之后就用四位數碼管編寫了一個分秒程序,程序沒有錯誤沒有警告但是運行不了,找師兄看過之后他叫我不要深究在這里讓我去做定時器液晶,現在想想可能程序還是有點問題等有空再深究一下,不然怎么別人的可以用數碼管而我的不行呢。
  2. 我把程序寫出來之后不行,我是這么寫顯示的放在主函數中
  3. Write1_XY_string(2,0,"shi");
  4. 我知道可能是這里有了問題可我不會改,不知道如何下手,楊銘師兄就幫我改成了
  5. Set1_XY(2,0);
  6.   write_date(0x30+shi/10);
  7. 就可以運行了,因為這些要轉化成十進制的數要加上0x30所以要用這樣寫來轉換。
  8. 后來師兄想讓我做兩個定時器,一個是時鐘一個是定時的,他把思路告訴我了,后來我寫出來程序是OK的,其實理解了中斷之后多一個少一個都是一樣的。
  9. 我在寫的時候用上了那些C語言的符號
  10.     else         if(miao1==0&&fen1!=0)
  11. 我感覺這些很好用的,之前我是不會用的,慢慢的突然就想到就會用了哈哈,定時器我是寫程序的時候真的是走的挺快的因為沒有出現什么錯誤,所以我也不知道總結點什么,看書的時候多看看重點“寄存器”吧一定要看懂才行的。
  12. 我會繼續加油的!*/


  13. /*****  液晶12864頭文件  *****/
  14. #include<reg52.h>
  15. #define uchar unsigned char
  16. #define uint unsigned int
  17.                  
  18. sbit LCD_RS=P2^4;     //片選信號        
  19. sbit LCD_RW=P2^5;     //數據信號       
  20. sbit LCD_EN=P2^6;     //時鐘信號
  21. sbit LCD_PSB=P2^7;    //串、并行選擇信號

  22. uchar shi=00,fen=00,miao=00,num,shi1=99,fen1=99,miao1=99,num1;

  23. /*延時函數  延時xms*/
  24. void delay(uchar xms)
  25. {
  26.    uchar x,y;
  27.    for(x=xms;x>0;x--)
  28.       for(y=12;y>0;y--);
  29. }

  30. /*以串行協議把數據按位發送,相當于使用并行時接通八個DI口*/
  31. void send_bit(uchar byte)
  32. {
  33.    uchar i;
  34.    for(i=0;i<8;i++)
  35.       {
  36.            LCD_RW=((byte<<i)&0x80);                               
  37.            LCD_EN=0;                          //不加延時,串口中每輸送一個數據都有要有個跳變沿,因此速度很快不需延時
  38.            LCD_EN=1;
  39.           }
  40.    delay(5);
  41. }

  42. /*寫串口命令函數 */  
  43. void write_com(uchar com)
  44. {
  45.          LCD_RS=1;                             //串口中只要進行數據操作RS就將拉高
  46.          send_bit(0xf8);           //第一字節輸入寫指令
  47.          send_bit(com&0xf0);      //第二字節發送高四位
  48.          send_bit((com<<4)&0xf0); //第三字節發送低四位
  49.          delay(5);
  50.          LCD_RS=0;
  51. }

  52. /*寫數據命令函數*/
  53. void write_date(uchar date)
  54. {
  55.          LCD_RS=1;  
  56.          send_bit(0xfa);          //發送數據識別碼
  57.          send_bit(date&0xf0);      //發送高四位
  58.          send_bit((date<<4)&0xf0); //發送低四位
  59.          delay(5);
  60.          LCD_RS=0;
  61. }

  62. /*********液晶初始化*********/
  63. void lcd_init()
  64. {
  65.         LCD_PSB=0;                                  //串口
  66.         LCD_EN=0;
  67.         write_com(0x30);                //基本指令操作                                         //可加延時也可不加,一般來說液晶都是穩定的
  68.         write_com(0x0c);                //開顯示,關光標,反白關
  69.         write_com(0x06);                //設置顯示格式,光標位置
  70.         write_com(0x01);                //清除顯示,將DDRAM的地址計數器歸零
  71. }

  72. ///*********設定顯示位置************/
  73. void Set1_XY(uchar X, uchar Y)
  74. {
  75.         switch(X)
  76.         {
  77.                  case 1:write_com(0x80+Y); break; //當X為1時執行此程序,在第一行輸入
  78.                  case 2:write_com(0x90+Y); break; //第二行
  79.                  case 3:write_com(0x88+Y); break; //等三行
  80.                  case 4:write_com(0x98+Y); break; //第四行
  81.         }
  82.        
  83.    
  84. }
  85. //
  86. ///************寫字符串***************/
  87. //
  88.      void Write1_XY_string(uchar X, uchar Y, uchar *str)
  89.          {
  90.             uchar temp;
  91.                 Set1_XY(X,Y);
  92.                 temp=*str;
  93.                 while(temp!=0)
  94.                 {
  95.                      write_date(temp);                                          //輸出字符
  96.                      temp=*(++str);
  97.                 }
  98.          }
  99. //
  100. ////**************************************************//
  101. //
  102. ///************液晶顯示*************/
  103. //
  104.       void display1()
  105.           {

  106.                    Write1_XY_string(1,0,"北京時間,");
  107.                            Write1_XY_string(2,0," ");
  108.                            Write1_XY_string(3,0,"天氣陰");
  109.                            Write1_XY_string(4,0," ");

  110.           }
  111.         void main()
  112.         {
  113.                                                  
  114.    TMOD=0X10;                                          //設置定時器工作方式
  115.    TH0=(65536-45872)/256;                  //裝初值
  116.    TL0=(65536-45872)%256;
  117.    TH1=(65536-45872)/256;                  //裝初值
  118.    TL1=(65536-45872)%256;
  119.    EA=1;        //全局中斷,打開全局中斷
  120.    ET0=1;         //定時器中斷允許位        ,打開T1中斷
  121.    ET1=1;
  122.    TR0=1;         //啟動定時器0.INT1電平由高到低
  123.    TR1=1;
  124.    lcd_init();            //調用
  125.    display1();
  126.    while(1)
  127.    {
  128. //     Write1_XY_string(2,0,"shi");
  129. //         Write1_XY_string(2,2,":");
  130. //         Write1_XY_string(2,3,"fen");
  131. //         Write1_XY_string(2,5,":");  
  132. //            Write1_XY_string(2,6,"miao/10");
  133.          Set1_XY(2,0);
  134.   write_date(0x30+shi/10);          
  135.    write_date(0x30+shi%10);
  136.    Set1_XY(2,2);
  137.   write_date(':');
  138.    Set1_XY(2,3);
  139.   write_date(0x30+fen/10);
  140.    write_date(0x30+fen%10);
  141.    Set1_XY(2,5);
  142.   write_date(':');
  143.    Set1_XY(2,6);
  144.   write_date(0x30+miao/10);
  145.    write_date(0x30+miao%10);
  146. //********************************************//
  147. Set1_XY(4,0);
  148.   write_date(0x30+shi1/100);
  149.    write_date(0x30+shi1%100/10);
  150.    write_date(0x30+shi1%10);
  151.    Set1_XY(4,2);
  152.   write_date(':');
  153.    Set1_XY(4,3);
  154.   write_date(0x30+fen1/100);
  155.    write_date(0x30+fen1%100/10);
  156.    write_date(0x30+fen1%10);
  157.    Set1_XY(4,5);
  158.   write_date(':');
  159.    Set1_XY(4,6);
  160.   write_date(0x30+miao1/100);
  161.    write_date(0x30+miao1%100/10);
  162.    write_date(0x30+miao1%10);
  163.    }
  164.         }


  165. void time()interrupt 1
  166. {
  167.    TH0=(65536-45872)/256;                  //重裝初值
  168.    TL0=(65536-45872)%256;
  169.    num++;
  170.          if(num==20)
  171.                  {
  172.                     num=0;
  173.                          miao++;
  174.                         if(miao==60)
  175.                         {
  176.                                 fen++;
  177.                                 miao=0;
  178.                                  if(fen==60)
  179.                                  {
  180.                                    shi++;
  181.                                    fen=0;
  182.                                        if(shi==24)
  183.                                            {
  184.                                                      shi=0;
  185.                                            }
  186.                                  }
  187.                         }
  188.                  }

  189. }

  190. //************************************************************//

  191. void time1()interrupt 3
  192. {
  193.            TH1=(65536-45872)/256;                  //重裝初值
  194.        TL1=(65536-45872)%256;
  195.        num1++;
  196.            if(num1==20)
  197.            {
  198.                       num1=0;
  199.                   if(miao1!=0)
  200.                   {
  201.                             miao1--;
  202.                   }
  203.           else         if(miao1==0&&fen1!=0)
  204.                  {
  205.                            fen1--;
  206.                  }
  207.           else   if(fen1==0&&shi1!=0)
  208.                  {
  209.                            shi1--;
  210.                          }
  211.                    if(shi1==0)
  212.                    {
  213.                             shi1=99;
  214.                          fen1=99;
  215.                          miao1=99;
  216.                    }
  217.            }
  218. }
復制代碼

以上程序51hei提供下載:
中斷液晶兩個定時器.zip (34.85 KB, 下載次數: 22)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:16201 發表于 2019-11-12 21:12 | 顯示全部樓層
謝謝 共享
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表