找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5389|回复: 0
打印 上一主题 下一主题
收起左侧

AT89C51+DA实现的波形发生器

[复制链接]
跳转到指定楼层
楼主
ID:128229 发表于 2016-6-29 20:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式



本程序实现的是通过4*4键盘的三个键值(0x7d,0xbd,0xdd;分别对应键盘的数字1,2,3)来选择输出波形(正弦,锯齿,方波)。几百年没写c程序了,出的波形都不是特别好看,如果各位看官觉得那里有错的请指点,谢谢!

[color=#00CC33,strength=3);text-shadow:1px]电路连接:P0口接DA,P1控制键盘,中断用外部中断1(INT1),J14为输出端用示波器观察波形。
程序:

# include < absacc.h >
# include < reg51.h >
#include<math.h>
# define DAC0832  XBYTE [0xc000 ]
# define uchar unsigned char
# define uint unsigned int
void sinusoidal();
void triangle();
void square();
void dlms() ;
unsigned char read_key(unsigned char);

code unsigned char Sin[128]={64,67,70,73,76,79,82,85,88,91,94,96,99,102,104,106,
                                          109,111,113,115,117,118,120,121,123,124,125,126,126,
                                          127,127,127,127,127,127,127,126,126,125,124,123,121,
                                          120,118,117,115,113,111,109,106,104,102,99,96,94,91,
                                          88,85,82,79,76,73,70,67,64,60,57,54,51,48,45,42,39,
                                          36,33,31,28,25,23,21,18,16,14,12,10,9,7,6,4,3,2,1,
                                          1,0,0,0,0,0,0,0,1,1,2,3,4,6,7,9,10,12,14,16,18,21,23,
                                          25,28,31,33,36,39,42,45,48,51,54,57,60};

code unsigned char scan[4]={0xef,0xdf,0xbf,0x7f};

unsigned char  key, old_key ;   //键码,扫描码
uchar counter;

void dlms()    //延时
{
uchar k;
for(k=200;k>0;k--){}
}

void main(){
  IT1=0;      
  EX1=1;      
  PX1=1;      
  EA=1;
  P1=0x0f;

    while(1){

        switch(key)
           {
              case 0x1:   sinusoidal();  //zhenxian
                        break;
              case 0x2:  triangle();     //jvchi
                        break;
              case 0x3: square();   //fanbo
                        break;
              default:break;
          }

    }
}

void get_keypad_code() interrupt 2
{
unsigned char i;
uchar scan;
  for (i=1;i<=4;i++)
     {   
        P1=scan;
        old_key=P1|0xf0;
     if(old_key!=0xff)           //有键?

{
              key=read_key(scan);     //读键码
            dlms();                  //延时5-10ms,去抖动
            }
         }
}

uchar read_key(uchar scan)
{
P1=scan;       //扫描
switch(P1)     //返回扫描码->键码
    {
     case 0x77:return(0x7);
     case 0xb7:return(0x8);
     case 0xd7:return(0x9);
     case 0xe7:return(0xd);
     case 0x7b:return(0x4);
     case 0xbb:return(0x5);
     case 0xdb:return(0x6);
     case 0xeb:return(0xc);
     case 0x7d:return(0x1);
     case 0xbd:return(0x2);
     case 0xdd:return(0x3);
     case 0xed:return(0xb);
     case 0x7e:return(0xf);
     case 0xbe:return(0x0);
     case 0xde:return(0xe);
     case 0xee:return(0xa);
     default:  return(0xff);

     }
}

void sinusoidal()
{         
                    for(counter=0;counter<128;counter++){
                    DAC0832=Sin[counter];
            }
}

void triangle ()
{  
   for(counter=0;counter<128;counter++ ){      
        DAC0832=counter;
           dlms();            
   }
}

void square()
{   
       for(counter=1;counter<128;counter++)
       {
       if(counter<=64) DAC0832=0x00;
       else DAC0832=0xf0;
       }        
}





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表