标题: LCD1602显示PWM频率和占空比 单片机源程序Proteus仿真 [打印本页]

作者: 哈哈151-    时间: 2020-3-15 11:10
标题: LCD1602显示PWM频率和占空比 单片机源程序Proteus仿真
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  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; //高电平重载值的高字节
  15. unsigned char HighRL = 0; //高电平重载值的低字节
  16. unsigned char LowRH = 0; //低电平重载值的高字节
  17. unsigned char LowRL = 0; //低电平重载值的低字节

  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 (延时一毫秒的个数)
  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)   //按下相应的按键,数码管显示相应的码值
  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; //计算一个周期所需的计数值
  61. high = (tmp*dc) / 100; //计算高电平所需的计数值
  62. low = tmp - high; //计算低电平所需的计数值
  63. high = 65536 - high + 12; //计算高电平的重载值并补偿中断延时
  64. low = 65536 - low + 12;//计算低电平的重载值并补偿中断延时

  65. HighRH = (unsigned char)(high>>8); //高电平重载值拆分为高低字节
  66. HighRL = (unsigned char)high;
  67. LowRH = (unsigned char)(low>>8); //低电平重载值拆分为高低字节
  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. /* 关闭 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 中断服务函数,产生 PWM 输出 */
  120. void InterruptTimer0() interrupt 1
  121. {

  122. if (PWMOUT == 1)
  123. { //当前输出为高电平时,装载低电平值并输出低电平
  124. TH0 = LowRH;
  125. TL0 = LowRL;
  126. PWMOUT = 0;
  127. }
  128. else
  129. { //当前输出为低电平时,装载高电平值并输出高电平
  130. TH0 = HighRH;
  131. TL0 = HighRL;
  132. PWMOUT = 1;
  133. }
  134. }
  135. void TM1_Isr() interrupt 3 using 1
  136. {
  137. key();
  138. }
复制代码

全部资料51hei下载地址:
lcd1602显示PWM频率和占空比1.rar (66.36 KB, 下载次数: 100)

作者: 11234    时间: 2020-3-16 22:02
感谢分享 下来看看
作者: chinarenxx    时间: 2020-3-17 01:14
最近看到有些传感器输出的是PWM信号,不知道大神能不能写个检测PWM值的程序。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1