关闭

最后一次接口实验报告--编程实现dac0832...

标签: 编程math.hsystemcup
3036人阅读 评论(1) 收藏 举报
分类:

  最后一次接口实验是编程控制dac0832,使其输出正弦波,矩形波和三角波,并且程序控制输出波形的频率和幅度及采样点(不要和adc中的采样点混淆了,此处的采样点是在一个周期内输出点的个数,类似于画图中的描点法,描的点越多,图象越光滑)。

  既是最后一次实验,我也要做好这次实验。比如说在控制波形的参数方面象示波器显示波形!

        实验的电路图(略)。

  程序运行的界面如下:

  数字键0,1,2选择输出波形,

   0--正弦波

   1--矩形波(占空比可调)

   2--三角波

 上/下方向键调节输出波形的幅度,初始化为最大.左/右方向键调节波形的频率(对于矩形波调节的是占空比),初始化为最小.w/s调节采样点的个数,w 增加采样点的个数,s减少采样点的个数.

   程序的源代码如下:(如有漏洞,请将漏洞发送到yzx_xue@163.com

#define DATAPORT 0x280       /*0832的地址*/
#include <math.h>
#include <stdio.h>
#include <dos.h>
#define PI 3.1415926
#define VK_ENTER 13
#define VK_UP  72
#define VK_DOWN  80
#define VK_RIGHT 77
#define VK_LEFT  75
#define VK_W            119
#define VK_S            115
#define VK_SINA  48
#define VK_TTL  49
#define VK_TRI          50
#define VK_ESC  27
#define MAX_AMP  127  //最大幅度
#define MIN_AMP  27  //最小幅度
#define MAX_CNT  256  //最大采样点
#define MIN_CNT  8  //最小采样点
#define MAX_FRQ  8  //最大频率
#define MIN_FRQ  1    //最小频率

int Cnt=64,amp=64,frq=1; /*输出波形的幅度和频率*/
void func_sin(void);
void func_ttl(void);
void func_tri(void);
void sysinit(void)
 {
  Cnt=MAX_CNT;
  amp=MAX_AMP;
  frq=MIN_FRQ;
 }
int main()
 {
 int key=0;
 int flag=0;
 clrscr();
 sysinit();
 printf("***********Yzx 0832 Ctrl system V1.0**************/n");
 printf("/n");
 printf("* Press the Up/Down key to modifier Amptitude */n");
 printf("* Press the Right/Left key to modifier Frequency*/n");
 printf("* Press W/S key to modifier Count/n");
 printf("*  0.-----sin(x)      /n");
 printf("*  1.-----TTL      /n");
 printf("*  2.-----TRI     /n");
 printf("* Press Enter to initial system  /n");
 printf("* Press Esc to exit system   /n");
 printf("**************************************************/n");
 while(key!=VK_ESC)
  {
  while(!bioskey(1))
  switch(flag)
   {
   case 0: func_sin();break;
   case 1: func_ttl();break;
   case 2: func_tri();break;
   }/*end switch flag*/
  key=bioskey(0);
  key=key&0xff?key&0xff:key>>8;
  switch(key)
   {
   case VK_UP:  amp=(amp==MAX_AMP)?MAX_AMP:amp+10;break;
   case VK_DOWN:  amp=(amp==MIN_AMP)?MIN_AMP:amp-10;break;
   case VK_W:  Cnt=(Cnt==MAX_CNT)?MAX_CNT:(Cnt+8);break;
   case VK_S:  Cnt=(Cnt==MIN_CNT)?MIN_CNT:(Cnt-8);break;
   case VK_RIGHT:  frq=(frq==MAX_FRQ)?MAX_FRQ:(frq+1);break;
   case VK_LEFT: frq=(frq==MIN_FRQ)?MIN_FRQ:(frq-1);break;
   case VK_SINA: flag=0;break;
   case VK_TTL: flag=1;break;
   case VK_TRI: flag=2;break;
   case VK_ENTER: sysinit();break;
   default: ; break;
  }/*end switch key*/
  }/*quit system*/
 return 1;
 }
void func_sin()
 {
 int j=0,deltime=200;
 double z=2*PI/Cnt,y,x=0;
 do{
  y=amp*(1+sin(frq*x));
  outportb(DATAPORT,(unsigned char)y);
  while(--deltime) ;
  x+=z;
  }while(++j<=Cnt/frq);
 }
void func_ttl()
 {
 int i,deltime=200;
 double value=0;
 /*
 int c=Cnt/frq;
 c=(c%2)?c+1:c;   */
 for(i=0;i<=Cnt;i++)
  {
  outportb(DATAPORT,value);
  for(deltime=20;deltime>0;deltime--) ;
  value=(i>Cnt*frq/10)*amp;
  }
 }
void func_tri()
 {
 int i,deltime=20;
 double value=0;
 double c=(int)amp*2.0/Cnt;
 for(i=0;i<=Cnt/2;i++)
 {
 outportb(DATAPORT,value);
 for(deltime=0;deltime<20*frq;deltime++) ;
 value=c*i;
 }
 for(i=Cnt/2;i>0;i--)
  {
  outportb(DATAPORT,value);
  for(deltime=0;deltime<20*frq;deltime++) ;
  value=c*i;
  }
 }

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:132220次
    • 积分:1712
    • 等级:
    • 排名:千里之外
    • 原创:31篇
    • 转载:30篇
    • 译文:0篇
    • 评论:14条
    最新评论