找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4617|回复: 2
打印 上一主题 下一主题
收起左侧

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)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:162491 发表于 2020-3-16 22:02 | 只看该作者
感谢分享 下来看看
回复

使用道具 举报

板凳
ID:214276 发表于 2020-3-17 01:14 | 只看该作者
最近看到有些传感器输出的是PWM信号,不知道大神能不能写个检测PWM值的程序。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表