永发信息网

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

答案:2  悬赏:50  手机版
解决时间 2021-02-27 08:09
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)//主循环
{
}
}
最佳答案
对于每个人的努力来说,奇迹不可能不会发生
全部回答
看看这个,单片机用的是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、改变程序,并制作一个简单的函数发生器
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
如果是这样的话的英文怎么说
侬好沙廊我想知道这个在什么地方
Can Linda play the piano?(改为陈述句)
郭亮村门票是多少,郭亮村旅游攻略
我家是六层窗户是双层的为什么窗户上的寒气很
举行抵日宣传活动需要到派出所备案吗?
我让单位以拿考勤开除,不给工资,劳动仲裁老
下列对免疫说法错误的是BA. 免疫可以抵抗抗原
老公英语怎么写怎么读
FMGG项目是什么
中国移动送魅族手机活动暗号是什么
请问如何制作密码重设软盘?
冬冬宝家纺子长专卖店怎么去啊,有知道地址的
我现在17岁,想学化妆,用什么样的产品较好呢?
这些黑色石头到底是什么石头?还不透光,就反
推荐资讯
DTH在医学上指什么
临清正宗羊汤地址有知道的么?有点事想过去
在某安装工程网络计划中,已知工作F的自由时
耳聪堂优利康助听器NO.07我想知道这个在什么
DNF影舞者技能追命 有什么效果之视频演示
广州哪家烤鱼好吃
易信免费短信有限制吗
问一个女孩到底喜不喜欢我结果,她老是不回答
少数民族的乐器有哪些
两个人力量能否将人拉断
省内流量从外地进入省内就自动转换了么?
支付宝兴业银行信用卡快捷支付的限额是多少
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?