void beep(void)
{
uchar t
for(t=0t<100t++)//循环,共输出50个脉冲
{
delaynms(1)//延时,即两个脉冲的间隔时间
FMQ=!FMQ //产生脉冲,此句貌似有错误,应该写成 FMQ = ~FMQ
}
FMQ=1 //关闭脉冲,即循环后,不管结果如何,必须让此端口置 1
delaynms(300)//延时,此句有没有都可以
}
看程序的开头 sbit FMQ = P3^6可知,这是一个输出端口,至于连接的什么不得而知
但从函数本身看,这只是一个简单的利用延时函数来输出脉冲的函数,其精度不高
程序开头有四句
sbit PWM11 = P1^0
sbit PWM12 = P1^1
sbit PWM13 = P1^2
sbit PWM14 = P1^3
并且在中断函数中进行控制,初步可以断定,这是一个利用L298N 控制的两相步进电机
但此程序的可读性太差,除了当时编程的时候可以理解其内容,等过段时间就会忘记流程啦
此程序有待改进!
看看这个,单片机用的是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、改变程序,并制作一个简单的函数发生器
你那个地方不明白?能具体说说吗?我看程序已经有不少注释了啊?
下面的比较多,复杂些,先简单的说下吧:
一、加速减速,就是增加或减少脉冲宽度,改变电机速度!脉冲的宽度由
1、CLK=0的状态持续,由T1的定时决定;
2、CLK=1的状态持续,由(T0-T1)的时间决定;
二、定时器中断TH0=0x00 TL0=0x00
1、T0定时器工作1方式,T0定时器启动后,从TH0、TL0赋值的计数值开始增加,增加到0XFFFF后,T0中断!
2、T0溢出后(中断),T0计数器不会自动停止,所以需要重新给T0定时器赋值!赋值后,进入下一个计数周期!
3、例子中,T0定时器从0x0000开始计数,也就是增加0xFFFF后进行中断!定时时间为 (0xFFFF / ( 晶振周期/12 ))) 秒,若晶振为12M,则定时为,65.536ms!
分析程序,从main开始分析,先将起始开始的时序图画出:
如下图!
从时序图可以看出,CLK为PWM输出,
1、CLK=0的状态持续,由T1的定时决定;
2、CLK=1的状态持续,由T0-T1的时间决定;
而 main 函数中的 while(1) 部分,进行的就是PWM调整程序。
1、 if (K3==0) //高电平逆时钟转,低电平顺时钟转
{
ZF=0
}
else
{
ZF=1
}
根据程序推测,程序若为电机控制,K3开关为0时,ZF=0,顺时针转,K3开关为1时,ZF=1,逆时针转。
2、
if(K1==0) //按下加速键
{
delay(1)
PWML++ //调宽值低四位加1
if(PWML==0x00)
{
PWMH++
} //调宽值高四位加1
if (PWMH==0xFF) //最大值时
{
PWMH=0xFE
}
}
K1按键,加速按键,增加T1定时器计数起始时间,也就是减少T1计数时间,减少CLK=0的时间。
3、
if(K2==0) //按下减速键
{
delay(1)
PWML-- //调宽值低四位减1
if (PWML==0x00)
{
PWMH--
} //调宽值高四位减1
if (PWMH==0x00)
{
PWMH=0x01
} //最小值时
}
K2按键,减速按键,降低T1定时器计数起始时间,也就是增加T1计数时间,增加CLK=0的时间。
4、不论加速、减速,T0的时间都不变,CLK=0和CLK=1总持续时间不变{ (Tclk0+Tclk1)=T0 }。
程序不难,图不好画啊!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)