数码之家

 找回密码
 立即注册
搜索
查看: 1351|回复: 14

[C51] 小白自学C51单片机编程,输出PWM信号

[复制链接]
发表于 2023-12-25 14:54:41 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
声明:本次的程序参考了网上的贴子,感谢原创者
今天的任务比较简单,就是输出一个PWM信号
程序如下:
  1. //程序功能:P1.0口输出PWM信号

  2. #include <reg52.h>        //头文件
  3. typedef unsigned char uchar;    //类型定义
  4. typedef unsigned int uint;

  5. sbit PWM=P1^0;    //P1.0口输出PWM信号
  6. uchar time;     //调节占空比的变量     

  7. void time0init();    //声明定时器初始化子函数

  8. void main ()      //主函数
  9. {
  10.     time0init();    //调用初始化子函数
  11.     while(1)
  12.     {

  13.     }
  14. }

  15. void time0init()     //定时器初始化函数
  16. {
  17.     EA=1;        //开总中断
  18.     ET0=1;        //开定时器0        
  19.     TR0=1;        //定时器0开始
  20.     TMOD=0X01;    // 定时器模式1
  21.     TH0=(65536-10)/256;      //初值高8位
  22.     TL0=(65536-10)%256;      //初值低8位
  23. }

  24. void time0 ()interrupt 1    //定时器中断函数
  25. {   
  26.     TR0=0;      //中断函数中,定时器先关再开,具体作用是什么?是为了计时更准确吗,
  27.     TH0=(65536-10)/256;
  28.     TL0=(65536-10)%256;
  29.     TR0=1;
  30.     time++;    //
  31.      if(time>=100)      //如果定时满了100次
  32.         time=0;    //
  33.     if(time<=10)    //    相当于10次定时输出高电平,剩下的90次输出低电平
  34.         PWM=1;          //
  35.     else
  36.          PWM=0;          //

  37. }   
复制代码



以下为验证
8858b849da63318880b0f96b50b53d1.jpg
3a77b69ff7eba3df55437e1f3a447da.jpg
上图是占空比为10的波形

77f53cba728eb055b910506864e89ac.jpg
02d48091db4a8a9ec5a57abfff65c6c.jpg
375ee8f68472f8e8ab3bc43ba8c57d9.jpg
上图是占空比50的波形


19d69e0a2499d8a10c3d62c7c47f9f9.jpg
上图是占空比90的波形



打赏

参与人数 1家元 +30 收起 理由
springvirus + 30 泰克示波器不错

查看全部打赏

 楼主| 发表于 2023-12-25 14:58:41 | 显示全部楼层
想要请教的问题是,定时器初值与频率的关系,是怎样算来的?谢谢
回复 支持 反对

使用道具 举报

发表于 2023-12-25 15:14:23 | 显示全部楼层
这就是STC没人带路的典型例子,即使略懂点 寄存器、中断、计数器、分频 还是看不懂程序。(STC多年死性不改,不肯弯下腰面对小白)
入门没人带,又不想慢慢啃全系列资料,那么用 arduino or micropython 入门(相对说人话), 有了实际经验再回到 51 或 STM32 容易些。
回复 支持 反对

使用道具 举报

发表于 2023-12-25 15:28:11 | 显示全部楼层
代码还挺短的
回复 支持 反对

使用道具 举报

发表于 2023-12-25 15:51:40 | 显示全部楼层
你这是IO口用定时器模拟PWM输出,并不是硬件原生的PWM输出,
8H8K64U和32G12K128都支持硬件原生PWM输出
回复 支持 1 反对 0

使用道具 举报

发表于 2023-12-25 21:27:08 | 显示全部楼层
软件定义PWM?
回复 支持 反对

使用道具 举报

发表于 2023-12-25 22:05:38 | 显示全部楼层
这是哪年的上网本?还是XP系统
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-26 08:38:55 | 显示全部楼层
wangxiangtan2 发表于 2023-12-25 15:51
你这是IO口用定时器模拟PWM输出,并不是硬件原生的PWM输出,
8H8K64U和32G12K128都支持硬件原生PWM输出 ...

STC89C52这种古老单片机没有PWM输出,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-26 08:42:38 | 显示全部楼层
renpeng009 发表于 2023-12-25 22:05
这是哪年的上网本?还是XP系统

十年前了,平时也就是用来看看书,电池还能用3小时左右,换个固态可能更好,也不想去折腾了
回复 支持 反对

使用道具 举报

发表于 2023-12-26 10:18:56 | 显示全部楼层
hellozwt 发表于 2023-12-25 14:58
想要请教的问题是,定时器初值与频率的关系,是怎样算来的?谢谢

1.下载软件上有定时器计算器;2.楼主可以去看陈老师的视频教学《USB型 1T 8051 单片机原理及应用-STC8H8K64U》,山东大学陈桂友教授
回复 支持 反对

使用道具 举报

发表于 2023-12-26 10:20:16 | 显示全部楼层
hellozwt 发表于 2023-12-26 08:38
STC89C52这种古老单片机没有PWM输出,

可以到原厂申请硬件PWM的STC8H8K64U,免费+包邮送!
回复 支持 反对

使用道具 举报

发表于 2023-12-26 10:34:54 | 显示全部楼层
renpeng009 发表于 2023-12-25 22:05
这是哪年的上网本?还是XP系统

觉得示波器需要稍微清洁清洁
回复 支持 反对

使用道具 举报

发表于 2023-12-26 10:54:47 | 显示全部楼层
hellozwt 发表于 2023-12-25 14:58
想要请教的问题是,定时器初值与频率的关系,是怎样算来的?谢谢

如果你的PWM频率是1kHz,占空比是0~100以1步进,那么定时器中断的频率就得100kHz,那就是定时器需要10us中断一次
如果你的PWM频率是1kHz,占空比是0~200以1步进,那么定时器中断的频率就得200kHz,那就是定时器需要5us中断一次
大概就是这么算的吧
回复 支持 反对

使用道具 举报

发表于 2023-12-26 10:58:07 | 显示全部楼层
还有一种PFM,PSM也是用于调压的
回复 支持 反对

使用道具 举报

发表于 2023-12-26 11:18:11 来自手机浏览器 | 显示全部楼层
手册上应该有的吧?
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-28 22:13 , Processed in 0.140400 second(s), 14 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

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