亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

標(biāo)題: 51單片機(jī)為基礎(chǔ)利用12864液晶利用兩個(gè)中斷制作的計(jì)時(shí)器和定時(shí)器 源程序注釋完整 [打印本頁(yè)]

作者: 闊少    時(shí)間: 2019-11-12 20:13
標(biāo)題: 51單片機(jī)為基礎(chǔ)利用12864液晶利用兩個(gè)中斷制作的計(jì)時(shí)器和定時(shí)器 源程序注釋完整
這是我在學(xué)習(xí)了中斷和LCD12864液晶后,將兩者結(jié)合寫出來(lái)的程序,實(shí)現(xiàn)了999倒計(jì)時(shí)功能,和計(jì)數(shù)器的功能。程序注釋完整可用,適合學(xué)51單片機(jī)的新手,希望大家多多參考學(xué)習(xí)哦~

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


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

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

  23. /*延時(shí)函數(shù)  延時(shí)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. /*以串行協(xié)議把數(shù)據(jù)按位發(fā)送,相當(dāng)于使用并行時(shí)接通八個(gè)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;                          //不加延時(shí),串口中每輸送一個(gè)數(shù)據(jù)都有要有個(gè)跳變沿,因此速度很快不需延時(shí)
  38.            LCD_EN=1;
  39.           }
  40.    delay(5);
  41. }

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

  52. /*寫數(shù)據(jù)命令函數(shù)*/
  53. void write_date(uchar date)
  54. {
  55.          LCD_RS=1;  
  56.          send_bit(0xfa);          //發(fā)送數(shù)據(jù)識(shí)別碼
  57.          send_bit(date&0xf0);      //發(fā)送高四位
  58.          send_bit((date<<4)&0xf0); //發(fā)送低四位
  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);                //基本指令操作                                         //可加延時(shí)也可不加,一般來(lái)說(shuō)液晶都是穩(wěn)定的
  68.         write_com(0x0c);                //開顯示,關(guān)光標(biāo),反白關(guān)
  69.         write_com(0x06);                //設(shè)置顯示格式,光標(biāo)位置
  70.         write_com(0x01);                //清除顯示,將DDRAM的地址計(jì)數(shù)器歸零
  71. }

  72. ///*********設(shè)定顯示位置************/
  73. void Set1_XY(uchar X, uchar Y)
  74. {
  75.         switch(X)
  76.         {
  77.                  case 1:write_com(0x80+Y); break; //當(dāng)X為1時(shí)執(zhí)行此程序,在第一行輸入
  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,"北京時(shí)間,");
  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;                                          //設(shè)置定時(shí)器工作方式
  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;         //定時(shí)器中斷允許位        ,打開T1中斷
  121.    ET1=1;
  122.    TR0=1;         //啟動(dòng)定時(shí)器0.INT1電平由高到低
  123.    TR1=1;
  124.    lcd_init();            //調(diào)用
  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. }
復(fù)制代碼

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


作者: 楊德金    時(shí)間: 2019-11-12 21:12
謝謝 共享




歡迎光臨 (http://www.denmoz.com/bbs/) Powered by Discuz! X3.1