
你抄人家的,也应该过下脑啊,电路图都是画错了啊;
8位DAC,采用直通方式,其他读写线都接低电平就好了;
基准电压=5V,那么 8位DAC=ffh,对应输出= -5V,8位DAC=00h,对应输出=0V;
1)所以你要得到矩形波时,就是控制单片机输出P0=0xff的时间,以及P0=0x0的时间;
2)要输出三角波时,P0 输出:最小值为 0,最大值为 0xff,那么必须先假设一个波形周期均匀输出20个采样值,则三角波上升期为10个采样值,下降期也为10个采样值;
然后反过来求出量化值;
因为: 5V/10=05V,那么 N0/256 = 05/5;N1/256 = 10/5;N2/256 = 15/5;
N9/256 = 5/5;从而得到10个量化值,这是上升期的量化值,下降期的量化值则是前面量化值的反序排列,然后做成一个有20个数的数组;
那么程序就是按一定的时间间隔循环输出这20个的数组,即可得到三角波了;
3)锯齿波, *** 作上类似三角波,只是上升期的采样个数与下降期的采样个数不等;
如一个波形周期仍然均匀输出20个采样值,只是上升期为6个采样值,下降期也为14个采样值;
程序加一个的LCD1602,你选择使用
的#include <reg52h>的/ /包含头文件
?#包括<intrinsh>的
#定义UCHAR无符号的字符/ /宏定义
?#定义UINT无符号整数
?UCHAR I,J,N,Z,/ /定义全局变量
SBIT RS = P2 ^ 0; / /定义端口
?和SBIT RW = P2 ^ 1;
SBIT E = P2 ^ 2;
SBIT K = P2 ^ 7;
SBIT K1 = P2 ^ 6;
UCHAR代码STR0 [] = {“正弦波”}; / /定义LCD1602显示的字符数组
UCHAR代码STR1 [] = {“三角波”};
UCHAR代码字符串str2 [] = {“方波”};
?的UCHAR代码表[3] [40] = / /定义的两维阵列的波形
?{
??80H时,0x94的,0xa7,0xb9,0xca,0xd9,0xe7,0xf1,0XF8,是0xFD,
??是0xFD,0xff,则0XF8,0xf1,0xe7,0xd9,0xca,0xb9 0xa7,0x94的,
??80H时,0x6c,将0x55,0x46,0x35,$ 25,为0x18,0X0E,0X06,0X02,
??为0x00,0X02,0X06,0X0E,为0x18,$ 25,0x35,0x46,0x55的,0x6c,
??80H时,0x8c,0x99,0xa6,0xb3,0XC0,含有0xCC,0xd9,0xe6,0xf2,
??为0xff,0xf2,0xe6,0xd9,含有0xCC,0XC0,0xb3,0xa6,0x99,0x8c,
??80H时,为0x73,0x66,0X5A,0x4d,0X40,地址0x33,0X26,0X1A,0X0D,
?为0x00,0X0D,0X1A,0X26,地址0x33,0X40,0x4d,为0x5A,0x66,为0x73,
??为0xff,0xff,则是0xFF,0xFF时,为0xff,0xff,则是0xFF,0xFF时,为0xff,0xff,则
??为0xff,0xff,则是0xFF,0xFF时,为0xff,0xff,则是0xFF,0xFF时,为0xff,0xff,则
??0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
??0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00
?};
?无效延迟(UINT Z)/ /延时程序
?{
????(Z,Z> 0,Z - )
???
??
??}
?}
?无效Write_command“(UCHAR CMD)/ / LCD1602写命令程序
?{
??RS = 0; / /选择指令寄存器
?RW = 0; / /写 *** 作
?E = 1 / /使能端
?P1 = CMD;
?延迟时间(1);
?E = 0;
LCD1602是不是很忙?延迟(10); / /延时
?}
?无效WRITE_DATA(UCHAR CMD)/ / LCD1602写入数据的命令
?{
??RS = 1; / /选择数据寄存器
?RW = 0; / /写 *** 作
?E = 1; / /结束
?P1 = CMD;
?延迟时间(1);
?E = 0;
LCD1602是不是很忙?延迟(10); / /延时
?}
?的无效Lcd_init()/ / LCD1602初始化程序
?{
????Write_command(0x38); / /设置16 5 7点阵8位数据接口
?Write_command(0X0C)/ / LCD1602打开显示,不显示光标
?Write_command(0X06)/ /读或写一个字符指针加1不动
?Write_command(0X80 +0 X00); / /设置数据地址指针
?}
?无效显示器()/ / LCD1602显示英语课程
?{
????Lcd_init();
?(我== 0)
???
?组(n = 0,N <13,N +)
???
???WRITE_DATA(STR0 [N]);
??}
????}
?否则,如果(我== 1)
?{
?组(n = 0,N <13,N +)
??
??WRITE_DATA(STR1 [N]);
?}
?}
?其他
?{
?组(n = 0,N <13,N +)
??
??WRITE_DATA(字符串str2 [N]);
?}
?}
?}
无效的主要()/ /主函数
?{
???显示();
?而(1)
?{
??中for(j = 0; J <40; + +)
???
???P0 =表[I] [J];
???
??}
(k == 0)/ /切换程序??
???
????延迟时间(1);
???(k == 0);
????
????(K == 0)
?????
????+ +;
????如果(i == 3)= 0;
???显示();
????}
????
???}
??????而(k == 0);
??}
?}
?}
如下即可:
ORG 0000H
LJMP MAIN
ORG 3000H
MAIN:
MOV DPTR, #07FFFH
MOV A, #00H
LOOP:
MOVX @DPTR,A ;输出
INC A ;递增
JNZ LOOP ;非零则转移到前面,继续输出、递增
;----------------------------------------------------
LP2: ;为0则执行下面的
MOVX @DPTR,A ;输出
DEC A ;递减,将为255、254。。。
JNZ LP2 ;非零,就转移,继续输出、递减
AJMP LOOP ;无限循环
END
锯齿波。
信号发生器可以产生正/余弦波、锯齿波、三角波和方波,作为信号源使用,使用时负极接地,正极为信号输出,下边两个用于波形的调制。
程序中用MOVX指令输出数据,P0就不能用上拉电阻,按你的仿真图,把第6行改成MOVP0,A就行,把0832的WR1接地。
另外,那个RN1必须要去掉,不论哪种方式数据线都不能串联电阻,还有,从P0口每输出一个数据后要延时一点,加个延时子程序。
可以这样,DAC0832是根据输入的数字量,输出相应的模拟量,锯齿波是有规律的模拟量。
单片机内部程序可以通过算法(规律计算或数组),定时生成一个数字量发送到DAC0832,使其输出相应模拟量,即可。
例如锯齿波是从0~3V,将0~3V分为若干个点(分辨率),定时输出每个点的数字量。
以上就是关于单片机汇编语言编程 求方波、三角波和锯齿波汇编程序怎么编写一段一段分开,不需要按按钮的那种全部的内容,包括:单片机汇编语言编程 求方波、三角波和锯齿波汇编程序怎么编写一段一段分开,不需要按按钮的那种、试用c语言编写一个能输出锯齿波信号的单片机c51程序、这是显示锯齿波的程序,我想知道如果我想产生三角波应改变哪为什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)