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

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

QQ登錄

只需一步,快速開始

搜索
查看: 2360|回復(fù): 1
收起左側(cè)

單片機(jī)定時(shí)器LCD顯示加音樂加流水燈程序

[復(fù)制鏈接]
ID:230208 發(fā)表于 2017-9-5 17:57 | 顯示全部樓層 |閱讀模式
單片機(jī)定時(shí)器LCD顯示加音樂加流水燈

單片機(jī)源程序如下:

  1. #include<reg51.h>       //調(diào)用51單片機(jī)的頭文件
  2. #define uchar unsigned char
  3. #define uint  unsigned  int
  4. //---------------------------------------
  5. //1602液晶相關(guān)I/O設(shè)置
  6. //sbit E=P2^3;               //1602液晶的E腳接在P2.3口上
  7. //sbit RW=P2^4;              //1602液晶的RW腳接在P2.4口上
  8. //sbit RS=P2^5;              //1602液晶的RS腳接在P2.5口上
  9. sbit E=P2^7;               //1602液晶的E腳接在P2.3口上
  10. sbit RW=P2^5;              //1602液晶的RW腳接在P2.4口上
  11. sbit RS=P2^6;              //1602液晶的RS腳接在P2.5口上
  12. sbit Busy=P0^7;

  13. //按鍵相關(guān)I/O設(shè)置
  14. sbit key1=P3^0;
  15. sbit key2=P3^1;
  16. sbit key3=P3^2;

  17. //sbit beep = P1^3;
  18. sbit beep = P1^5;

  19. uchar code word1[]={"   TIME  STOP   "};
  20. uchar code word2[]={"   TIME  SET!   "};
  21. uchar code word3[]={"   TIME  START  "};
  22. //---------------------------------------
  23. unsigned char i;
  24. unsigned char menu;
  25. signed int Time_bai,Time_ge;
  26. bit Adjust;
  27. //---------------------------------------
  28. //1602液晶寄存器設(shè)置
  29. unsigned int  DISbuf_ge,DISbuf_bai;     //設(shè)置16位的unsigend int型寄存器用來暫存1602要顯示的內(nèi)容
  30. //---------------------------------------
  31. uchar code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,

  32. 212,212,106,126,159,169,190,119,119,126,159,142,159,0};


  33. uchar code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,

  34. 9,3,12,12,12,12,12,9,3,12,12,12,24,0};
  35. void Display();
  36. void DelayMS(uint ms)
  37. {
  38.         uchar t;
  39.         while(ms--)
  40.         {
  41.                  for(t=0;t<120;t++);
  42.         }
  43. }
  44. void PlayMusic()

  45. {

  46.         uint i=0,j,k;
  47.        
  48.         while(SONG_LONG[i]!=0||SONG_TONE[i]!=0)
  49.        
  50.         { //播放各個(gè)音符,SONG_LONG 為拍子長度
  51.        
  52.                 for(j=0;j<SONG_LONG[i]*20;j++)
  53.                
  54.                 {
  55.                
  56.                         beep=~beep;
  57.                         if(Adjust==1)
  58.                                 break;
  59.                        
  60.                         //SONG_TONE 延時(shí)表決定了每個(gè)音符的頻率
  61.                        
  62.                         for(k=0;k<SONG_TONE[i]/3;k++);
  63.                
  64.                 }
  65.                
  66.                  DelayMS(70);
  67.                  i++;
  68.        
  69.         }

  70. }
  71. void led()
  72. {
  73.         P2 = P2 << 1;           //第一次循環(huán),led1亮,其他都不亮
  74.         if(P2 == 0x00)     //全部移出
  75.         P2 = 0x01;
  76. }
  77. //---------------------------------------
  78. //名稱:1602液晶用延時(shí)函數(shù)
  79. //---------------------------------------
  80. void Delay1602(unsigned int t)
  81. {
  82.      unsigned int k;      //定義一個(gè)16位寄存器用來做延時(shí)用
  83.      for(k=0;k<t;k++);    //延時(shí)
  84. }

  85. //---------------------------------------
  86. //名稱:1602液晶忙檢測函數(shù)
  87. //---------------------------------------
  88. void LCD1602_busy(void)
  89. {
  90.      Busy=1;              //將P0.7置1,為讀狀態(tài)做準(zhǔn)備
  91.      RS=0;                //RS=0、RW=1、E=1時(shí),忙信號(hào)輸出到DB7,由P0.7讀入
  92.      RW=1;                //RS=0、RW=1、E=1時(shí),忙信號(hào)輸出到DB7,由P0.7讀入
  93.      E=1;                 //RS=0、RW=1、E=1時(shí),忙信號(hào)輸出到DB7,由P0.7讀入
  94.      while(Busy==1);      //由P0.7讀入1,表示1602液晶忙,需要等待
  95.      E=0;                 //讀完以后,恢復(fù)E的電平
  96. }

  97. //---------------------------------------
  98. //名稱:1600寫命令函數(shù)
  99. //適用:給力者GL9單片機(jī)開發(fā)學(xué)習(xí)系統(tǒng)
  100. //公司:寧波芯動(dòng)電子有限公司
  101. //網(wǎng)址:www.MovingChip.com
  102. //日期:20120914
  103. //---------------------------------------
  104. void LCD1602_Write_com(unsigned char combuf)
  105. {
  106.      RS=0;                //選擇指令寄存器
  107.      RW=0;                //選擇寫狀態(tài)
  108.      P0=combuf;           //將命令字通過P0口送至DB
  109.      E=1;                 //E高電平將命令字寫入1602液晶
  110.      E=0;                 //寫完以后,恢復(fù)E的電平
  111. }

  112. //---------------------------------------
  113. //名稱:1602寫命令函數(shù)(帶忙檢測)
  114. //---------------------------------------
  115. void LCD1602_Write_com_busy(unsigned char combuf)
  116. {
  117.      LCD1602_busy();            //調(diào)用忙檢測函數(shù)
  118.      LCD1602_Write_com(combuf); //調(diào)用忙檢測函數(shù)
  119. }

  120. //---------------------------------------
  121. //名稱:1602寫數(shù)據(jù)函數(shù)(帶忙檢測)
  122. //---------------------------------------
  123. void LCD1602_Write_data_busy(unsigned char databuf)
  124. {
  125.      LCD1602_busy();      //調(diào)用忙檢測函數(shù)
  126.      RS=1;                //選擇數(shù)據(jù)寄存器
  127.      RW=0;                //選擇寫狀態(tài)
  128.      P0=databuf;          //將命令字通過P0口送至DB
  129.      E=1;                 //E高電平將命令字寫入1602液晶
  130.      E=0;                 //寫完以后,恢復(fù)E的電平
  131. }

  132. //---------------------------------------
  133. //名稱:1602液晶顯示地址寫函數(shù)
  134. //適用:給力者GL9單片機(jī)開發(fā)學(xué)習(xí)系統(tǒng)
  135. //公司:寧波芯動(dòng)電子有限公司
  136. //網(wǎng)址:www.MovingChip.com
  137. //日期:20120914
  138. //---------------------------------------
  139. void LCD1602_Write_address(unsigned char x,unsigned char y)
  140. {
  141.      x&=0x0f;             //列地址限制在0-15間
  142.      y&=0x01;             //行地址限制在0-1間
  143.      if(y==0)             //如果是第一行
  144.          LCD1602_Write_com_busy(x|0x80);        //將列地址寫入
  145.      else                 //如果是第二行
  146.          LCD1602_Write_com_busy((x+0x40)|0x80); //將列地址寫入
  147. }

  148. //---------------------------------------
  149. //名稱:1602液晶初始化函數(shù)
  150. //---------------------------------------
  151. void LCD1602_init(void)
  152. {
  153.      Delay1602(1500);               //調(diào)用延時(shí)函數(shù)
  154.      LCD1602_Write_com(0x38);       //8位數(shù)據(jù)總線,兩行顯示模式,5*7點(diǎn)陣顯示
  155.      Delay1602(500);                //調(diào)用延時(shí)函數(shù)
  156.      LCD1602_Write_com(0x38);       //8位數(shù)據(jù)總線,兩行顯示模式,5*7點(diǎn)陣顯示
  157.      Delay1602(500);                //調(diào)用延時(shí)函數(shù)
  158.      LCD1602_Write_com(0x38);       //8位數(shù)據(jù)總線,兩行顯示模式,5*7點(diǎn)陣顯示
  159.      LCD1602_Write_com_busy(0x38);  //8位數(shù)據(jù)總線,兩行顯示模式,5*7點(diǎn)陣顯示
  160.      LCD1602_Write_com_busy(0x08);  //顯示功能關(guān),無光標(biāo)
  161.      LCD1602_Write_com_busy(0x01);  //清屏
  162.      //LCD1602_Write_com_busy(0x06);  //寫入新的數(shù)據(jù)后,光標(biāo)右移,顯示屏不移動(dòng)
  163.      LCD1602_Write_com_busy(0x0C);  //顯示功能開,無光標(biāo)
  164. }

  165. //---------------------------------------
  166. //名稱:1602液晶指定地址顯示函數(shù)
  167. //---------------------------------------
  168. void LCD1602_Disp(unsigned char x,unsigned char y,unsigned char buf)
  169. {
  170.      LCD1602_Write_address(x,y);    //先將地址信息寫入
  171.      LCD1602_Write_data_busy(buf);  //再寫入要顯示的數(shù)據(jù)
  172. }

  173. //---------------------------------------
  174. //名稱:1602液晶將字符輸出到液晶顯示
  175. //---------------------------------------
  176. void Print(unsigned char x,unsigned char y,unsigned char *str)
  177. {
  178.     LCD1602_Write_address(x,y);
  179.         while(*str!='\0')
  180.     {
  181.         LCD1602_Write_data_busy(*str);
  182.         str++;
  183.     }
  184. }
  185. //---------------------------------------
  186. //名稱:Delay10ms延時(shí)10毫秒函數(shù)
  187. //---------------------------------------
  188. void Delay10ms(void)   //誤差 0us
  189. {
  190.     unsigned char a,b,c;
  191.     for(c=1;c>0;c--)
  192.         for(b=38;b>0;b--)
  193.             for(a=130;a>0;a--);
  194. }
  195. void keyscan()
  196. {
  197.         if(key1==0)                //檢測按鍵K1是否按下
  198.         {
  199.                 Delay10ms();        //消除抖動(dòng)
  200.                 while(key1==0);
  201.                 menu++;
  202.                 if(menu==3)
  203.                         menu=1;
  204.                 Adjust=1;
  205.         }
  206.         if(menu==1)
  207.         {       
  208.                 Print(0,0,word2);
  209.                 DISbuf_bai=0;
  210.                 DISbuf_ge=0;
  211.                 LCD1602_Disp(2,1,DISbuf_bai/1000+'0');       //在第1行的第1列顯示千位
  212.               LCD1602_Disp(3,1,(DISbuf_bai%1000)/100+'0'); //在第1行的第2列顯示百位
  213.                   LCD1602_Disp(4,1,':');
  214.               LCD1602_Disp(5,1,(DISbuf_ge%100)/10+'0');   //在第1行的第3列顯示十位
  215.                LCD1602_Disp(6,1,DISbuf_ge%10+'0');         //在第1行的第4列顯示個(gè)位
  216.                 if(key2==0)                //檢測按鍵K1是否按下
  217.                 {
  218.                         Delay10ms();        //消除抖動(dòng)
  219.                         while(key2==0);
  220.                         Time_ge++;
  221.                         if(Time_ge>59)
  222.                         {
  223.                                 Time_ge=0;
  224.                                 Time_bai++;
  225.                         }       
  226.                 }
  227.                 if(key3==0)                //檢測按鍵K1是否按下
  228.                 {
  229.                         Delay10ms();        //消除抖動(dòng)
  230.                         while(key3==0);
  231.                         Time_ge--;
  232.                         if(Time_ge<0)
  233.                         {
  234.                                 Time_ge=59;
  235.                                 Time_bai--;
  236.                         }
  237.                
  238.                 }
  239.         }
  240.         if(menu==2)
  241.         {       
  242.                 if(key2==0)                //檢測按鍵K1是否按下
  243.                 {
  244.                         Delay10ms();        //消除抖動(dòng)
  245.                         while(key2==0);
  246.                         Print(0,0,word3);
  247.                         Adjust=0;       
  248.                 }
  249.                 if(key3==0)                //檢測按鍵K1是否按下
  250.                 {
  251.                         Delay10ms();        //消除抖動(dòng)
  252.                         while(key3==0);
  253.                         Print(0,0,word1);
  254.                         Adjust=1;
  255.                
  256.                 }
  257.                 if(Adjust==0)
  258.                 {
  259.                         Print(0,0,word3);       
  260.                 }
  261.                 else
  262.                 {
  263.                         Print(0,0,word1);
  264.                 }
  265.         }
  266.         LCD1602_Disp(9,1,Time_bai/10+'0');       //在第1行的第1列顯示千位
  267.     LCD1602_Disp(10,1,Time_bai%10+'0'); //在第1行的第2列顯示百位
  268.           LCD1602_Disp(11,1,':');
  269.     LCD1602_Disp(12,1,Time_ge/10+'0');   //在第1行的第3列顯示十位
  270.     LCD1602_Disp(13,1,Time_ge%10+'0');         //在第1行的第4列顯示個(gè)位
  271.         LCD1602_Disp(14,1,' ');
  272.         LCD1602_Disp(15,1,' ');       
  273. }
  274. void Display()
  275. {
  276.         LCD1602_Disp(2,1,DISbuf_bai/10+'0');       //在第1行的第1列顯示千位
  277.            LCD1602_Disp(3,1,DISbuf_bai%10+'0'); //在第1行的第2列顯示百位
  278.         LCD1602_Disp(4,1,':');
  279.            LCD1602_Disp(5,1,DISbuf_ge/10+'0');   //在第1行的第3列顯示十位
  280.            LCD1602_Disp(6,1,DISbuf_ge%10+'0');         //在第1行的第4列顯示個(gè)位
  281.         LCD1602_Disp(7,1,' ');
  282.         LCD1602_Disp(8,1,' ');
  283.         if(DISbuf_ge==Time_ge && DISbuf_bai==Time_bai)
  284.         {
  285.                                 Adjust=1;
  286.         }
  287. }
  288. //---------------------------------------
  289. //名稱: 主函數(shù)
  290. //---------------------------------------
  291. void main(void)            //主函數(shù),單片機(jī)開機(jī)后就是從這個(gè)函數(shù)開始運(yùn)行
  292. {

  293.     LCD1602_init();        //調(diào)用1602液晶初始化函數(shù)

  294.     //***定時(shí)器Timer0初始化***
  295.     TMOD&=0xF0;            //將TMOD的低4位定時(shí)器0控制部分清零
  296.     TMOD|=0x01;            //設(shè)置定時(shí)器0為方式1
  297.     TL0=0xFF;              //設(shè)置定時(shí)器0初值低8位
  298.     TH0=0x4B;              //設(shè)置定時(shí)器0初值高8位
  299.     TR0=1;                 //啟動(dòng)定時(shí)器0
  300.     ET0=1;                 //Timer0中斷允許
  301.     //**********************

  302.     //***開全局中斷設(shè)置****
  303.     //定時(shí)器Timer0設(shè)置了中斷允許,此處要開全局中斷
  304.     EA=1;                  //開全局中斷
  305.     //*********************
  306.         menu=2;
  307.         Adjust=1;
  308.         Time_bai=0;
  309.         Time_ge=10;
  310.         DISbuf_bai=0;
  311.         DISbuf_ge=0;
  312.         Print(0,0,word1);
  313.         LCD1602_Disp(2,1,DISbuf_bai/10+'0');       //在第1行的第1列顯示千位
  314.            LCD1602_Disp(3,1,DISbuf_bai%10+'0'); //在第1行的第2列顯示百位
  315.         LCD1602_Disp(4,1,':');
  316.     LCD1602_Disp(5,1,DISbuf_ge/10+'0');   //在第1行的第3列顯示十位
  317.     LCD1602_Disp(6,1,DISbuf_ge%10+'0');         //在第1行的第4列顯示個(gè)位
  318.         beep=1;
  319.         P0 = 0x01;
  320.     while(1)               //死循環(huán),單片機(jī)初始化后,將一直運(yùn)行這個(gè)死循環(huán)
  321.     {                  
  322.                 if(DISbuf_ge==Time_ge && DISbuf_bai==Time_bai && Adjust==1)
  323. ……………………

  324. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
Project.zip (52 KB, 下載次數(shù): 14)


回復(fù)

使用道具 舉報(bào)

ID:217754 發(fā)表于 2017-9-30 23:14 | 顯示全部樓層
謝謝分享。下載看看
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表