当前位置:文档之家› 串行口扩展并行口

串行口扩展并行口

假设要求的周期为Tms,则需要查表次数N=(T-0.25ms)/(17.36us)
即320us中要启动N次,启动周期为t=250us/N
查表就是查启动周期
*/
//调试:频率可改变,但频率不准,范围1~3KHZ,超过这范围又回到2KHZ
Addr_0832 XDATA 0FF00H
ORG 0000H
AJMP START
CJNE R0,#28H,GO0
MOV R0,#14H
GO0:
RETI
EXINT1:
DEC R0
DEC R0
CJNE R0,#0H,GO1
MOV R0,#14H
GO1:
RETI
TAB: ; 1HZ~3KHZ
DB 0FFH,0FAH,0FFH,0F9H,0FFH,0F9H,0FFH,0F8H,0FFH,0F7H
AJMP START1
T0INT:
MOV DPTR,#TAB;TH/TL重赋值
MOV A,R0
MOVC A,@A+DPTR
MOV TH0,A
INC R0
MOV A,R0
MOVC A,@A+DPTR
MOV TL0,A
DEC R0
MOV R6,#0FFH
CLR TR0
SETB TR1
RETI
T1INT:
}
}
3、通过DAC0832输出正弦波,初始频率为100HZ。
原理图:
流程图:
开始
0->R0
R0->A,TAB->DPTR
(A+DPTR)->A
0832->DPTR
A->(DPTR)
延时、R0+1->R0
汇编源程序:
Addr_0832 XDATA 0FF00H
ORG 0000H
AJMP START
ORG 0100H
START:
MOV SP,#60H
MOV R1,#00H ;取表格初值
LOOP:;在表格里取数送到指定地址
MOV A,R1
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV DPTR,#Addr_0832
MOVX @DPTR,A
ACALL DELAY
;
INC R1 ;表格加一
AJMP LOOP ;循环
ORG 000BH
AJMP T0INT
ORG 0003H
AJMP EXINT0
ORG 0013H
AJMP EXINT1
ORG 0100H
START:
MOV SP,#60H
MOV TMOD,#01H ;开定时器0
SETB ET0
MOV TH0,#0FFH
MOV TL0,#0EFH
SETB EA
SETB TR0;T0自启动
TH0=TAB[b];
b=b+1;
TL0=TAB[b];//时间1ms
b=b-1;
TR1=1;//开中断T1
}
void timer1(void) interrupt 3 using 1
{
TR1=0;//关自身中断
TH1=TAB[b];
b=b+1;
TL1=TAB[b];//时间1ms
b=b-1;
TR0=1;//开另一个中断
T0INT:;17.36
PUSH ACC;保护A值
MOV DPTR,#TAB;TH/TL重赋值
MOV A,R0
MOVC A,@A+DPTR
MOV TH0,A
INC R0
MOV A,R0
MOVC A,@A+DPTR
MOV TL0,A
DEC R0
POP ACC
RETI
EXINT0:
INC R0
INC R0
DELAY: ;7ms/256=27.34375US
MOV R5,#0CH
DJNZ R5,$
RET
SETTAB:
;正弦表格256个,一趟要3ms
DB 80H,83H,86H,89H,8DH,90H,93H,96H
DB 99H,9CH,9FH,0A2H,0A5H,0A8H,0ABH,0AEH
0xff,0x06,0xff,0x12,0xff,0x1d,0xff,0x27,0xff,0x30,
0xff,0x38,0xff,0x40,0xff,0x47,0xff,0x4d,0xff,0x54,
0xff,0x59};
void timer0(void) interrupt 1 using 1
{
TR0=0;//关中断T0
0xff,0xef,0xff,0xed,0xff,0xeb,0xff,0xe8,0xff,0xe6,
0xff,0xe3,0xff,0xe0,0xff,0xdc,0xff,0xd7,0xff,0xd2};
void timer0(void) interrupt 1 using 1
{
TR0=0;//关中断T0
DB 0FFH,06H,0FFH,12H,0FFH,1DH,0FFH,27H,0FFH,30H
DB 0FFH,38H,0FFH,40H,0FFH,47H,0FFH,4DH,0FFH,54H
DB 0FFH,59H
END
C语言源程序:
//只是实现能调节频率,其它的没有深究
#include<reg51.h>
TH0=0xff;
TL0=0xef;
TH1=0xff;
TL1=0xef;
ET0=1;
ET1=1;
EA=1;
TR1=0;
TR0=1;//T0自启动
IT0=1;
EX0=1;
IE0=0;
IE1=0;
IT1=1;
EX1=1;
EA=1;
while(1)
{
Addr_0832 = disnum;
disnum=disnum+8;
MOV DPTR,#TAB;TH/TL重赋值
MOV A,R0
MOVC A,@A+DPTR
MOV TH1,A
INC R0
MOV A,R0
MOVC A,@A+DPTR
DEC R0
MOV TL1,A
MOV R6,#0H
CLR TR1
SETB TR0
RETI
EXINT0:
INC R0
INC R0
CJNE R0,#2AH,GO0
//频率范围1KHZ~3KHZ
//实现效果可以调节,由小精灵计算出的频率存在误差
//当调到3KZ或者1KHZ时,又回到1KHZ
Addr_0832 XDATA 0FF00H
ORG 0000H
AJMP START
ORG 000BH
AJMP T0INT
ORG 001BH
AJMP T1INT
ORG 0003H
EA=1;
while(1)
{
Addr_0832 = a;
delay();
delay();
}
}
const unsigned char TAB[]={
0xfe,0x0c,0xfe,0x3a,0xfe,0x5f,0xfe,0x7f,0xfe,0x9b,
0xfe,0xb3,0xfe,0xc8,0xfe,0xda,0xfe,0xea,0xfe,0xf9,
原理图:
流程图:
开始定时0定时1
开定时T0,自启动保护A值R0-2->R0
赋选频初值用R0查表赋初值
恢复A值返回
开中断0、1
返回
14H->R0,0->A
中断0
A+8->A
0832->DPTR R0+2->R0
A->(DPTR)
返回
汇编源程序:
/*
采用查表调频率,查表思想是:自启动查表一次花费17.36us,而不用查表的时候要周期才0.25ms
MOV R0,#14H
GO0:
RETI
EXINT1:
DEC R0
DEC R0
CJNE R0,#0H,GO1
MOV R0,#14H
GO1:
RETI
TAB: ;1KHZ~3KHZ
DB 0FEH,0CH,0FEH,3AH,0FEH,5FH,0FEH,7FH,0FEH,9BH
DB 0FEH,0B3H,0FEH,0C8H,0FEH,0DAH,0FEH,0EAH,0FEH,0F9H
}
void exint0(void) interrupt 0 using 1
{
b=b+2;
if(b==40)
b=20;
}
void exint1(void) interrupt 2 using 1
{
b=b-2;
if(b==0)
b==20;
}
main()
{
int disnum=0;
TMOD=TIMEINT;//开启中断
实验十二并行8位D/A(电压输出)实验
一、实验目的:
1、了解DAC0832的基本原理和转换性能;
2、掌握DAC0832与8051单片机的接口方法及编程方法。
二、实验内容:
1、编写程序,通过DAC0832输出方波,初始频率为2KHZ,频率可以通过按键”0”和”1”进行步进调节,按一下”0”频率增加100HZ,按一下”1”频率降低100HZ。
delay()//延时
{
unsigned char i=40;
while(i--)
{ ; }
}
const unsigned char TAB[]={
相关主题