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

標(biāo)題: LCD1602顯示PWM頻率和占空比 單片機(jī)源程序Proteus仿真 [打印本頁]

作者: 哈哈151-    時間: 2020-3-15 11:10
標(biāo)題: LCD1602顯示PWM頻率和占空比 單片機(jī)源程序Proteus仿真
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  1. #include<reg52.h>
  2. #include "LCD1602.H"
  3. #define uchar unsigned char
  4. #define uint  unsigned int

  5. unsigned int fr=50; //頻率 50hz
  6. unsigned char dc=50;//50%占空比
  7. uchar fr_g=0;
  8. uchar fr_s=0;
  9. uchar dc_g=0;
  10. uchar dc_s=0;
  11. /* 配置并啟動 PWM,fr-頻率,dc-占空比 */

  12. unsigned int high,low;
  13. unsigned long tmp;
  14. unsigned char HighRH = 0; //高電平重載值的高字節(jié)
  15. unsigned char HighRL = 0; //高電平重載值的低字節(jié)
  16. unsigned char LowRH = 0; //低電平重載值的高字節(jié)
  17. unsigned char LowRL = 0; //低電平重載值的低字節(jié)

  18. void ConfigPWM();
  19. void ClosePWM();

  20. sbit key1=P3^1; //定義按鍵位置  加占空比
  21. sbit key2=P3^0; //定義按鍵位置  減占空比
  22. sbit PWMOUT = P2^1;

  23. /********************************************************************
  24. //* 名稱 : Delay_1ms()
  25. //* 功能 : 延時子程序,延時時間為 1ms * x
  26. //* 輸入 : x (延時一毫秒的個數(shù))
  27. //* 輸出 : 無
  28. //***********************************************************************/
  29. void Delay_1ms(uint i)//1ms延時
  30. {
  31.         uchar x,j;
  32.         for(j=0;j<i;j++)
  33.         for(x=0;x<=148;x++);        
  34. }

  35. void key()
  36. {

  37.         if(!key1)   //按下相應(yīng)的按鍵,數(shù)碼管顯示相應(yīng)的碼值
  38.                 { Delay_1ms(10);
  39.                         if(!key1)
  40.                         {
  41.       if(dc++>=100)dc=100;
  42.         
  43.                         }
  44.                         while(!key1);
  45.                 }
  46.                
  47.                 if(!key2)
  48.                 {
  49.                 Delay_1ms(10);
  50.                         if(!key2)
  51.                         {
  52.                       if(dc--<=0)dc=100;
  53.                
  54.                         }
  55.                         while(!key2);
  56.                 }
  57.         }

  58. void ConfigPWM()
  59. {
  60. tmp = (11059200/12) / fr; //計(jì)算一個周期所需的計(jì)數(shù)值
  61. high = (tmp*dc) / 100; //計(jì)算高電平所需的計(jì)數(shù)值
  62. low = tmp - high; //計(jì)算低電平所需的計(jì)數(shù)值
  63. high = 65536 - high + 12; //計(jì)算高電平的重載值并補(bǔ)償中斷延時
  64. low = 65536 - low + 12;//計(jì)算低電平的重載值并補(bǔ)償中斷延時

  65. HighRH = (unsigned char)(high>>8); //高電平重載值拆分為高低字節(jié)
  66. HighRL = (unsigned char)high;
  67. LowRH = (unsigned char)(low>>8); //低電平重載值拆分為高低字節(jié)
  68. LowRL = (unsigned char)low;

  69. TMOD &= 0xF0; //清零 T0 的控制位
  70. TMOD |= 0x01; //配置 T0 為模式 1
  71. TH0 = HighRH; //加載 T0 重載值
  72. TL0 = HighRL;
  73. ET0 = 1; //使能 T0 中斷
  74. TR0 = 1; //啟動 T0
  75. PWMOUT = 1; //輸出高電平
  76. }

  77. /* 關(guān)閉 PWM */
  78. void ClosePWM()
  79. {
  80. TR0 = 0; //停止定時器
  81. ET0 = 0; //禁止中斷
  82. PWMOUT = 1; //輸出高電平
  83. }





  84. void main()
  85. {uint i;
  86.         LCD1602_Init(1,0,0);//lcd1602初始化
  87.         Delay_1ms(100);
  88.         
  89.         LCD1602_DisplayChar(1,2,':');//顯示e
  90.         LCD1602_DisplayChar(2,1,'d');//顯示p
  91.         LCD1602_DisplayChar(2,2,':');//顯示:
  92.         LCD1602_DisplayChar(1,6,'H');//顯示t
  93.         LCD1602_DisplayChar(1,7,'Z');//顯示e
  94.         LCD1602_DisplayChar(2,6,'%');//顯示t
  95.         LCD1602_DisplayChar(1,1,'f');//顯示t
  96.         TMOD = 0x00;
  97.   TL1 = 0xD8;
  98.   TH1 = 0xf0;
  99.   TR1 = 1; //啟動定時器
  100.   ET1 = 1; //使能定時器中斷
  101.         EA = 1; //開總中斷


  102.         while(1)
  103.         {
  104.                 key();
  105.                 ConfigPWM();
  106.            for (i=0; i<40000; i++);
  107.                 fr_g = fr%10;
  108.                 fr_s = fr /10;
  109.                 dc_g = dc%10;
  110.                 dc_s = dc/10;
  111.         LCD1602_DisplayChar(1,4,fr_s+48);//顯示t
  112.         LCD1602_DisplayChar(1,5,fr_g+48);//顯示e
  113.         LCD1602_DisplayChar(2,4,dc_s+48);//顯示p
  114.         LCD1602_DisplayChar(2,5,dc_g+48);//顯示:
  115.         
  116.         }
  117.         
  118. }


  119. /* T0 中斷服務(wù)函數(shù),產(chǎn)生 PWM 輸出 */
  120. void InterruptTimer0() interrupt 1
  121. {

  122. if (PWMOUT == 1)
  123. { //當(dāng)前輸出為高電平時,裝載低電平值并輸出低電平
  124. TH0 = LowRH;
  125. TL0 = LowRL;
  126. PWMOUT = 0;
  127. }
  128. else
  129. { //當(dāng)前輸出為低電平時,裝載高電平值并輸出高電平
  130. TH0 = HighRH;
  131. TL0 = HighRL;
  132. PWMOUT = 1;
  133. }
  134. }
  135. void TM1_Isr() interrupt 3 using 1
  136. {
  137. key();
  138. }
復(fù)制代碼

全部資料51hei下載地址:
lcd1602顯示PWM頻率和占空比1.rar (66.36 KB, 下載次數(shù): 100)

作者: 11234    時間: 2020-3-16 22:02
感謝分享 下來看看
作者: chinarenxx    時間: 2020-3-17 01:14
最近看到有些傳感器輸出的是PWM信號,不知道大神能不能寫個檢測PWM值的程序。




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