A. 用定时器编写占空比50%周期2s的梯形图方波程序
X0 T1 K10
II--------I/I---------------------------------------(T0) 1秒
T0 K10
II--------I------------------------------------------(T1) 1秒
I
I------------------------------------------(Y0)
X0为选择开关
B. 梯形波 程序代码
Fs=100;%采样频率
x=0:1/Fs:100;
A=10;%幅度
T=10;%周期
m=8;%梯形高度
xx=2*x/T;
y=A*((xx-floor(xx)).*((mod(floor(xx),2)==0)-(mod(floor(xx),2)==1))+(mod(floor(xx),2)==1));
y=y+(m-y).*(y>m);
plot(x,y)
C. 微机课设:用汇编语言编写一个信号发生器,要求产生正弦波、梯形波、阶梯波、方波
IOY0 EQU 0D400H ;片选IOY0端口始地址
IOY1 EQU 0D440H ;片选IOY1端口始地址
IOY2 EQU 0D480H ;片选IOY2端口始地址
IOY3 EQU 0D4C0H ;片选IOY3端口始地址
;********************************************
ADC0809 EQU IOY0+00H ;ADC0809端口地址
PA55 EQU IOY1+00H ;8255的A口地址
PB55 EQU IOY1+04H ;8255的B口地址
PC55 EQU IOY1+08H ;8255的C口地址
PCTL EQU IOY1+0CH ;8255的控制寄存器地址
DAC0832 EQU IOY2+00H ;DAC0832端口地址
TIMER0 EQU IOY3+00H ;8254计数器0端口地址
TIMER1 EQU IOY3+04H ;8254计数器1端口地址
TIMER2 EQU IOY3+08H ;8254计数器2端口地址
TCTL EQU IOY3+0CH ;8254控制寄存器端口地址
STACK1 SEGMENT STACK
DW 256 DUP(?)
STACK1 ENDS
DATA SEGMENT
STR1 DB 'Please input password:',0AH,0DH,'$'
STR2 DB 'The password is not right !!!Please try again!!!',0AH,0DH,'$'
STR3 DB 'Welcome to the signal creat machine',0AH,0DH,'Loading ADC0809.....',0AH,0DH,'$'
STR4 DB 'The passward is right',0AH,0DH,'$'
DTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H ;7段数码管的段位值
STABLE DB 80H,8CH,98H,0A5H,0B0H,0BCH,0C7H,0D1H,0DAH,0E2H,0EAH,0F0H,0F6H,0FAH,0FDH,0FFH,0FFH,0FDH,0FAH,0F6H,0F0H,0EAH,0E2H,0DAH,0D1H,0C7H,0BCH,0B0H,0A5H,98H,8CH,80H,7FH,73H,67H,5AH,4FH,43H,38H,2EH,25H,1DH,15H,0FH,09H,05H,02H,00H,00H,02H,05H,09H,0FH,15H,1DH,25H,2EH,38H,43H,4FH,5AH,67H,73H,7FH
PASSWORD DB 41H,42H,43H,44H ;预设密码
GAO DB 1 DUP (?) ;预留显示十位
DIW DB 1 DUP (?) ;预留显示个位
PW DB 4 DUP (?) ;密码预留
YU DB 20 DUP (?) ;预留20个空间存放数据
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
CALL CLK ;ADC0809 CLK输入
MOV DX,PCTL ;初始化8255工作方式
MOV AL,88H ;1000 1000方式0,A口,B口输出,C口高四位输入
OUT DX,AL ;
L0: CALL DIS
MOV DX,OFFSET STR1 ;显示提示信息
MOV AH,9
INT 21H
CALL DIS
;*******识别密码***********
L1: MOV CX,4
MOV SI,OFFSET PW
L: MOV AH,01H ;输入密码
INT 21H
MOV [SI],AL
INC SI
CMP AL,45H ;检测有无E
JZ E
LOOP L
MOV CX,4
MOV SI,OFFSET PASSWORD;取PASSWORD的偏移地址
MOV DI,OFFSET PW
TE: MOV AL,[DI]
CMP AL,[SI]
JNE TE1
INC DI
INC SI
LOOP TE
JMP Q
TE1: MOV DX,OFFSET STR2 ;显示密码错误
MOV AH,9D
INT 21H
JMP L0
E: JMP QUIT
;*****启动ADC0809的INO***********
Q: MOV DX,OFFSET STR4
MOV AH,09H
INT 21H
MOV DX, OFFSET STR3 ;显示提示信息
MOV AH,09H
INT 21H
; MOV AH,00H ;将AH清零用于加法
; MOV CX,20D
L2: MOV DX,ADC0809 ;启动0809的IN0
OUT DX,AL
L3: CALL DALLY
;*****读取EOC的值****************
MOV DX,PC55
IN AL,DX ;读C口的值
TEST AL,80H ;检测出C7的值是否为1
JZ L3 ;C7不为1则跳到L3
;*****读取0809IN0的值*************
CALL SIN
JMP L0
MOV DX,ADC0809 ;读取0809IN0的值
IN AL,DX
; ADD AH,BL
; LOOP L2 ;求20次数据的和
;
; MOV AL,AH
; MOV BL,20D
; DIV BL ;求采集数据20次的平均值(修改)
; MOV BH,AL
MOV BL,AL
MOV CL,04H
SHR AL,CL ;取出十位
MOV GAO,AL ;存十位的值
MOV AL,BL
AND AL,0FH ;取出个位
MOV DIW,AL ;存个位的值
CALL DIS ;调用数码管显示函数
CALL DIS
MOV AL,BL
CMP AL,15H
JL L4
MOV AL,BL
CMP AL,80H
JL L5
MOV AL,BL
CMP AL,0A0H
JL L6
MOV AL,BL
CMP AL,0C0H
JL L7
CALL FANG1K
JMP L0
L4: CALL JIETI
JMP L0
L5: CALL SIN
JMP L0
L6: CALL TIXING
JMP L0
L7: CALL FANG500
JMP L0
QUIT: MOV AX,4C00H ;结束程序退出
INT 21H
DIS PROC NEAR ;显示子函数
PUSH AX
PUSH DX
PUSH BX
MOV AL,0EFH ;选通位LED 1110 1111
MOV DX,PA55
OUT DX,AL
MOV SI,OFFSET GAO ;取个位地址
MOV AL,[SI] ;取个位数据
MOV BX,OFFSET DTABLE
AND AX,00FFH
ADD BX,AX
MOV AL,[BX]
MOV DX,PB55
OUT DX,AL
MOV AL,0DFH ;选通个位LED 1101 1111
MOV DX,PA55
OUT DX,AL
MOV SI,OFFSET DIW ;取个位地址
MOV AL,[SI] ;取个位数据
MOV BX,OFFSET DTABLE
AND AX,00FFH
ADD BX,AX
MOV AL,[BX]
MOV DX,PB55
OUT DX,AL
POP BX
POP DX
POP AX
RET
DIS ENDP
CLK PROC NEAR ;方波CLK时钟18.432K子程序
;****初始化8254计数器0工作在方式3,以十进制计数,初值为100*******
PUSH DX ;保护现场
PUSH AX ;保护现场
MOV DX,TCTL
MOV AL,17H ;0001 0111B
OUT DX,AL
MOV DX,TIMER0 ;装初值100
MOV AL,100D
OUT DX,AL
POP AX ;恢复现场
POP DX ;恢复现场
RET
CLK ENDP
FANG1K PROC NEAR ;方波1KHz子程序
;***初始化8254计数器1工作在方式3,以十进制计数,初值为184******
PUSH DX ;保护现场
PUSH AX ;保护现场
MOV DX,TCTL
MOV AL,57H ;0101 0111B
OUT DX,AL
MOV DX,TIMER1
MOV AL,0B8H;184
OUT DX,AL
F: CALL DIS
MOV DL,0FFH ;判断主键盘有无键按下
MOV AH,6
INT 21H
JZ F
POP AX ;恢复现场
POP DX ;恢复现场
RET
FANG1K ENDP
FANG500 PROC NEAR ;方波500Hz子程序
;***初始化8254计数器1工作在方式3,以十进制计数,初值为368******
PUSH DX ;保护现场
PUSH AX ;保护现场
MOV DX,TCTL
MOV AL,77H ;0111 0111B
OUT DX,AL
MOV DX,TIMER1
MOV AL,70H ;368D分高低位写入
OUT DX,AL
MOV AL,01H
OUT DX,AL
F1: CALL DIS
MOV DL,0FFH ;判断主键盘有无键按下
MOV AH,6
INT 21H
JZ F1
POP AX ;恢复现场
POP DX ;恢复现场
RET
FANG500 ENDP
JIETI PROC NEAR ;阶梯波子程序
PUSH DX
PUSH AX
J0: MOV AL,00H;AL=0
J1: MOV DX,DAC0832;AL OUT
OUT DX,AL
ADD AL,33H
CALL DALLY1
CMP AL,0FFH
JNE J1
CALL DIS
MOV DL,0FFH ;判断主键盘有无键按下
MOV AH,6
INT 21H
JZ J0
POP AX
POP DX
RET
JIETI ENDP
SIN PROC NEAR ;正弦波子程序
PUSH AX
PUSH BX
PUSH DX
S0: MOV BX,10H
S1: MOV SI,OFFSET STABLE
MOV CX,64D
S2: MOV AL,[SI]
MOV DX,DAC0832
OUT DX,AL
INC SI
LOOP S2
JMP S1
DEC BX
CMP BX,00H
JNE S1
CALL DIS
MOV DL,0FFH ;判断主键盘有无键按下
MOV AH,6
INT 21H
JZ S0
POP DX
POP BX
POP AX
RET
SIN ENDP
TIXING PROC NEAR ;梯形波子程序
PUSH AX
PUSH DX
PUSH BX
T: MOV BX,10H
MOV AL,00H
MOV DX,DAC0832
OUT DX,AL
T0: MOV AL,33H
T1: MOV DX,DAC0832
OUT DX,AL
INC AL
CMP AL,0FFH
JNE T1
CALL DALLY1
T2: OUT DX,AL
DEC AL
CMP AL,33H
JNE T2
DEC BX
CMP BX,00H
JNE T0
CALL DIS
MOV DL,0FFH ;判断主键盘有无键按下
MOV AH,6
INT 21H
JZ T
POP BX
POP DX
POP AX
RET
TIXING ENDP
;****延时子程序**********************
DALLY1 PROC NEAR
PUSH CX
PUSH AX
MOV CX,1000H
D1: MOV AX,0100H
D2: DEC AX
JNZ D2
LOOP D1
POP AX
POP CX
RET
DALLY1 ENDP
DALLY PROC NEAR
PUSH CX
PUSH AX
MOV CX,4000H
D3: MOV AX,0600H
D4: DEC AX
JNZ D4
LOOP D3
POP AX
POP CX
RET
DALLY ENDP
CODE ENDS
END START
D. 单片机与0832输出梯形波,分别用c语言和汇编编写
这个需要硬件支持。暂时不清楚你的电路。用伪代码表示。
// C code
#define dotNum 128 //一个周期的采样点数.
const int Keystone[dotNum] ={....}; //梯形波的采样值
int main()
{
int i = 0;
int data;
for(;;)
{
i %= dotNum ;
data = Keystone[i];
i++;
DAC0832_convert(data);
}
return 0;
}
;asm code
org 0000H
main:
;点数
mov R1,#7FH
LOOP:
;获取地址
MOV DPTR,#Keystone
move A,R1
MOVC A,@A+DPTR
mov R2,A
LCALL DAC0832 ;调用DAC0832函数
mov P.x,R2
DEC R1
DJNC R1,#LOOP
SJMP main
;梯形波的采样值
Keystone: DB ..........
DAC0832:
......
RET
E. 请单片机高手帮忙写一份DAC0832的梯形波C程序 51单片机
#include<absacc.h>
#define DAC0832 XBYTE[0x7FFF]
void delay() /*延时函数*/
{
unsigned int n,i;
for (n=0; n<100; n++);
for (i=0; i<300; i++);
}
void main()
{
unsigned char i,n=20;
while(1)
for(i=0;i<10;i++)
{
DAC0832=i*n;
delay();//延时1ms
}
}
程序仿真都有,望采纳!
F. 请高端人士帮忙写一下用DAC0832输出锯齿波,梯形波,三角波的程序,急求
#include<reg51.h>
/*位定义*/
sbit wr=P3^6;
sbit rd=P3^2;
sbit k0=P1^0;
sbit k1=P1^1;
sbit k2=P1^2;
sbit k3=P1^3;
sbit k4=P1^4;
unsigned char flag;//当flag为0、1、2、3、4时分别产生正弦波、方波、三角波、梯形波、锯齿波
unsigned char const code sin_code[256]={
0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,
0xa5,0xa8,0xab,0xae,0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,
0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8,0xda,0xdc,0xde,0xe0,
0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf4,
0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,
0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf3,0xf2,
0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe3,0xe1,0xde,0xdc,
0xda,0xd8,0xd6,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,
0xbc,0xb9,0xb6,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,
0x99,0x96,0x92,0x8f,0x8c,0x89,0x86,0x83,0x80,0x7d,0x79,0x76,
0x73,0x70,0x6d,0x6a,0x67,0x64,0x61,0x5e,0x5b,0x58,0x55,0x52,
0x4f,0x4c,0x49,0x46,0x43,0x41,0x3e,0x3b,0x39,0x36,0x33,0x31,
0x2e,0x2c,0x2a,0x27,0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,
0x15,0x14,0x12,0x10,0xf,0xd,0xc,0xb,0x9,0x8,0x7,0x6,0x5,0x4,
0x3,0x3,0x2,0x1,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x1,0x1,0x2,0x3,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xa,0xc,0xd,
0xe,0x10,0x12,0x13,0x15,0x17,0x18,0x1a,0x1c,0x1e,0x20,0x23,
0x25,0x27,0x29,0x2c,0x2e,0x30,0x33,0x35,0x38,0x3b,0x3d,0x40,
0x43,0x46,0x48,0x4b,0x4e,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,
0x66,0x69,0x6c,0x6f,0x73,0x76,0x79,0x7c
}; //用于生成正弦
unsigned char kscan() //键盘扫描函数
{
unsigned char kscannum,t;
P1=0xff;
t=P1;
if(~(t&0xff))
{
if(k0==0)
{
kscannum=1;
}
else if(k1==0)
{
kscannum=2;
}
else if(k2==0)
{
kscannum=3;
}
else if(k3==0)
{
kscannum=4;
}
else if(k4==0)
{
kscannum=5;
}
else
{
kscannum=0;
}
return kscannum;
}
}
void init_DA0832()//DA0832初始化
{
rd=0;
wr=0;
}
void fangbo()//产生方波函数
{
EA=1; //开总中断
ET0=1; //计时器T0工作
TMOD=1;
TR0=1; //开启T0
TH0=0xff; //装入初值
TL0=0x83;
}
void sin()//产生正弦波函数
{
unsigned int i;
do{
P2=sin_code[i];
i=i+1;
}while(i<256);
}
void juchibo()//产生锯齿波函数
{
P2=0x00;
do{
P2=P2+1;
}while(P2<=0xff);
}
void sanjiaobo()//产生三角波函数
{
P2=0x00;
do{
P2=P2+1;
}while(P2<0xff);
P2=0xff;
do{
P2=P2-1;
}while(P2>0x00);
P2=0x00;
}
void tixingbo()//产生梯形波函数
{
unsigned char i;
P2=0x00;
do{
P2=P2+1;
}while(P2<0xff);
P2=0xff;
for(i=255;i>0;i--)
{
P2=0xff;
}
do{
P2=P2-1;
}while(P2>0x00);
P2=0x00;
}
void timer0(void) interrupt 1//中断函数
{
P2=~P2; //取反
TH0=0xff; //重新装入初值
TL0=0x83;
TR0=1;
}
/*主函数*/
void main()
{
init_DA0832();//初始化
do
{
flag=kscan();
}while(!flag);//等待按键按下
while(1)
{
switch(flag)
{
case 1:
do{
flag=kscan();
sin();
}while(flag==1);//产生正弦波
break;
case 2:
fangbo();
do{
flag=kscan();
}while(flag==2);//产生方波
TR0=0;
break;
case 3:
do{
flag=kscan();
sanjiaobo();
}while(flag==3);//产生三角波
break;
case 4:
do{
flag=kscan();
tixingbo();
}while(flag==4);//产生梯形波
break;
case 5:
do{
flag=kscan();
juchibo();
}while(flag==5);//产生锯齿波
break;
default:
flag=kscan();
break;
}
}
}
G. 急求用DAC接口电路,编写产生负向锯齿波、三角波、梯形波的程序
sbit wr=P3^6;
sbit rd=P3^2;
sbit k0=P1^0;
sbit k1=P1^1;
sbit k2=P1^2;
sbit k3=P1^3;
sbit k4=P1^4;
unsigned char flag;//当flag为0、1、2、3、4时分别产生正弦波、方波、三角波、梯形波、锯齿波
unsigned char const code sin_code[256]={
0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,
0xa5,0xa8,0xab,0xae,0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,
0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8,0xda,0xdc,0xde,0xe0,
0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf4,
0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,
0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf3,0xf2,
0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe3,0xe1,0xde,0xdc,
0xda,0xd8,0xd6,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,
0xbc,0xb9,0xb6,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,
0x99,0x96,0x92,0x8f,0x8c,0x89,0x86,0x83,0x80,0x7d,0x79,0x76,
0x73,0x70,0x6d,0x6a,0x67,0x64,0x61,0x5e,0x5b,0x58,0x55,0x52,
0x4f,0x4c,0x49,0x46,0x43,0x41,0x3e,0x3b,0x39,0x36,0x33,0x31,
0x2e,0x2c,0x2a,0x27,0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,
0x15,0x14,0x12,0x10,0xf,0xd,0xc,0xb,0x9,0x8,0x7,0x6,0x5,0x4,
0x3,0x3,0x2,0x1,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x1,0x1,0x2,0x3,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xa,0xc,0xd,
0xe,0x10,0x12,0x13,0x15,0x17,0x18,0x1a,0x1c,0x1e,0x20,0x23,
0x25,0x27,0x29,0x2c,0x2e,0x30,0x33,0x35,0x38,0x3b,0x3d,0x40,
0x43,0x46,0x48,0x4b,0x4e,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,
0x66,0x69,0x6c,0x6f,0x73,0x76,0x79,0x7c
}; //用于生成正弦
unsigned char kscan() //键盘扫描函数
{
unsigned char kscannum,t;
P1=0xff;
t=P1;
if(~(t&0xff))
{
if(k0==0)
{
kscannum=1;
}
else if(k1==0)
{
kscannum=2;
}
else if(k2==0)
{
kscannum=3;
}
else if(k3==0)
{
kscannum=4;
}
else if(k4==0)
{
kscannum=5;
}
else
{
kscannum=0;
}
return kscannum;
}
}
void init_DA0832()//DA0832初始化
{
rd=0;
wr=0;
}
void fangbo()//产生方波函数
{
EA=1; //开总中断
ET0=1; //计时器T0工作
TMOD=1;
TR0=1; //开启T0
TH0=0xff; //装入初值
TL0=0x83;
}
void sin()//产生正弦波函数
{
unsigned inti;
do{
P2=sin_code[i];
i=i+1;
}while(i<256);
}
void juchibo()//产生锯齿波函数
{
P2=0x00;
do{
P2=P2+1;
}while(P2<=0xff);
}
void sanjiaobo()//产生三角波函数
{
P2=0x00;
do{
P2=P2+1;
}while(P2<0xff);
P2=0xff;
do{
P2=P2-1;
}while(P2>0x00);
P2=0x00;
}
void tixingbo()//产生梯形波函数
{
unsigned char i;
P2=0x00;
do{
P2=P2+1;
}while(P2<0xff);
P2=0xff;
for(i=255;i>0;i--)
{
P2=0xff;
}
do{
P2=P2-1;
}while(P2>0x00);
P2=0x00;
}
void timer0(void) interrupt 1//中断函数
{
P2=~P2; //取反
TH0=0xff; //重新装入初值
TL0=0x83;
TR0=1;
}
/*主函数*/
void main()
{
init_DA0832();//初始化
do
{
flag=kscan();
}while(!flag);//等待按键按下
while(1)
{
switch(flag)
{
case 1:
do{
flag=kscan();
sin();
}while(flag==1);//产生正弦波
break;
case 2:
fangbo();
do{
flag=kscan();
}while(flag==2);//产生方波
TR0=0;
break;
case 3:
do{
flag=kscan();
sanjiaobo();
}while(flag==3);//产生三角波
break;
case 4:
do{
flag=kscan();
tixingbo();
}while(flag==4);//产生梯形波
break;
case 5:
do{
flag=kscan();
juchibo();
}while(flag==5);//产生锯齿波
break;
default:
flag=kscan();
break;
}
}
}
H. 利用单片机产生梯形波,高手进!
只是正常的波形而已,只要在单片机程序中控制输出高低电平即可。高电平时即为顶端,低电平即为波谷,通过控制高低电平的输出时间,就可以得到想要的规则波形,如输出高电平1s,转而输出低电平1s,反复交替,出来的结果就是等距的梯形波排列。同时,没有绝对意义的矩形波,由于器件的特性,如需要充放电时间等,波的边沿不可能是垂直的,不可能一下子就到波谷或者波峰。需要一个爬升、下降时间,这样一来波的边沿就会变成有一个坡度,因此在示波器上看起来就像一个个梯形。从你给出的图看,这是一个时序图而已,器件本身工作特性。不知道你为什么要做这个波形。