用51单片机制作简易的波形发生器时,想要控制正弦波和三角波的幅值求汇编语言程序
需要两个模块,首先用51加一个8位DA转换器可以作一个方波输出,单片机输出的8位代码可以控制DA转换器的输出幅度,最后在加个积分电路,即可输出三角波了,很简单的
用MATLAB或者Excel把0~90度或者0~360的正弦值,按一定间隔(如1°)的连续计算出来,sin0,sin1,sin2.....
再把这个值放大127倍,因为有负数,所以在加上128,就可以得到一个360自己的数组
ORG 0000H
AJMP START
ORG 0040H
START:
MOV SP,#60H
MOV
A,#00H
MOV DPTR,#4000H ;锯齿波缓冲区首址
NEXT:
MOVX @DPTR,A
;填锯齿波数据
INC DPTR
INC A
JZ NEXT1
;写完256个数据后退出
AJMP NEXT
NEXT1:
MOV A,#00H
MOV
R0,#00H
MOV DPTR,#4100H ;三角波缓冲区首址
NEXT2:
MOVX @DPTR,A
;填三角波数据(上升部分)
INC DPTR
ADD A,#02H
INC R0
CJNE
R0,#80H,NEXT2
SUBB A,#02H
CLR C
NEXT3:
MOVX
@DPTR,A ;填三角波数据(下升部分)
INC DPTR
SUBB A,#02H
INC
R0
CJNE R0,#00H,NEXT3;写完256个数据后退出
;--------------SIN
WAVE------------------
MOV R0,#10H
MOV R1,#00H
MOV
DPTR,#STEP ;步长的浮点ASCII起始地址
READ:
MOV A,R1
MOVC
A,@A+DPTR
MOV @R0,A
INC R1
INC R0
CJNE
R1,#0AH,READ ;将程序区的数据移到内部RAM区
MOV R0,#10H ;十进制浮点数的首址
MOV
R1,#30H ;三字节浮点数的首址(步长)
LCALL %FDTB3
;带符号十进制数ASCII码浮点数
;转换成三字节浮点数
MOV R2,#00H
MOV R3,#80H
;电压的最大值
MOV R0,#18H ;三字节浮点数的首址(最大电压)
LCALL %WTF31
;双字节无符号数转换成
;三字节浮点数
MOV R3,#00H ;STEP LENGTH
MOV
DPTR,#4200H ;正弦波数据表首址
CALCSIN:
PUSH 3
PUSH DPH
PUSH
DPL
MOV R2,#00H
MOV R0,#38H ;FLOAT STEP ADDRESS
LCALL %WTF31 ;双字节无符号数转换成
;三字节浮点数
MOV R0,#30H
MOV
R1,#38H
LCALL %FMUL3 ;三字节浮点数乘法子程序
MOV 40H,R4 ;MUL
ADDRESS
MOV 41H,R2
MOV 42H,R3
MOV R0,#40H
MOV R1,#48H ;SIN VALUE ADDRESS
LCALL %FSIN3
;三字节浮点数正弦子程序
MOV R0,#18H
MOV R1,#48H
LCALL
%FMUL3 ;三字节浮点数乘法子程序
MOV 38H,R4 ;MUL ADDRESS
MOV
39H,R2
MOV 3AH,R3
MOV R0,#38H
LCALL %FTW3
;三字节浮点数转换成
;双字节无符号数
POP DPL
POP DPH
MOV
A,#80H
ADD A,R3
JNZ SIN90 ;判断峰值
MOV
A,0FFH
SIN90:
MOVX @DPTR,A ;把计算值填表
MOV A,DPL
ORL A,#80H ;计算sin(a+180)
MOV DPL,A
MOV A,#80H
CLR C
SUBB A,R3
MOVX @DPTR,A ;把计算值填表
MOV
A,DPL
ANL A,#7FH
MOV DPL,A
INC DPTR
POP
3
INC R3
CJNE R3,#80H,CALCSIN
;判断计算完毕
;波形显示程序
WAVE:
MOV R1,#00H
WAVE1:
MOV
DPTR,#4000H ;显示锯齿波(256次)
LCALL D_A
DJNZ
R1,WAVE1
WAVE2:
MOV DPTR,#4100H ;显示三角波(256次)
LCALL
D_A
DJNZ R1,WAVE2
WAVE3:
MOV DPTR,#4200H
;显示正弦波(256次)
LCALL D_A
DJNZ R1,WAVE3
SJMP WAVE
;循环显示
D_A:
MOV R0,#00H ;置计数器
LOOP:
MOVX
A,@DPTR ;查波形表
PUSH DPL
PUSH DPH
MOV
DPTR,#D_APORT
MOVX @DPTR,A ;启动 D/A
POP DPH
POP
DPL
INC DPTR ;改变表格地址
INC R0
CJNE
R0,#00H,LOOP ;判断是否显示完
RET
;步长的十进制ASCII码浮点数
STEP DB
30H,2EH,30H,32H,34H,35H,34H,34H,2CH;'0.024544,'
END
51单片机设计的简易的计算器
2011-09-15 求助:关于80C51单片机简易计算器设计的程序,要求是汇编语... 20 2017-06-24 求助各位大神:用51单片机制作的简单计算器程序 4 2016-12-02 大神,求51单片机做简易计算器的那个c语言程序 12 2014-06-23 用51单片机实现一个简单计算器的功能 1 2018-06-30 求不用单片机的简易计算器设计?谢谢...
51单片机程序怎么写
这是最简单的,给你参考:include<reg51.h> sbit LED=P1^0;\/\/程序一:LED闪亮 void delay(){ unsigned char i,j;for(i=0;i<255;i++);for(j=0;j<255;j++);} void main(){ while(1){ LED=0;delay();LED=1;delay();} } ...
51单片机最小系统原理图
说明单片机使用内部存储器.如果选择外部的存储器,太浪费单片机仅有的资源,所以这一脚永远接电源5V(如上图所示),使用单片机的内部存储器.5 如果内部存储器不够容量,最多选择更高级的容量,就可以解决容量不够的问题了,就是这么简单 .一天入门51单片机:点我学习 .我是岁月哥,愿你学习愉快!
利用51单片机和3位数码管实现10分钟内的简易计时器
修改如下:#include<reg51.h>#define uint unsigned int#define uchar unsigned char uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};sbit key1=P2^7;sbit key2=P2^6;sbit weiH=P3^0;sbit weiM=P3^1;sbit weiL=P3^...
51单片机制作简易数字频率计程序
这里有一个四位数码管的频率计,供参考 include <reg52.h>#define uchar unsigned char#define uint unsigned intuchar duan[10]={0xc0,0Xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; \/\/所需的段的位码\/\/uchar wei[4]={0XEf,0XDf,0XBf,0X7f}; \/\/位的控制端(开发板)uc...
51单片机程序编写
不能帮你写,自己做吧,应该很简单.有问题自己分步把它整理解决: 验证确认你的51单片机正常工了 验证你的led显示程序是否有问题 验证MLX90614与51通讯正常. 51内部的温度判断处理程序是否有问题. 我觉得你最有可能的问题应该是与mlx90614通讯没做对.网上有很多它的通讯源码找一个参考一下. 本回答被网友采纳 已赞...
51单片机系列:单片机最小系统
单片机是一种集成电路芯片。在单片机程序的控制下能准确、迅速、高效地完成程序设计者事先规定的任务。单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统。下面给大家介绍51单片机最小系统,一起学习。下图是最小系统原理图,就是靠这四个部分,单片机就可以运行起来了。
用51单片机做的是简易秒表程序,为什么函数disp哪里只能用共阴的,用共...
共阴,共阳是指数码管显示的方式是高准位输出电流还是低准位吸入电流方式,共阴的方式顾名思义就是高准位输出到各个段,然后各段的阴极接一起到地,共阳极则相反,是各段的高电平接到电源脚,要亮哪个段就输出低准位就可以了。在这个案例里面的段码的配合是共阴极的码,当然用到共阳极就不能显示了...
怎样制作51单片机最小电路?
51单片机的最小电路只有几个小块,时钟电路,电源都很简单,然后就是复位电路,还有P0口加上接电阻(当普通IO使用时):当然还有一个串口程序下载的电路:
求一个51单片机C语言程序编程
实验内容:单片机甲、乙进行双机串行通信,甲机通过串口控制乙机LED闪烁(如下图所示,要求利用芯片MAX232),双方的晶振频率均为11.0592MHz(波特率为9600kb\/s)要求:甲机按开关K1一次,发送字符“A”给乙机,点亮灯D1与D2;按开关K1两次,发送字符“B”给乙机,点亮灯D3与D4;按开关K1三次,...
殷勤习舒肝: 可以,如果只是方波、正弦波和三角波就可以, 先选择波形,设定频率, 然后计算波形周期,和波形上每个点的数值 设定一个十几微妙的中断, 每个定时中断中输出波形上的一个点,通过DAC,加上高频滤波输出比较平滑的模拟量. 如果用C8051系列的高速单片机可以输出更好的波形
大埔县15763101596: 用51单片机来设计一个函数波形发生器 - ?
殷勤习舒肝: 这是定义一串值,然后由单片机产生的 我可以把正弦函数的仿真图和程序给你,一看就知道了
大埔县15763101596: 如何用51单片机设计出一个任意波形信号发生器 - ?
殷勤习舒肝: 这个需要DA转换芯片,将要产生的波形数字化,存入数组中,由单片机按顺序依次送往DA芯片进行转换,例如产生正弦波,频率50HZ,可以用100个点来描述,每隔200uS送1个数据,100个数据花20ms.数字化点越多,波形越完美,但也与你的DA芯片精度有关,8位DA只能输入256个数字量,很难得到很好的波形
大埔县15763101596: 想用51单片机做一个波形发生器,频率幅度可调,最高频率500khz,用C语言编写. - ?
殷勤习舒肝: 以单片机为基础,设计并开发能输出多种波形(正弦波、三角波、锯齿波、方波、梯形波等)且频率、幅度可变的波形发生器.http://www.eeskill.com/file/id/19068.
大埔县15763101596: 单片机8051设计简易波形发生器,要求能产生正弦波,方波,三角波,通过键盘可改变输出信号的频率和幅度 - ?
殷勤习舒肝: 基于51单片机的信号发生器-完整电路、程序 http://wenku.baidu.com/view/effec6f2ba0d4a7302763a13.html 免费的.可以产生弦波、方波、三角波、三角波、梯形波及其他任意波形,波形的频率(最大790HZ)和幅度在一定范围内可任意改变.波形和频率的改变通过软件控制,幅度的改变通过硬件实现.这是本人课程设计得到优秀的作品,有完整的电路图,程序.不是光仿真那种.如果你觉得790HZ的频率不够的话,可以用FPGA+AD,频率几十M都没问题,也不是很难.多看看资料,
大埔县15763101596: 用AT89C51单片机定时/计数器0的定时功能构成一简单的方波发生器 - ?
殷勤习舒肝: 这是我的一个程序: #include<reg52.h> #define uchar unsigned char #define uint unsigned int /******************************************************************** * 名称 : Time0_Init() * 功能 : 定时器的初始化,11.0592MZ晶振,50ms * 输入 : 无 * ...
大埔县15763101596: 求用单片机制作简易信号发生器的电路图 - ?
殷勤习舒肝: 运放选OP07就可以了,由于DAC0832是单电源供电的,只能产生正记性波形,所以利用外部运放来实现负极性波形的产生
大埔县15763101596: 单片机波形发生器问题 - ?
殷勤习舒肝: 周期通过定时器控制,比如你要产生1KHz的正弦波,要先存储一个周期的波形(如32个点,数据类型根据你的DAC位数确定),那么每隔1/(32*1000)s就要向DAC发一次数据,得到一个电压.依次产生下一个电压.直到32个点轮完,再重复.这时你在DAC的输出端得到一个阶梯状的正弦波,用个二阶低通就可以得到光滑的正弦波.简单说,你的工作就是做个DDS.至于信号的幅度,由DAC的最大输出电压和你的那32个点中的最大值决定.
大埔县15763101596: 用AT89C51单片机定时/计数器0的定时功能可构成一简单的方波发生器,实现周期为2s的方波, - ?
殷勤习舒肝: ;启动入口 ORG 0000H ;复位启动 LJMP START ; ORG 000BH ;T0中断 LJMP T0INT ; ORG 0100H ; LJMP START ; YSJS EQU 30H ; ;主控程序 START: MOV SP,#80H ;初始堆栈值 MOV TMOD,#01H ;定时器0工作于方式1 MOV TH0,#0...
大埔县15763101596: 用AT89C51单片机构成一简单的方波发生器 急求!?
殷勤习舒肝:ORG 0000H LJMP start ORG 000BH LJMP aaaa ;3个周期 ORG 0030H start: MOV TMOD,#01H MOV TH0,#0FFH MOV TL0,#3AH SETB TR0 SETB ET0 SETB EA SJMP $ aaaa: MOV TH0,#0FFH ;197个周期 MOV TL0,#3AH CPL P1.7 bbbb: RETI END 共延时200个周期 也就是25us取反P1.7脚,P1.7输出为方波,周期为200us*2=400us 12M晶振为Ius周期