51單片機驅動模數轉換芯片DAC0832產生鋸齒波 三角波的proteus仿真原理圖:
單片機源程序:
- /********************************************************************
- 51黑電子論壇
- *********************************************************************/
- #include<reg52.h> //庫文件
- #define uchar unsigned char//宏定義無符號字符型
- #define uint unsigned int //宏定義無符號整型
- /********************************************************************
- 初始定義
- *********************************************************************/
- sbit P3_2=P3^2;
- sbit P3_3=P3^3;
- unsigned char keycnt=0;
- unsigned char tcnt=0; //鍵值判斷
- bit sjz=0; //產生三角波時用到的標志
- void delayl() //延時子程序
- {
- unsigned char i,j;
- for(i=20;i>0;i--)
- for(j=248;j>0;j--);
- }
- void KEY() //按鍵掃描程序
- {
- if(P3_2==0)
- {
- delayl(); //延時跳過按下時的抖動
- if(P3_2==0)
- {
- keycnt=0; //定時器產生鋸齒波標志
- TR0=0; //暫時停止波形輸出
- TH0=0x256-40; //對TH0 TL0 賦值
- TL0=0x256-40;
- TR0=1; //開始定時,產生鋸齒波
- while(P3_2==0); //如果一直按著鍵,則等待松鍵開
- delayl(); //延時跳過松開后的抖動
- }
- }
- if(P3_3==0)
- {
- delayl(); //延時跳過按下時的抖動
- if(P3_3==0)
- {
- keycnt=1; //定時器產生三角波標志
- TR0=0; //暫時停止波形輸出
- TH0=0x256-40; //對TH0 TL0 賦值
- TL0=0x256-40;
- TR0=1; //開始定時 產生三角波
- }
- while(P3_2==0); //如果一直按著鍵,則等待松鍵開
- delayl(); //延時跳過松開后的抖動
- }
- }
- void t0(void) interrupt 1 using 0 //定時中斷服務函數
- {
- if(keycnt==0) //產生鋸齒波
- {
- P0=tcnt;
- tcnt=+0x0a; //步進0.2V/一次中斷
- if(tcnt==0xfb)
- tcnt=0;
- }
- if(keycnt==1) //產生三角波
- {
- if(sjz==0)
- {
- P0=tcnt;
- tcnt=+0x0a;//步進0.2V/一次中斷
- if(tcnt==0xfa)
- sjz=1;
- }
- if(sjz==1)
- {
- P0=tcnt;
- tcnt=-0x0a;
- if(tcnt==0)
- sjz=0;
- }
- }
- }
- void main(void)
- {
- TMOD=0x02; //定時器工作在方式2
- ET0=1;
- EA=1;
- while(1)
- KEY();
- }
復制代碼
仿真工程文件及所有完整程序等資料下載地址(壓縮包一共有45個單片機仿真,全部下載后找到第013個項目即可):
http://www.zg4o1577.cn/bbs/dpj-56298-1.html
|