数码之家

 找回密码
 立即注册
搜索
查看: 1926|回复: 8

[C51] 小白自学C51单片机编程,PWM信号+按键+报警+显示占空比

[复制链接]
发表于 2023-12-28 15:08:44 | 显示全部楼层 |阅读模式
在昨天的基础上增加了数码管显示占空比,




代码如下:
  1. //程序功能:P1.0口输出PWM信号
  2. //增加按键加减占空比,key3增加key4减少
  3. //当增加到95时声音报警,当减少到5时报警,

  4. #include <reg52.h>        //头文件
  5. typedef unsigned char u8;    //类型定义,相当于缩写的意思吧
  6. typedef unsigned int u16;      //类型定义

  7. u8 time;     //定义周期时间
  8. u8 duty=50;    //定义占空比,并给初值   
  9. u16 xms;    //延时时间
  10. sbit PWM=P1^4;    //P1.40口输出PWM信号
  11. sbit key3=P3^6;         //定义一个按键加
  12. sbit key4=P3^7;         //定义一个按键减
  13. sbit beep=P0^7;         //定义报警位
  14. sbit led_a=P1^0;
  15. sbit led_b=P1^1;
  16. u8 code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

  17. void time0init();    //声明子函数定时器初始化
  18. void delay(xms);    //声明子函数延时
  19. void key_scan();    //声明子函数按键
  20. void display(duty);    //声明子函数显示

  21. void main ()      //主函数
  22. {
  23.     time0init();    //调用初始化子函数
  24.     while(1)
  25.     {
  26.          key_scan();    //调用按键子函数
  27.         display(duty);    //调用子函数
  28.     }
  29. }

  30. void display(duty)
  31. {
  32.     P0=table[duty%10];    //
  33.     led_a=0;       //
  34.     delay(5);    //
  35.     led_a=1;

  36.     P0=table[duty/10%10];    //
  37.     led_b=0;       //
  38.     delay(5);    //
  39.     led_b=1;        
  40. }

  41. void delay (xms)    //延时子函数
  42. {
  43.      u8 i;    //定义一个变量,函数内的变量只对当前函数有效
  44.     while(xms--)    //给定值自减,
  45.     {
  46.          for(i=0;i<113;i++);    //每一个算是单位是不是113个机器周期?
  47.     }
  48. }

  49. void key_scan()       //检测按键子函数
  50. {
  51.      if(key3==0)       //如果key3被按下,
  52.     {
  53.          delay(5);    //抖消
  54.         if(key3==0)         //再次确认
  55.         {
  56.              duty+=5;    //占空比加5
  57.             if(duty>=95)   //最大到95
  58.             {
  59.                  duty=95;
  60.                 beep=!beep;    //报警响
  61.             }
  62.             while(key3==0);     //按键释放
  63.         }
  64.     }
  65.     if(key4==0)       // key4原理一样
  66.     {
  67.          delay(5);    //
  68.         if(key4==0)
  69.         {
  70.              duty-=5;    //
  71.             if(duty<=5)   //
  72.             {
  73.                  duty=5;
  74.                 beep=!beep;    //
  75.             }
  76.             while(key4==0);
  77.         }
  78.     }
  79. }

  80. void time0init()     //定时器初始化函数
  81. {
  82.        TMOD=0x01;    // 定时器模式1
  83.     TH0=(65536-100)/256;       //
  84.     TL0=(65536-100)%256;    //
  85.     EA=1;        //开总中断
  86.     ET0=1;        //开定时器0        
  87.     TR0=1;        //定时器0开始
  88. }

  89. void time0 ()interrupt 1    //定时器中断函数
  90. {   
  91.     TH0=(65536-100)/256;
  92.     TL0=(65536-100)%256;
  93.     time++;    //
  94.      if(time>=100)      //如果定时满了100次
  95.         time=0;        //定时清零
  96.     if(time<=duty)    //如果小于10,相当于只有10%时间是高电平,
  97.         PWM=1;          //输出高电平
  98.     else
  99.          PWM=0;          //其它时间输出低电平
  100. }
复制代码

本帖子中包含更多资源

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

x

打赏

参与人数 1家元 +50 收起 理由
家睦 + 50

查看全部打赏

发表于 2023-12-28 15:43:20 | 显示全部楼层
我以为是用了芯片内部的PWM硬件资源,原来是用定时器模拟出来的PWM。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-28 17:26:17 | 显示全部楼层
用的‘’死太惨‘’的89C52 没有硬件PWM
回复 支持 反对

使用道具 举报

发表于 2023-12-28 18:48:02 | 显示全部楼层
本帖最后由 猪小呆 于 2023-12-28 18:53 编辑

之前的频率误差问题,可能是晶振判断错误的原因,本以为是12M的,实际是11.0592M的,定时器+1需要的时间是1.085us,你不妨按这个再试试看频率对不对:
https://www.mydigit.cn/thread-429492-1-1.html
https://blog.csdn.net/xuw_xy/article/details/78984741
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-29 10:07:07 | 显示全部楼层
按1.085出来的频率是接近的
我定时器设定的500us/1.085=460  然后中断10次,那一个矩形波时长就是5ms 一个周期就是10mS频率就是100HZ
实际示波器出来是97.24HZ
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-29 10:08:33 | 显示全部楼层





本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2023-12-29 15:21:21 | 显示全部楼层
向楼主学习了,一直很想学,不知道怎么入手,
回复 支持 反对

使用道具 举报

发表于 2023-12-29 20:10:10 | 显示全部楼层

向楼主学习了,一直很想学,不知道怎么入手,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-31 23:46:37 | 显示全部楼层
一块开发板,然后看着教程一步一步来
回复 支持 反对

使用道具 举报

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

本版积分规则

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

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-2 20:28 , Processed in 0.280801 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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