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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3781|回復: 2
收起左側

1602LCD+52單片機做的計時器(全程小白親自注釋)

[復制鏈接]
ID:639140 發表于 2020-2-22 22:33 | 顯示全部樓層 |閱讀模式
“(分享文件)”
文章出自https://wenku.baidu.com/view/1e5616197375a417866f8f90.html
注釋是本人自己添加 按照初學小白的理解 通俗易懂 若有錯誤請各位指出以免誤人子 ,
蜂鳴器  按鍵 沒有測試  水平有限 沒看出控制它們程序在那段,請高手指出  自學艱難 全憑前人提攜
以下是程序原來的原理圖 和我自己開發板的型號(HC6800-MS原理圖)官網有資料
捕獲.PNG

控制端子已經匹配普中6800開發板
每隔一分鐘,蜂鳴器響一次,按鍵按一下,計數器清0

單片機源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>  //intrins.h,函數,應用于程序設計,一般出現在C51單片機編程中,一般程序中需要使用到空指令_nop_();字符循環移位指令_crol_等時使用。
  3.                      //crol_ 字符循環左移
  4.                        //_cror_ 字符循環右移
  5.     //_irol_ 整數循環左移
  6.     //_iror_ 整數循環右移
  7.     //_lrol_ 長整數循環左移
  8.     //_lror_ 長整數循環右移
  9.     //_nop_ 空操作 (相當于8051 NOP 指令)
  10.     //_testbit_ 測試并清零位 (相當于8051 JBC 指令)


  11. #define uchar unsigned char
  12. #define uint unsigned int
  13. sbit RS=P2^6;
  14. sbit RW=P2^5;
  15. sbit EN=P2^7;  
  16. uchar code dis2[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};  //1-9
  17. uchar code p[]="-";//code 可以不加,加了之后就是固定了這個數組不能對其進行操作、、這個一定要注意。。。

  18. uchar j,k,kk,miao,miao1,fen,fen1,shi,shi1;
  19. void delay_ms(int x)//延時程序,延時1ms
  20. {

  21. uint i;

  22. while(x--)

  23. for(i=0;i<120;i++);
  24. }  
  25. uchar busy()//對LCD1602  判斷是否忙

  26. {

  27. uchar status; //聲明函數status

  28. RS=0; //讀內部寄存器狀態算是讀指令選擇  RS=0指令選擇

  29. RW=1; //讀操作

  30. EN=1;//使能信號也就是開始工作的意思 ,讀操作一直高電平,寫操作只是高脈沖

  31. delay_ms(1);

  32. status=P0;  //函數定義為P0,就是說p0是數據口 00-07 8個端子要是07是高電位就是1602忙碌 07是低電平就是閑

  33. EN=0; //讀操作完成 拉低使能信號,為下次工作做準備

  34. return status; //return 返回函數 讀取完P0口數據返回主函數
  35. }  
  36. void write_cmd(uchar cmd)//寫命令程序,首先對其進行判忙

  37. {

  38. while((busy()&0x80)==0x80);//對返回進行或運算判斷全1則1,如果為忙就進行等待


  39. RS=0; //命令選擇

  40. RW=0; //寫操作

  41. EN=0;// 片選信號拉低準備工作

  42. P0=cmd; //函數cmd的數據放到P0上

  43. EN=1; //片選信號開始工作

  44. delay_ms(1);

  45. EN=0;//拉低片選為下次做準備
  46. }  
  47. void write_data(uchar dat) //寫數據函數函數dat
  48. {
  49. while((busy()&0x80)==0x80); //忙判斷 或-全1則1

  50. RS=1; //數據選擇

  51. RW=0; //寫操作

  52. EN=0; //片選信號

  53. P0=dat; //P0讀取dat

  54. EN=1; //開始傳送

  55. delay_ms(1);

  56. EN=0; //拉低片選信號
  57. }  
  58. void canshu() //初始化1602函數  百度一大把
  59. {

  60. write_cmd(0x38);

  61. delay_ms(1);

  62. write_cmd(0x01);

  63. delay_ms(1);

  64. write_cmd(0x06);

  65. delay_ms(1);

  66. write_cmd(0x0c);

  67. delay_ms(1);
  68. }  
  69. *****************************************************************************


  70. ********************************************************************************
  71. /*void xianshi(uchar x,uchar y,uchar *str) //*str是指針字符串的指針,xy可能是數據指針函數
  72. {

  73. uint i=0; //聲明函數i并且賦值0

  74. if(y==0) //當函數y=0時 為真  可能是寫在第一行的意思

  75. write_cmd(0x80|x); //執行命令x和0x80(1000 0000)相與 全1是1得出命令 執行

  76. if(y==1)  //當函數y=1時 為真  可能是寫在第二行的意思

  77. write_cmd(0xc0|x); //執行命令x和0xc0(1100 0000|x)相與 全1是1得出命令 執行 0xc0=0x80+0x40

  78. for(i=0;i<16;i++) //i值循環增加  不知所云

  79. {


  80. write_data(str[i]); //*str是指針字符串的指針,
  81.                     //str[i]的意思可能是把i變成字符串 當數據執行  出自百度介紹 不是很懂


  82. if(p=='\0') //字符串判斷結束標志  如果p的ascii碼為0  好像是把一個字符串賦值給數組:u8 str1[]={"cxjr.21ic.org"};
  83.               //實際上數組str1在內存中的實際存放情況為:
  84.             //  c x j r . 2 1 i c . o r g '\0'出自百度 介紹

  85.                //這后面的'\0'是由C編譯系統自動加上的。所以在用字符串賦初值時一般無須指定數組的長度, 而由系統自行處理。


  86. break;

  87. }
  88. } */

  89. void aaa() interrupt 1 //定時器aaa函數中斷入口1
  90. {

  91. TH0=(65535-50000)/256; //50ms一中斷

  92. TL0=(65535-50000)%256;

  93. if(++kk==40) //k先+在判斷是否=18 kk可能是中斷函數 先++在計算是為了從0開始計數 后++可能從1 開始
  94. {
  95. miao++; //kk中斷18次時間秒自加1
  96. if(miao==10) //當個位=10
  97. {
  98.     if(miao1++==5) //miao1 自加一次 直到5次以后秒數達到59 后條件導通程序往下一步走
  99.       {
  100.        if(fen++==10)
  101.         {
  102.          if(fen1++==5)
  103.            {
  104.             if(shi++==10)
  105.              {
  106.               
  107.               if(shi1++==1)
  108.                 {
  109.                   shi1=0;
  110.                    shi=0;
  111.                  }
  112.    
  113.                  shi=0;
  114.              }
  115.               fen1=0;
  116.             }
  117.           fen=0;
  118.           }
  119.        miao1=0;
  120.        }
  121.       miao=0;
  122.       }
  123.       kk=0;
  124.      }
  125.     }
  126. void main()  
  127. {
  128. P1=0x00;//我自己加的  要不然 開機顯示小黑塊  前一個帖子 有介紹 理由參照6800開發板原理圖
  129. P2=0X06; //同上   
  130. canshu();
  131. //xianshi(0,0,p);//不清楚
  132. //xianshi(0,1,p+16);// 不清楚
  133. EA=1;
  134.   ET0=1;
  135. TMOD=0x01;
  136. TH0=(65535-50000)/256;//如果不準可對其進行修改,比如4000可能更準確  TL0=(65535-50000)%256;
  137. TL0=(65535-50000)%256;  TR0=1;
  138.   while(1)
  139.    {
  140.      write_cmd(0x80|1); //1000 0001  相與有1則一 這個是時的位置
  141.    
  142.      write_data(dis2[shi]); //dis2[]1-9數組名字 這個是時的顯示
  143.      
  144.      write_cmd(0x80|2);//10000010 也就是十六進制0x82代表時的個位顯示位置
  145.      
  146.      write_data(dis2[shi1]);//1-9數組選擇小時的個位
  147.      
  148.      write_cmd(0x80|3);//地址0x83 在這個地址上寫
  149.    
  150.      write_data(p[0]);//數據為第二個數組的0位 這個數組就一個-符號
  151.      write_cmd(0x80|4); //地址0x84  也就是分的十位
  152.      
  153.      write_data(dis2[fen1]); //寫數據函數 寫數組制定數據到分的十位
  154.      
  155.      write_cmd(0x80|5);//以下類同
  156.    
  157.      write_data(dis2[fen]);
  158.      
  159.      write_cmd(0x80|6);
  160.    
  161.      write_data(p[0]);
  162.      write_cmd(0x80|7);
  163.      
  164.      write_data(dis2[miao1]);

  165.      write_cmd(0x80|8);
  166.      write_data(dis2[miao]);
  167.     }
  168. }
復制代碼


評分

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

查看全部評分

回復

使用道具 舉報

ID:535242 發表于 2020-2-23 12:57 | 顯示全部樓層
目前正在學習  加油
回復

使用道具 舉報

ID:639140 發表于 2022-5-3 17:33 | 顯示全部樓層
溫故而知新 最近在家 又把注釋理解添加一遍 按照初學的水平做到注釋  很多人說注釋做到不規范,這個正常 因為我連規范是什么都不清楚 只當又做了一次筆記

單片機源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>  //intrins.h,函數,應用于程序設計,一般出現在C51單片機編程中,一般程序中需要使用到空指令_nop_();字符循環移位指令_crol_等時使用。
  3.                      //crol_ 字符循環左移
  4.                        //_cror_ 字符循環右移
  5.     //_irol_ 整數循環左移
  6.     //_iror_ 整數循環右移
  7.     //_lrol_ 長整數循環左移
  8.     //_lror_ 長整數循環右移
  9.     //_nop_ 空操作 (相當于8051 NOP 指令)
  10.     //_testbit_ 測試并清零位 (相當于8051 JBC 指令)


  11. #define uchar unsigned char

  12. #define uint unsigned int

  13. sbit RS=P2^6;

  14. sbit RW=P2^5;

  15. sbit EN=P2^7;  

  16. uchar code dis2[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};  //1-9

  17. uchar code p[]="-";//code 可以不加,加了之后就是固定了這個數組不能對其進行操作、、這個一定要注意。。。

  18. uchar j,k,kk,miao,miao1,fen,fen1,shi,shi1;

  19. void delay_ms(int x)//延時程序,延時1ms

  20.   {

  21.     uint i;

  22.     while(x--)

  23.     for(i=0;i<120;i++);
  24.    }  
  25.     uchar busy()//對LCD1602  判斷是否忙

  26.      {

  27.        uchar status; //聲明函數status

  28.        RS=0; //讀內部寄存器狀態算是讀指令選擇  RS=0指令選擇

  29.        RW=1; //讀操作

  30.        EN=1;//使能信號也就是開始工作的意思 ,讀操作一直高電平,寫操作只是高脈沖

  31.        delay_ms(1);

  32.        status=P0;  //status是子函數聲明的函數入口函數定義為P0,就是說p0是數據口 00-07 8個端子要是07是高電位就是1602忙碌 07是低電平就是閑,status是子函數聲明的函數入口

  33.        EN=0;       //讀操作完成 拉低使能信號,為下次工作做準備

  34.        return status; //return 返回函數 讀取完P0口數據返回主函數
  35.       }  
  36.       


  37.        void write_cmd(uchar cmd)//寫命令程序,首先對其進行判忙

  38.         {

  39.             while((busy()&0x80)==0x80);//對返回進行或運算判斷全1則1,如果為忙就進行等待


  40.             RS=0; //命令選擇

  41.             RW=0; //寫操作

  42.             EN=0;// 片選信號拉低準備工作

  43.             P0=cmd; //函數cmd的數據放到P0上

  44.             EN=1; //片選信號開始工作

  45.             delay_ms(1);

  46.             EN=0;//拉低片選為下次做準備
  47.          }  


  48. void write_data(uchar dat) //寫數據函數函數dat
  49.   {
  50.     while((busy()&0x80)==0x80); //忙判斷 或-全1則1

  51.     RS=1; //數據選擇

  52.     RW=0; //寫操作

  53.     EN=0; //片選信號

  54.     P0=dat; //P0讀取dat

  55.     EN=1; //開始傳送

  56.     delay_ms(1);

  57.     EN=0; //拉低片選信號
  58.   }  
  59. void canshu() //初始化1602函數  百度一大把
  60. {

  61. write_cmd(0x38); //寫命令函數 命令數據0X38=111000,初始化設置16*2顯示 5*7點陣,8為數據接口

  62. delay_ms(1);

  63. write_cmd(0x01);//清屏

  64. delay_ms(1);

  65. write_cmd(0x06);//指針自動加1

  66. delay_ms(1);

  67. write_cmd(0x0c);//開光標顯示 不顯示

  68. delay_ms(1);
  69. }  
  70. *****************************************************************************

  71.           這里沒有數據地址命令 因為數據地址再別的函數里面給定

  72. ********************************************************************************


  73. /*void xianshi(uchar x,uchar y,uchar *str) //*str是指針字符串的指針,xy可能是數據指針函數
  74. {

  75. uint i=0; //聲明函數i并且賦值0

  76. if(y==0) //當函數y=0時 為真  可能是寫在第一行的意思

  77. write_cmd(0x80|x); //執行命令x和0x80(1000 0000)相與 全1是1得出命令 執行

  78. if(y==1)  //當函數y=1時 為真  可能是寫在第二行的意思

  79. write_cmd(0xc0|x); //執行命令x和0xc0(1100 0000|x)相與 全1是1得出命令 執行 0xc0=0x80+0x40

  80. for(i=0;i<16;i++) //i值循環增加  不知所云

  81. {


  82. write_data(str[i]); //*str是指針字符串的指針,
  83.                     //str[i]的意思可能是把i變成字符串 當數據執行  出自百度介紹 不是很懂


  84. if(p=='\0') //字符串判斷結束標志  如果p的ascii碼為0  好像是把一個字符串賦值給數組:u8 str1[]={"0000.0000.000"};
  85.               //實際上數組str1在內存中的實際存放情況為:
  86.             // '\0'出自百度 介紹

  87.                //這后面的'\0'是由C編譯系統自動加上的。所以在用字符串賦初值時一般無須指定數組的長度, 而由系統自行處理。


  88. break;

  89. }
  90. } */  8*******************************************************

  91.      廢函數臥槽 剛發現源程序這個子函數開頭有斜杠 是個廢函數
  92.    

  93.      **************************************************************



  94. void aaa() interrupt 1 //定時器aaa函數中斷入口1
  95. {

  96.   TH0=(65535-50000)/256; //50ms一中斷

  97.    TL0=(65535-50000)%256;

  98.    if(++kk==40) //****************k先+在判斷是否=40 kk可能是中斷函數 先++在計算是為了從0開始計數 后++可能從1 開始   語法格式等同于   ++kk
  99.                  ********************kk是全局變量                                                                                  if(k=40)
  100.    {
  101.      miao++; //********************kk中斷40次時間秒自加1
  102.      
  103.      if(miao==10) //當個位=10
  104.        {
  105.           if(miao1++==5) //miao1 自加一次 直到5次以后秒數達到59 后條件導通程序往下一步走
  106.             {
  107.               if(fen++==10)
  108.                 {
  109.                   if(fen1++==5)
  110.                    {
  111.                      if(shi++==10)
  112.                       {
  113.               
  114.                        if(shi1++==1)
  115.                         {
  116.                           shi1=0;
  117.                            shi=0;
  118.                         }
  119.    
  120.                        shi=0;
  121.                       }
  122.                     fen1=0;
  123.                     }
  124.                      fen=0;
  125.                  }
  126.        miao1=0;
  127.        }
  128.       miao=0;
  129.       }
  130.       kk=0;
  131.      }
  132.     }
  133. void main()  
  134. {
  135. P1=0x00;//我自己加的  要不然 開機顯示小黑塊  前一個帖子 有介紹 理由參照6800開發板原理圖

  136. P2=0X06; //同上   

  137. canshu();// //初始化1602函數  百度一大把

  138. xianshi(0,0,p);//子函數 沒用  //

  139. xianshi(0,1,p+16);// 子函數 沒用
  140. EA=1;
  141.   
  142. ET0=1;

  143. TMOD=0x01;

  144. TH0=(65535-50000)/256;//如果不準可對其進行修改,比如4000可能更準確  TL0=(65535-50000)%256;

  145. TL0=(65535-50000)%256;  TR0=1;
  146.   while(1)
  147.    {
  148.      write_cmd(0x80|1); //*********************1000 0001  相與有1則一 這個是時的位置               光標起始位置加一是小時十位的位置
  149.    
  150.      write_data(dis2[shi]); //************* //dis2[]1-9數組名字 這個是時的顯示  
  151.                                 

  152.                                   write_data寫數據函數 數據內容是數組dis2(全局變量)
  153.                                 

  154.                                   shi也是全局變量 shi=1 顯示數組第一個字符1
  155.      
  156.      


  157. write_cmd(0x80|2);//10000010 也就是十六進制0x82代表時的個位顯示位置
  158.      
  159.      write_data(dis2[shi1]);//1-9數組選擇小時的個位
  160.      
  161.      write_cmd(0x80|3);//地址0x83 在這個地址上寫
  162.    
  163.      write_data(p[0]);//數據為第二個數組的0位 這個數組就一個-符號
  164.      write_cmd(0x80|4); //地址0x84  也就是分的十位
  165.      
  166.      write_data(dis2[fen1]); //寫數據函數 寫數組制定數據到分的十位
  167.      
  168.      write_cmd(0x80|5);//以下類同
  169.    
  170.      write_data(dis2[fen]);
  171.      
  172.      write_cmd(0x80|6);
  173.    
  174.      write_data(p[0]);
  175.      write_cmd(0x80|7);
  176.      
  177.      write_data(dis2[miao1]);

  178.      write_cmd(0x80|8);
  179.      write_data(dis2[miao]);
  180.     }
  181. }
復制代碼

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品精品久久久 | 亚洲午夜一区二区 | 国产成人av在线 | 精国产品一区二区三区 | 欧美v日韩v| 韩国av一区二区 | 久久久久欧美 | 国产做爰 | 中文字幕免费在线观看 | av不卡一区 | 天天操天天拍 | 成人在线视频看看 | 日韩久久久久 | 在线中文字幕第一页 | av在线三级| 日本在线免费视频 | 黑人精品xxx一区一二区 | 免费黄色网址视频 | 久草青青草 | 视频在线一区二区 | 日韩中文字幕免费 | 中文字幕av网 | 在线一区二区三区 | 天天操网 | 狠狠色综合网站久久久久久久 | 日韩欧美精品一区 | 成人精品在线观看 | 国产精品久久久久久久一区二区 | 中文字幕一区在线观看视频 | 九九色综合 | 国产探花在线精品一区二区 | 精品一区精品二区 | 黄色高清视频 | 久久九九色 | 国产黄色av电影 | 欧美精品乱码99久久影院 | 99只有精品 | 在线观看国产 | 久久福利 | av一级久久| 中文字幕视频在线观看 |