int pckey1() //调用int 21H中断 {
union REGS regs; regs.h.ah=0x6; regs.h.dl=0x0ff;
int86(0x21,®s,®s); return(regs.h.al); }
void plus1() // { int i;
dis1[0]=dis1[0]+1; for (i=0;i<=2;i++) { if (dis1[i]>=10) {
dis1[i]=dis1[i]-10; dis1[i+1]=dis1[i+1]+1; } else
break;
}
if (dis1[3]>=10) dis1[3]=0; return; }
void mydisp1() // {
void delay1();
加1子程序 显示子程序 41
int i,a1,a2=0x0fe; for (i=0;i<=3;i++) {
outportb(ic8255a,0x0ff); a1=buffer1[dis1[i]]; outportb(ic8255a,a1); outportb(ic8255b,a2); a2=a2<<1; a2=a2|0x1; delay1();
} return; }
void delay1() //延时子程序 {
int i,j,a=0; for (i=1;i<=50;i++)
{
for (j=1;j<=1000;j++) { a=a+0; } }
return; }
七、思考题
(1) 不更改硬件连接,程序只修改定时器的工作方式,但要完成同样功能,定时器还能初始化为哪几种工作方式?
(2)加长delay1()的延时时间对显示效果有什么影响? 为什么? (3)Gate0,Gate1为什么要接VCC?悬空会有什么情况发生?为什么?
42
实验八 D/A转换实验
一、 实验目的和内容
1. 掌握D/A转换器的工作原理 2. 了解DAC0832的接口与控制 3. 完成D/A转换的编程实验
二、实验电路及说明
实验电路如图9所示,电路中有一片DAC0832和一些外围电路。它通过数据线获取数据后转换为不同的电流输出经运放为电压输出。编制程序产生正弦波,利用示波器观察波形。 DAC0832赋数据地址30H 转换完成地址0b0H(W)
图9
43
图10
三、实验器材
奔腾微机一台、SXL-100(PCI)接口实验仪一套、示波器一台
四、硬件实验步骤
本实验在板上由I部分组成,有短路块与跳线两种方式。短路块为缺省方式。下面介绍跳线方式 1、J73短路块去掉
3、用示波器接到J72输出端
2、通过J77与J2的Y3相连
44
开始 初始化计数器 计数器加1 数据赋给DAC0832 启动转换 延时 计数器加1 另一数据赋给DAC0832 启动转换 五、程序框图
PC按键盘有无按键 退出DOS 六、程序代码 #include
unsigned long int iobase0,iobase1,membase0,membase1; unsigned long int ic0832r1=0x31,ic0832r2=0x30; unsigned char bh; unsigned char bl;
int findPCIcard() //找寻PCI卡的总线号及设备号及功能号 {
union REGS regs; regs.h.ah=0xb1;
regs.h.al=0x02; //寻找指定厂商和设备号的PCI卡的位置
45