采用STC89C52單片機設計的基于DAC0832的函數信號發生器,可輸出5種波形,三角函數,方波,鋸齒波,三角波,梯形波。用4個按鍵分別實現頻率加、頻率減、波形切換和清屏功能。
附程序,仿真和AD原理圖
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載):
QQ圖片20170722002100.png (225.03 KB, 下載次數: 191)
下載附件
Proteus仿真圖
2017-7-22 00:21 上傳
0.png (39.31 KB, 下載次數: 164)
下載附件
2017-7-22 17:46 上傳
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
0.png (43 KB, 下載次數: 158)
下載附件
2017-7-22 17:46 上傳
0.png (42.64 KB, 下載次數: 147)
下載附件
2017-7-22 17:46 上傳
單片機源程序如下:
- #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"; //定義顯示的數組
- 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) //延時函數
- {
- int a,b;
- for(a=xms;a>0;a--)
- for(b=110;b>0;b--);
- }
- void write_com(uchar com) //寫命令函數
- {
- lcdrs=0;
- P0=com;
- delay(1);
- lcden=1;
- delay(1);
- lcden=0;
- }
- void write_date(uchar date) //寫數據函數
- {
- lcdrs=1;
- P0=date;
- delay(1);
- lcden=1;
- delay(1);
- lcden=0;
- }
- void init_lcd() //初始化函數
- {
- lcden=0; //默認開始狀態為關使能端,見時序圖
- write_com(0x0f);
- write_com(0x38); //顯示模式設置,默認為0x38,不用變。
- write_com(0x01); //顯示清屏,將上次的內容清除,默認為0x01.
- write_com(0x0c); //顯示功能設置0x0f為開顯示,顯示光標,光標閃爍;0x0c為開顯示,不顯光標,光標不閃
- write_com(0x06); //設置光標狀態默認0x06,為讀一個字符光標加1.
- write_com(0x80); //設置初始化數據指針,是在讀指令的操作里進行的
- }
- void initclock() //時鐘初始化
- {
- 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() //顯示函數
- {
- 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; //把列狀態給P1口
- l=P1&0x0f; //判斷那一列按下
- h=P1&0Xf0; //判斷哪一行按下
- value=h+l; //組合起來到底是那個按鍵按下
- }
- 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() //短暫延時
- {
- _nop_();_nop_(); _nop_(); _nop_();_nop_();_nop_();
- }
- void main() //主函數
- {
- init_lcd();
-
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
函數信號發生器.zip
(1.41 MB, 下載次數: 534)
2017-7-22 00:23 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|