找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5414|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

AT89C51+DA實(shí)現(xiàn)的波形發(fā)生器

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:128229 發(fā)表于 2016-6-29 20:50 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式



本程序?qū)崿F(xiàn)的是通過4*4鍵盤的三個(gè)鍵值(0x7d,0xbd,0xdd;分別對應(yīng)鍵盤的數(shù)字1,2,3)來選擇輸出波形(正弦,鋸齒,方波)。幾百年沒寫c程序了,出的波形都不是特別好看,如果各位看官覺得那里有錯(cuò)的請指點(diǎn),謝謝!

[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()    //延時(shí)
{
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();                  //延時(shí)5-10ms,去抖動(dòng)
            }
         }
}

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 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表