采用STC89C52單片機(jī)設(shè)計(jì)的基于DAC0832的函數(shù)信號(hào)發(fā)生器,可輸出5種波形,三角函數(shù),方波,鋸齒波,三角波,梯形波。用4個(gè)按鍵分別實(shí)現(xiàn)頻率加、頻率減、波形切換和清屏功能。
附程序,仿真和AD原理圖
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載):
Proteus仿真圖
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
單片機(jī)源程序如下:
- #include<reg52.h> //包含頭文件
- #include<intrins.h>
- #include<absacc.h>
- #define uchar unsigned char //宏定義
- #define uint unsigned int
-
- sbit lcdrs=P3^0; //液晶控制位
- sbit lcden=P3^1;
- sbit csda=P3^3; //DA控制位
- sbit wr=P3^4;
- char num,boxing,u; //定義全局變量
- uint pinlv;
- uchar code table[]="0123456789"; //定義顯示的數(shù)組
- uchar code table1[]="frequence:boxing:";
- uchar code sin[64]={
- 135,145,158,167,176,188,199,209,218,226,234,240,245,249,252,254,254,253,251,247,243,237,230,222,213,204,193,182,170,158,
- 146,133,121,108,96,84,72,61,50,41,32,24,17,11,7,3,1,0,0,2,5,9,14,20,28,36,45,55,66,78,90,102,114,128
- }; //正弦波取碼
- uchar code juxing[64]={
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- }; //矩形波取碼
- uchar code juchi[64]={
- 0,4,8,12,16,20,24,28,32,36,40,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,121,125,130,134,138,142,
- 146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,215,219,223,227,231,235,239,243,247,251,255
- }; //鋸齒波取碼
- uchar code tixing[64]={
- 0,13,26,39,52,65,78,91,104,117,130,143,156,169,182,195,208,221,234,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,
- 247,247,247,247,247,247,247,242,229,216,203,190,177,164,151,138,125,112,99,86,73,60,47,34,21,8
- }; //梯形波取碼
- uchar code sanjiao[64]={
- 0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,200,208,216,224,232,240,248,
- 248,240,232,224,216,208,200,192,184,176,168,160,152,144,136,128,120,112,104,96,88,80,72,64,56,48,40,32,24,16,8,0
- }; //三角波取碼
- void delay(uint xms) //延時(shí)函數(shù)
- {
- int a,b;
- for(a=xms;a>0;a--)
- for(b=110;b>0;b--);
- }
- void write_com(uchar com) //寫命令函數(shù)
- {
- lcdrs=0;
- P0=com;
- delay(1);
- lcden=1;
- delay(1);
- lcden=0;
- }
- void write_date(uchar date) //寫數(shù)據(jù)函數(shù)
- {
- lcdrs=1;
- P0=date;
- delay(1);
- lcden=1;
- delay(1);
- lcden=0;
- }
- void init_lcd() //初始化函數(shù)
- {
- lcden=0; //默認(rèn)開始狀態(tài)為關(guān)使能端,見(jiàn)時(shí)序圖
- write_com(0x0f);
- write_com(0x38); //顯示模式設(shè)置,默認(rèn)為0x38,不用變。
- write_com(0x01); //顯示清屏,將上次的內(nèi)容清除,默認(rèn)為0x01.
- write_com(0x0c); //顯示功能設(shè)置0x0f為開顯示,顯示光標(biāo),光標(biāo)閃爍;0x0c為開顯示,不顯光標(biāo),光標(biāo)不閃
- write_com(0x06); //設(shè)置光標(biāo)狀態(tài)默認(rèn)0x06,為讀一個(gè)字符光標(biāo)加1.
- write_com(0x80); //設(shè)置初始化數(shù)據(jù)指針,是在讀指令的操作里進(jìn)行的
- }
- void initclock() //時(shí)鐘初始化
- {
- uint i;
- TMOD=0x01;
- TH0=(65536-1563)/256;
- TL0=(65536-1563)%256;
- EA=1;
- ET0=1;
- TR0=1;
- for(i=10;i<17;i++) //顯示初始化
- {
- write_date(table1[i]);
- delay(5);
- }
- write_com(0x80+0x40);
- for(i=0;i<10;i++)
- {
- write_date(table1[i]);
- delay(5);
- }
- write_com(0x80+7);
- write_date('s');
- write_date('i');
- write_date('n');
- write_date(' ');
- write_date(' ');
- write_date(' ');
- write_date(' ');
- write_com(0x80+0x40+0xa);
- write_date(' ');
- write_date('1');
- write_date('0');
- write_date('H');
- delay(5);
- write_date('Z');
- delay(5);
- }
- void display() //顯示函數(shù)
- {
- uchar bai,shi,ge;
- if(num<10)
- {
- pinlv=num*10+10;
- }
- if(num>9)
- {
- pinlv=(num-9)*50+100;
- }
- bai=pinlv/100;
- shi=pinlv%100/10;
- ge=pinlv%100%10;
- write_com(0x80+0x40+0xa);
- if(bai<1)
- {
- write_date(' ');
- delay(5);
- }
- if(bai!=0)
- {
- write_date(table[bai]);
- delay(5);
- }
-
- write_date(table[shi]);
- delay(5);
- write_date(table[ge]);
- delay(5);
- write_date('H');
- delay(5);
- write_date('Z');
- delay(5);
- if(boxing==0)
- {
- write_com(0x80+7);
- write_date('s');
- write_date('i');
- write_date('n');
- write_date(' ');
- write_date(' ');
- write_date(' ');
- write_date(' ');
- }
- if(boxing==1)
- {
- write_com(0x80+7);
- write_date('j');
- write_date('u');
- write_date('x');
- write_date('i');
- write_date('n');
- write_date('g');
- }
- if(boxing==2)
- {
- write_com(0x80+7);
- write_date('j');
- write_date('u');
- write_date('c');
- write_date('h');
- write_date('i');
- write_date(' ');
-
- }
- if(boxing==3)
- {
- write_com(0x80+7);
- write_date('t');
- write_date('i');
- write_date('x');
- write_date('i');
- write_date('n');
- write_date('g');
- }
- if(boxing==4)
- {
- write_com(0x80+7);
- write_date('s');
- write_date('a');
- write_date('n');
- write_date('j');
- write_date('i');
- write_date('a');
- write_date('o');
- }
- }
- //kbscan(void)按鍵掃描程序
- uchar keyscan() //鍵盤掃描
- {
- uchar h,l,value;
- P1=0xf0; //列置0
- h=P1&0Xf0; //判斷哪一行按下
- if(h!=0xf0) //判斷是否按下
- {
- delay(10); //消抖
- if(h!=0xf0)
- {
-
- l=P1|0x0f; //把列置1
- P1=l; //把列狀態(tài)給P1口
- l=P1&0x0f; //判斷那一列按下
- h=P1&0Xf0; //判斷哪一行按下
- value=h+l; //組合起來(lái)到底是那個(gè)按鍵按下
- }
- return value;
- }
- }
- void keypros() //按鍵處理
- {
- uchar key=0;
- key=keyscan();
- if(key==0xee)
- {
- EA=0;
- delay(200);
- num++;
- if(num==12)
- {
- num=0;
- }
- display();
- EA=1;
- if(num>9)
- {
- EA=0;
- }
- }
- else if(key==0xde)
- {
- EA=0;
- delay(200);
- num--;
- if(num<0)
- {
- num=0;
- }
- display();
- EA=1;
- if(num>9)
- {
- EA=0;
- }
- }
- else if(key==0xbe)
- {
- EA=0;
- delay(200);
- boxing++;
- if(boxing==5)
- {
- boxing=0;
- }
- display();
- EA=1;
- }
- else if(key==0x7e)
- {
- EA=0;
- write_com(0x01);
-
- }
- }
- void delaym() //短暫延時(shí)
- {
- _nop_();_nop_(); _nop_(); _nop_();_nop_();_nop_();
- }
- void main() //主函數(shù)
- {
- init_lcd();
-
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
函數(shù)信號(hào)發(fā)生器.zip
(1.41 MB, 下載次數(shù): 534)
2017-7-22 00:23 上傳
點(diǎn)擊文件名下載附件
|