|
前段時(shí)間開始接觸到單片機(jī),以為單片機(jī)會(huì)很簡(jiǎn)單,但比我預(yù)想的要復(fù)雜一些,特別是剛開始接觸的時(shí)候,需要下載各種軟件,然后自己慢慢地去熟悉這些軟件的操作。我是從51單片機(jī)開始入手,畢竟51單片機(jī)是最基本的了。正好這學(xué)期學(xué)習(xí)了波形的產(chǎn)生,就做一個(gè)基本的函數(shù)信號(hào)發(fā)生器吧。
這次實(shí)現(xiàn)的函數(shù)發(fā)生器是基于51單片機(jī)的占空比、頻率可調(diào)的方波發(fā)生器,適用于AT89C51/52、STV89C51/52等,現(xiàn)在把具體過程給大家說說。
第1步:安裝一個(gè)單片機(jī)仿真圖軟件,推薦使用Protues,這是一款專門用來仿真單片機(jī)的,功能十分強(qiáng)大。我用的是Protues8.6,下載安裝步驟大家就自行查詢了,學(xué)習(xí)起來比較簡(jiǎn)單,半小時(shí)就能掌握了。下面是我的仿真圖形。
51hei截圖20190731154830.png (44.06 KB, 下載次數(shù): 126)
下載附件
2019-8-5 20:43 上傳
第2步:?jiǎn)纹瑱C(jī)仿真圖形界限完成之后,就是寫程序了,程序?qū)懞弥,需要下載Keil軟件將程序轉(zhuǎn)換為單片機(jī)能識(shí)別的機(jī)器語言,即hex文件,程序可以使是c語言,也可以是匯編語言。在Keil上運(yùn)行程序沒有錯(cuò)誤后就會(huì)自動(dòng)生成hex文件,Keil的使用大家自行查詢。下面那個(gè)“單片機(jī)1111.hex”就是我們寫好的程序轉(zhuǎn)換為hex文件了,其他的是附加產(chǎn)物。
51hei截圖20190805205833.png (34.72 KB, 下載次數(shù): 104)
下載附件
2019-8-5 20:59 上傳
第3步:回到Protues仿真,雙擊單片機(jī),就會(huì)彈出一個(gè)窗口,在Program File欄加入我們剛才產(chǎn)生的hex文件就可以了,然后點(diǎn)擊運(yùn)行就可以運(yùn)行了。很多人仿真的時(shí)候可能沒有示波器窗口,點(diǎn)擊運(yùn)行后,然后點(diǎn)擊上方“調(diào)試”,再點(diǎn)擊彈出窗口的最后一行,示波器窗口就彈出來了,就可以看到單片機(jī)產(chǎn)生的波形了。
51hei截圖20190805210248.png (26.89 KB, 下載次數(shù): 108)
下載附件
2019-8-5 21:07 上傳
下面是仿真波形圖
51hei截圖20190731094828.png (4.91 KB, 下載次數(shù): 102)
下載附件
2019-8-5 21:08 上傳
51hei截圖20190731094851.png (4.65 KB, 下載次數(shù): 84)
下載附件
2019-8-5 21:08 上傳
(兩張圖的頻率不一樣,即頻率可調(diào))
51hei截圖20190731094914.png (4.75 KB, 下載次數(shù): 99)
下載附件
2019-8-5 21:09 上傳
51hei截圖20190731094935.png (4.76 KB, 下載次數(shù): 104)
下載附件
2019-8-5 21:10 上傳
(這兩張圖的占空比不一樣,即占空比可調(diào))
現(xiàn)在說說具體功能,一共有4個(gè)按鍵,初始頻率為500Hz,第1個(gè)按鍵按下后頻率增加500Hz,第2個(gè)按鍵按下后頻率增加100Hz,當(dāng)頻率增加到最大值1MHz后重新定義為500Hz,即頻率500~1MHz可變;初始占空比為50%,第3個(gè)按鍵按下后占空比增加10%,第4個(gè)按鍵按下后占空比增加1%,當(dāng)占空增加到100%后就定義為0%,即占空比0%~100%可調(diào)。大家還可以稍微修改程序,實(shí)現(xiàn)頻率和占空比在不同范圍內(nèi)可調(diào)。
源代碼:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
float fosc=12000000;
sbit KEY1=P1^0;
sbit KEY2=P1^1;
sbit KEY3=P1^2;
sbit KEY4=P1^3;
sbit OUTPUT=P2^0;
uchar zkb;
uint freq;
uchar TIMER0_L,TIMER0_H,TIMER1_L,TIMER1_H;
void delay(uchar n)
{
uchar i;
while(n--)
{for(i=255;i>0;i--)
{}
}}
void chushihua(void)
{
P1=0x0f;
freq=500;
zkb=50;
TIMER0_L=0xe0;
TIMER0_H=0xb1;
TIMER1_L=0xf0;
TIMER1_H=0xd8;
TL0=0xe0;
TH0=0xb1;
TL1=0xf0;
TH1=0xd8;
TMOD=0x11;
IT0=1;
EX0=1;
ET0=1;
ET1=1;
EA=1;
TR0=1;
TR1=1;
}
void main(void)
{
chushihua();
while(1)
{ }
}
void Timer0_freq() interrupt 1
{
TR1=1;
TL0=TIMER0_L;
TH0=TIMER0_H;
OUTPUT=1;
}
void Timer1_zkb() interrupt 3
{
TR1=0;
TL1=TIMER1_L;
TH1=TIMER1_H;
OUTPUT=0;
}
void keyscan() interrupt 0 using 1
{
float TF0,TZ1;
EX0=0;
delay(10);
if(P1!=0x0f)
{
if(KEY1==0) freq+=500;
if(KEY2==0) freq+=50;
if(freq>10000) freq=500;
if(KEY3==0) zkb+=10;
if(KEY4==0) zkb++;
if(zkb>100) zkb=1;
TF0=(65536-fosc/(12.0*freq));
TZ1=(65536-(fosc*zkb)/(12.0*100*freq));
TIMER0_H=(uint)TF0/256;
TIMER0_L=(uint)TF0%256;
TIMER1_H=(uint)TZ1/256;
TIMER1_L=(uint)TZ1%256;
}
P1=0x0f;
EX0=1;
TR0=1;
TR1=1;
}
|
評(píng)分
-
查看全部評(píng)分
|