永发信息网

stc单片机产生pwm波这个程序看不懂求讲解,最好能一句一句解释,编程也不太懂回答的好还有追加奖励

答案:2  悬赏:50  手机版
解决时间 2021-02-27 08:09
  • 提问者网友:我们很暧昧
  • 2021-02-26 17:22
stc单片机产生pwm波这个程序看不懂求讲解,最好能一句一句解释,编程也不太懂回答的好还有追加奖励#include
#define uchar unsigned char
#define uint unsigned int
uchar code pwm[54]={255,240,226,211,196,182,168,154,141,128,115,103,91,80,69,59,50,42,34,27,20,15,10,6,3,1,0,
0,1,3,6,10,15,20,27,34,42,50,59,69,80,91,103,115,128,141,154,168,182,196,211,226,240,255
}; // 反正弦变化
int index=0;
sbit P13=P1^3; //PCA模块0输出
sbit P14=P1^4; //PCA模块1输出

bit zf=0; //前后半周期标志
void init_pca(void)//pca计数器初始化函数
{
CMOD=0x02;//计数器0的溢出为PCA计数器的时钟源,允许pca中断使能
CCON=0x00;
CCAPM0=0x42;//8位PWM输出,无中断
CCAPM1=0x42;//8位PWM输出,无中断
CL=0x00;//清零pca计数器
CH=0x00;
CCAP0L=pwm[0]; //初始化spwm输出的占空比
CCAP0H=pwm[0];
CCAP1L=pwm[0]; //初始化spwm输出的占空比
CCAP1H=pwm[0];
CR=1;//运行pca计数器
}
void init_timer(void)//计数器初始化函数
{
TMOD= 0x01; //计数器0工作在方式模式1
TH0 = 0xF7;//T1的计数值为2048,若是11.0592M晶振,则中断频率为11.0592M/2048=5.4K
TL0 = 0xFF; //T1的计数值低位
AUXR=0xC0;//计数器均工作在1T模式。计数频率11.0592M
ET0 = 1; //开中计数器0断
TR0 = 1; //开启计数器0
}
void int_timer0(void) interrupt 1//计数器1中断函数
{
TH0=0xF7; //重装计数值
TL0=0xFF;
index++; //查表索引

if(index==54) //半周期转换,每半周期分为60份
{
CR=0; //关PCA计数
index=0;
zf=~zf; //半周期标志,zf=0,前半周期,zf=1,后半周期
if(zf) //设置后半周期
{
P13=0;
CCAPM0=0x00; //关闭模块0
CCAPM1=0x42; //设置模块1工作方式
}
else //设置前半周期
{
P14=0;
CCAPM1=0x00; //关闭模块1
CCAPM0=0x42; //设置模块0工作方式
}
CR=1; //开PCA计数
}

if(zf==0) //将下一小格的占空比赋给相应值
{
CCAP0H=pwm[index];
}
else
{
CCAP1H=pwm[index];
}
}
void main(void)
{
P14=0;
P13=0;
EA=1;//开总中断
init_pca();
init_timer();
while(1)//主循环
{
}
}
最佳答案
  • 五星知识达人网友:行雁书
  • 2021-02-26 18:32
对于每个人的努力来说,奇迹不可能不会发生
全部回答
  • 1楼网友:千杯敬自由
  • 2021-02-26 19:00
看看这个,单片机用的是aduc848,ad转换输出正弦波,和pwm原理类似。 实验八 d/a转换实验 一、实验目的 1.了解芯片内部d/a转换模块设置方法。 2.了解d/a转换原理。 3.  了解keil软件中逻辑分析仪的使用方法。 4.   了解用单片机产生正弦信号的基本方法。 二、实验原理 aduc848中包含一个12位电压输出dac模块,dac模块中寄存器的设置如下: dac控制寄存器:daccon nc表示未定义; dacpin为dac输出引脚选择; 1 = 设置dac输出引脚为pin 13 (aincom);  0 = 设置dac输出引脚为pin 14 (dac); dac8为dac转换位数模式选择位; 1 = 设置dac为8位转换; 0 = 设置dac为12位转换; dacrn为dac输出范围选择位; 1 = 设置dac的输出范围为 0 v - avdd; 0 = 设置dac的输出范围为 0 v - 2.5 v (vref); dacclr为dac清除位; 1 = 设置dac为正常操作模式; 0 = 复位dac数据寄存器dacl/h to 0; dacen为dac使能位 1 = 使能dac转换; 0 = 不使能dac转换; dac数据寄存器:dach/l dach为12位转换的高位数据寄存器 四、程序流程图和源程序 1、主程序流程图   2、源程序清单      daccon equ 0xfd  ;定义模数转换控制器       dach   equ 0xfc  ;定义模数转换数据寄存器高8位       dacl   equ 0xfb  ;定义模数转换数据寄存器低8位   org 0000h       ljmp main       org 0200h  main:mov daccon , #0fh;    dac operation       clr a   ;       mov dach , a   ;模数转换高八位清零 prg3:movr0,#09h;正弦波 movr4,#40h lp11:mov a,r0     movca,@a+pc mov  dacl,a   ;2     acall delay ;2 incr0;1 djnzr4,lp11  ;2   sjmp prg3   ;2 data0:     db 80h,8ch,98h,0a5h,0b0h,0bch,0c7h,0d1h,0dah,0e2h,0eah db 0f0h,0f6h,0fah,0fdh,0ffh,0ffh,0fdh,0fah,0f6h,0f0h db    0eah,0e2h,0dah, 0d1h,0c7h,0bch,0b0h,0a5h,98h,8ch db    80h, 7fh,73h,67h,5ah,4fh,43h,38h,2eh, 25h,1dh,15h db  0fh,09h,05h,02h,00h, 00h,02h,05h,09h,0fh,15h db   1dh,25h,2eh,38h,43h,4fh,5ah,67h,73h,7fh ret delay: mov r6,#10h     mov r7,#0a1h delayloop: ;延时程序     djnz r6,delayloop     djnz r7,delayloop     ret       end 四、实验板插针配置:  无需插针配置,注意dac是从condacout1端子输出,可用示波器观察dac输出波形。若产生失真情况,请检查开发板da输出端lm358运算放大器的放大倍数,适当更改所查函数表的范围。 五、思考题 1、改变程序,使能添加输出锯齿波; 2、改变程序,使输出添加三角波; 3、改变程序,使输出添加方波; 4、改变程序,并制作一个简单的函数发生器
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯