设为首页收藏本站淘宝杂货铺

从F到0 - From F to 0

 找回密码
 注册已关闭
搜索
查看: 2147|回复: 2
收起左侧

用STC单片机输出50Hz正弦波,采用软件模拟PWM实现。

[复制链接]
发表于 2017-6-10 08:10:22 | 显示全部楼层 |阅读模式

  1. /*
  2. 用STC单片机输出50Hz正弦波,采用软件模拟PWM实现。
  3. 修改晶振频率需要修改定时器中断时间,频率可能不太准确,适当调整晶振频率以及中断频率。
  4. P3.2和P3.3口为输出口,用电容滤波后即可

  5. */
  6. #include "reg51.h"
  7. sfr P3M0=0xB2;     
  8. sfr AUXR=0x8E;
  9. unsigned char code sindata[200] = { //正弦波数据
  10.         0x80, 0x84, 0x88, 0x8C, 0x90, 0x94, 0x98, 0x9C, 0xA0, 0xA3, 0xA7, 0xAB, 0xAF, 0xB2, 0xB6, 0xBA,
  11.         0xBD, 0xC1, 0xC4, 0xC7, 0xCB, 0xCE, 0xD1, 0xD4, 0xD7, 0xDA, 0xDD, 0xDF, 0xE2, 0xE4, 0xE7, 0xE9,
  12.         0xEB, 0xED, 0xEF, 0xF1, 0xF3, 0xF5, 0xF6, 0xF7, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFD, 0xFE, 0xFE,
  13.         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFD, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF7, 0xF6, 0xF5,
  14.         0xF3, 0xF1, 0xEF, 0xED, 0xEB, 0xE9, 0xE7, 0xE4, 0xE2, 0xDF, 0xDD, 0xDA, 0xD7, 0xD4, 0xD1, 0xCE,
  15.         0xCB, 0xC7, 0xC4, 0xC1, 0xBD, 0xBA, 0xB6, 0xB2, 0xAF, 0xAB, 0xA7, 0xA3, 0xA0, 0x9C, 0x98, 0x94,
  16.         0x90, 0x8C, 0x88, 0x84, 0x80, 0x7C, 0x78, 0x74, 0x70, 0x6C, 0x68, 0x64, 0x60, 0x5D, 0x59, 0x55,
  17.         0x51, 0x4E, 0x4A, 0x46, 0x43, 0x3F, 0x3C, 0x39, 0x35, 0x32, 0x2F, 0x2C, 0x29, 0x26, 0x23, 0x21,
  18.         0x1E, 0x1C, 0x19, 0x17, 0x15, 0x13, 0x11, 0x0F, 0x0D, 0x0B, 0x0A, 0x09, 0x07, 0x06, 0x05, 0x04,
  19.         0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06,
  20.         0x07, 0x09, 0x0A, 0x0B, 0x0D, 0x0F, 0x11, 0x13, 0x15, 0x17, 0x19, 0x1C, 0x1E, 0x21, 0x23, 0x26,
  21.         0x29, 0x2C, 0x2F, 0x32, 0x35, 0x39, 0x3C, 0x3F, 0x43, 0x46, 0x4A, 0x4E, 0x51, 0x55, 0x59, 0x5D,
  22.         0x60, 0x64, 0x68, 0x6C, 0x70, 0x74, 0x78, 0x7C
  23. };
  24. void InitTimer0(void){ //初始化100us定时器
  25.     TMOD = 0x01;
  26.     TH0 = 0x0F6;
  27.     TL0 = 0x0A0;
  28.     EA = 1;
  29.     ET0 = 1;
  30.     TR0 = 1;
  31. }


  32. void set_pwm(unsigned char pwm){ //输出PWM
  33.         unsigned char npwm=~pwm; //反向PWM值
  34.         P3=0xFB; //P3.2输出低电平
  35.         while(pwm--);  //正向值替减
  36.         P3=0xF7; //P3.3输出低电平
  37.         while(npwm--); //反向值替减
  38. }


  39. unsigned char a=0;  //占空比数据,定时器中断修改后在死循环中输出
  40. unsigned char pc=0; //程序计数器,用于指定数据位置
  41. void main(){ //入口函数
  42.     AUXR = AUXR|0x80;  //设置AUXR寄存器
  43.     P3M0 = 0x0C; //设置P3M0寄存器
  44.     InitTimer0();  //初始化100us定时器
  45.         while(1){ //死循环
  46.         set_pwm(a);  //输出PWM数据

  47.         }
  48. }

  49. void Timer0Interrupt(void) interrupt 1{ //100us定时器中断
  50.     TH0 = 0x0F6;
  51.     TL0 = 0x0A0;
  52.      a=sindata[pc]; //修改PWM占空比数据,运行结束后会输出给IO口
  53.         pc++;  //程序计数器加1
  54.         if(pc > 200){ //程序计数器大于200
  55.         pc=0; //程序计算器清零,防止输出其他无用数据
  56.         }
  57.         
  58. }
复制代码


发表于 2017-7-3 19:44:30 | 显示全部楼层
让我暖暖贴。还没接触单片机,我来水个沙发。
发表于 2017-7-31 20:12:01 | 显示全部楼层
我都不清楚晶振多少兆赫合适。
您需要登录后才可以回帖 登录 | 注册已关闭

本版积分规则

QQ|手机版|Archiver|从F到0 ( 蒙ICP备17002595号-1 )
蒙公网安备15010402000325号

腾讯云安全认证

GMT+8, 2024-4-27 08:08 , Processed in 1.525087 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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