YLJT---CEO 2021-06-18 21:26 采纳率: 33.3%
浏览 49
已采纳

关于80C51生成spwm的问题。

 

 

 

 

 

下面的代码有什么不完美的地方希望有大神可以指正一下,还有那个注释掉的数组有什么作用。删掉了还会报错。

#include<reg52.h>

#define uInt unsigned int

#define uchar unsigned char

uchar t_max = 10; //一个周期

static uchar t = 0,i = 0; //PWM计数

/*

uchar code SinParam[40]={  

 0,3,6,9,13,16,19,22,25,28,31,34,37,40,43,45,

48,51,54,56,59,61,64,66,68,71,73,75,77,79,81,83,

84,86,88,89,90,92,93,94,95,96,97,98,98,99,99,100,

100,100,100,100,100,100,99,99,98,98,97,96,95,94,93,92,

90,89,88,86,84,83,81,79,77,75,73,71,68,66,64,61,

59,56,54,51,48,45,43,40,37,34,31,28,25,22,19,16,

13,9,6,3 

};

 */

uchar code SinParam[20]={  

  5,5,6,7,7,8,9,9,9,9,10,9,9,9,9,8,

7,7,6,5

};

 

 

// 200点正弦波样本值

 

void main(void)

{

 TMOD = 0x02; //定时器0,工作模式2,8位定时模式

 TH0 = 146; //写入预置初值(取值1-255,数越大PWM频率越高)

 TL0 = 146; //写入预置值(取值1-255,数越大PWM频率越高)

 TR0 = 1; //启动定时器 TR0是51单片机定时器T0的定时器启动位。TR0=1 表示开启定时器

 ET0 = 1; //允许定时器0中断 ET0是51系列单片机定时器0的中断允许开关

 EA = 1; //允许总中断

 

 P2 = 0xff; //初始化P1

  P1=0x00; 

 

 while(1)

 {

 

 }

}

 

 

timer0()interrupt 1 using 2

{

// P2=~P2;

 

 t++; //每次定时器溢出加1

 

 if(t < t_max && t >= SinParam[i]) //PWM周期 5

  {    

   P2 = 0x00; //使LED灯亮

   P1=0xff;

  }

  else if( t >= t_max)

  {

   t = 0; //使t=0,开始新的PWM周期

   i++;    

   P2 = 0xff;

P1=0x00;   

  }  

   if(i >= 20) i = 0; 

}

  • 写回答

3条回答 默认 最新

  • MilkshakeのMilktea 2021-06-18 23:11
    关注

    能贴一下报错信息嘛

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突