STC单片机PWM编程!

STC单片机PWM编程!,第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

INCR01

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、改变程序,并制作一个简单的函数发生器

这是一个 可以输出 三路 不同占空比的 程序

PWMH1DATA 30H 高电平脉冲的个数

PWMH2DATA 31H

PWMH3DATA 32H

PWM DATA 33H PWM周期

COUNTER DATA 35H

TEMP DATA 36H

ORG0000H

AJMP MAIN

ORG000BH

AJMP INTT0

ORG0100H

MAIN:

MOV SP,#60H 给堆栈指针赋初值

MOV TMOD,#02H 定时器0在模式2下工作

MOV TL0,#38H 定时器每200us产生一次溢出

MOV TH0,#38H 自动重装的值

SETB ET0 使能定时器0中断

SETB EA使能总中断

SETB TR0 开始计时

MOV PWMH1,#2PWM 1 占空比 可以修改

MOV PWMH2,#5PWM 2 占空比 可以修改

MOV PWMH3,#8PWM 3 占空比 可以修改

MOV COUNTER,#0

MOV PWM,#16 占空比 为 16 级 可以修改

JMP $

INTT0:几个参数需要 定义 三路 PWM 占空比 可以不同

PUSH PSW 现场保护

PUSH ACC

INCCOUNTER 计数值加1

MOVA,COUNTER

CJNE A,PWMH1,INTT01 如果等于高电平脉冲数

CLRP1.0P1.0变为低电平 PWM1

INTT01:

CJNE A,PWMH2,INTT02 如果等于高电平脉冲数

CLRP1.1P1.1变为低电平 PWM2

INTT02:

CJNE A,PWMH3,INTT03 如果等于高电平脉冲数

CLRP1.2P1.2变为低电平 PWM3

INTT03:

CJNE A,PWM,INTT05如果等于周期数

MOVCOUNTER,#0 计数器复位

SETB P1.0P1.0为高电平

SETB P1.1P1.1为高电平

SETB P1.2P1.2为高电平

INTT05:

POP ACC 出栈

POP PSW

RETI

END


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7853701.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存