目錄
一、實(shí)驗(yàn)題目
二、實(shí)驗(yàn)要求
三、實(shí)驗(yàn)過程及結(jié)果分析
四、實(shí)驗(yàn)流程圖
五、實(shí)驗(yàn)源代碼
一、實(shí)驗(yàn)題目
3.8 ADC0808信號采集實(shí)驗(yàn)
二、實(shí)驗(yàn)要求
1、畫出實(shí)驗(yàn)的流程圖
2、編寫源程序并進(jìn)行注釋
3、記錄實(shí)驗(yàn)過程
4、記錄程序運(yùn)行結(jié)果截圖
三、實(shí)驗(yàn)過程及結(jié)果分析
利用LCD1602和AD0808實(shí)現(xiàn)簡單的交流信號過零檢測與頻率分析。要求信號幅度變化時(滿量程的5%—95%),不影響檢測到結(jié)果。頻率檢測的結(jié)果通過LCD1602的第一行顯示出來,信號過零時,能夠通過P2.6輸出一個脈沖寬度為5μs的脈沖信號。
1. 根據(jù)上述實(shí)驗(yàn)內(nèi)容,在Proteus 環(huán)境下建立圖1所示原理圖,并將其保存為ADC0808_self.DSN 文件。
圖1:實(shí)驗(yàn)電路圖?
2. 編寫源程序,將其保存為ADC0808_self.c,運(yùn)行Keil開發(fā)環(huán)境,建立工程ADC0808_self.uV2,CPU 為AT89C51,包含啟動文件STARTUP.A51。
3. 將C 語言源程序ADC0808_self.c 加入工程ADC0808_self.uV2,并設(shè)置工程ADC0808_self.uV2 屬性,將其晶振頻率設(shè)置為12MHz,選擇輸出可執(zhí)行文件,仿真方式為選擇硬仿真,并選擇其中的“PROTEUS VSM MONITOR 51 DRIVER”仿真器。
4.構(gòu)造(Build)工程ADC0808_self.uV2。如果輸入有誤進(jìn)行修改,直至構(gòu)造正確,生成可執(zhí)行程序ADC0808_self.hex 為止。為AT89C51 設(shè)置可執(zhí)行程序ADC0808_self.hex。
5. 運(yùn)行程序,觀察計算結(jié)果,并驗(yàn)證其是否正確。改變RV1 的抽頭位置,從而改變輸入信號的幅值,觀察計算結(jié)果是否正確。更改信號發(fā)射器的頻率,再次驗(yàn)證其功能是否正確。(注意:因?yàn)槭擒浄抡?,所以信號采集的速度受到限制,因此所輸入的交流信號頻率也不能太高,可以在200Hz以內(nèi)嘗試)。
實(shí)驗(yàn)結(jié)果如下:
1)將電位器至于滿量程的90%,此時信號的幅值就是最大值的90%
圖2:電位器調(diào)整到滿量程的90%
2)將電位器至于滿量程的50%,此時信號的幅值為最大值的一半
圖3:電位器調(diào)整到滿量程的50%
3)電位器調(diào)整到滿量程的10%,此時信號的幅值為最大值的10%
圖4:電位器調(diào)整到滿量程的10%
四、實(shí)驗(yàn)流程圖
圖5:實(shí)驗(yàn)流程圖
????????LCD1602的控制方法按3.7節(jié)所示方法進(jìn)行ADC0808的控制方法按3.8.1所示方法進(jìn)行。這里主要是過零點(diǎn)的檢測方法如何實(shí)現(xiàn)。不能采用判斷所采集到的數(shù)據(jù)是否為 0 的方法來實(shí)現(xiàn),因?yàn)槟愕牟杉瘯r刻不一定能夠嚴(yán)格對準(zhǔn)過零時刻。但是,我們注意到在 0 點(diǎn)的兩邊信號的極性是發(fā)生變化的,我們可以利用這一特點(diǎn)來實(shí)現(xiàn)過零檢測。正弦波每個周期有兩個過零點(diǎn),因此,1s 內(nèi)過零次數(shù)除以 2 就是信號的頻率。
????????因此,在程序中可以這樣實(shí)現(xiàn)。當(dāng)每次采集到一個新的數(shù)據(jù)之后都要看一下這個數(shù)據(jù)是正數(shù)還是負(fù)數(shù)。當(dāng)這個數(shù)大于 128 時是正數(shù),當(dāng)它小于 128 時是負(fù)數(shù)。判斷當(dāng)前數(shù)據(jù)的正負(fù)極性和上一個數(shù)據(jù)的正負(fù)極性是否一致,如果不一致,則說明經(jīng)過了一次過零點(diǎn),將其記錄入次數(shù)計數(shù)器。
????????ADC0808 的 CLK 仍然用定時器 T1 來實(shí)現(xiàn),可以將其設(shè)置為 50kHz(硬件實(shí)現(xiàn)時可以更高,軟件仿真再高將難以實(shí)現(xiàn))。利用定時器 T0 實(shí)現(xiàn) 50ms 定時,并配合軟件實(shí)現(xiàn) 1s 鐘定時。采用 12M 晶振時,T0 采用方式 1,則處置應(yīng)為(TH0=0x3C,TL0=0xB0)。
????????但是,由于中斷處理函數(shù)需要一定的響應(yīng)時間,因此這個參數(shù)只是理論計算結(jié)果,要根據(jù)實(shí)測情況稍作調(diào)整。 同樣 T1 理論計算值和實(shí)際輸出值可能也會有一定的差距,也要進(jìn)行調(diào)整。
五、實(shí)驗(yàn)源代碼
#include "reg51.h" // 單片機(jī)寄存器頭文件
#include "intrins.h" // _ nop_()等函數(shù)定義的頭文件
sbit LCD_RS=P2^0; //寄存器選擇位,將RS位定義為P2.0引腳
sbit LCD_RW=P2^1; // 讀寫選擇位,將RW位定義為P2.1引腳
sbit E=P2^2; //使能信號位,將E位定義為P2.2引腳
sbit BF=P1^7; // P0.7為忙碌標(biāo)志位
sbit CLK=P2^3; // 設(shè)置時鐘端口
sbit start=P2^4;
sbit oe=P2^5;
sbit eoc=P2^7;
sbit out_pulse=P2^6; // P2^6端口輸出5us脈沖
sbit p30=P3^0;
#define uchar unsigned char
#define uint unsigned int
uchar n=0;
uchar flag=0;
void delay1ms()// 定義延時1ms函數(shù)
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++);
}
void delay(unsigned int n) //定義延時nms函數(shù)
{
unsigned int i;
for(i=0;i<n;i++)
delay1ms();
}
bit BusyTest(void) //檢查子程序,為1時繁忙,為0時不忙
{
bit result;
LCD_RS=0;
LCD_RW=1;
E=1;
_nop_();
_nop_();
_nop_();
_nop_();
result=BF;
E=0;
return result;
}
void Write_com (uchar cmd) //寫命令子程序
{
while(BusyTest()==1);
LCD_RS=0;
LCD_RW=0; // RS/RW都是0的時,寫指令
E=0;
_nop_();
_nop_();
P1=cmd; // 寫指令操作
_nop_();//運(yùn)行一個機(jī)器周期
_nop_();
_nop_();
_nop_();
E=1;
_nop_();
_nop_();
_nop_();
_nop_();
E=0; // E由高跳低寫入
}
void WriteAddress(unsigned char x)
{
Write_com(x|0x80); //顯示位置為"80H+地址碼x"
}
void WriteData(unsigned char y) //寫數(shù)據(jù)子程序
{
while(BusyTest()==1);
LCD_RS=1;
LCD_RW=0;
E=0;
P1=y; // 執(zhí)行操作
_nop_(); //運(yùn)行一個機(jī)器周期
_nop_();
_nop_();
nop_();
E=1;
_nop_();
_nop_();
_nop_();
_nop_();
E=0;
}
void LcdInt(void) //初始化LCD
{
delay(15); // 延時15ms,讓電源穩(wěn)定
Write_com(0x38); //設(shè)置顯示,即16×2顯示,5×7點(diǎn)陣,8位數(shù)據(jù)接口
delay(5); //延時5ms
Write_com(0x0c); //設(shè)置顯示:顯示開,有光標(biāo),光標(biāo)閃爍
delay(5);
Write_com(0x06); D=1,S=0地址自加1
delay(5);
Write_com(0x01); // 清屏幕操作
delay(5);
}
void sysinit() //系統(tǒng)初始化
{
TMOD = 0x21; // 設(shè)定定時器T1工作方式為自動重裝8位計數(shù)器,T0工作方式為方式1(16位計數(shù)器)
TH1=0xfd; //利用中斷產(chǎn)生CLK信號
TL1=0xfd;
EA=1; //開總中斷
ET1=1; //T1中斷允許
TR1=1; //啟動定時器T1
TH0=0x45; // 置初值
TL0=0x00; //50MS定時
ET0=1; //T0中斷允許
TR0=1; //啟動定時器T0
start=0; //A/D轉(zhuǎn)換啟動信號起始為0
oe=0; //數(shù)據(jù)輸出允許信號起始為0
}
void t0(void) interrupt 1 //T0中斷服務(wù)程序
{
ET0=0; // 關(guān)中斷
TH0=0X45;
TL0=0X00;
n++;
if(n==20) {flag=1;n=0;} //循環(huán)20次,即完成1S定時
ET0=1; //開T0中斷允許
}
void t1(void) interrupt 3 // 定時器T1中斷服務(wù)程序
{
ET1=0; // 關(guān)閉中斷
CLK=~CLK; // 每中斷一次,取上一次clk信號的反,如此便產(chǎn)生了50KHz的周期性方波信號
ET1=1; //開啟中斷
}
unsigned char adc()//數(shù)據(jù)采集子程序
{
unsigned char Temp;
start=1;
start=0; //啟動信號
while (!eoc); // A/D轉(zhuǎn)換結(jié)束信號,0代表轉(zhuǎn)換完成,可以輸出
P0=0xff; // 讀之前先寫入1
oe=1;
Temp=P0; //讀取采集數(shù)據(jù)
oe=0;
return(Temp);
}
void display(uint a)//顯示子函數(shù)
{
uint bai,shi,ge;
bai=a/100;
shi=(a-bai*100)/10;
ge=a%10;
WriteAddress(2);
WriteData(0x30+bai); //顯示百位
WriteData(0x30+shi); //顯示十位
WriteData(0x30+ge); //顯示個位
}
void main() // 定義主程序
{
uint temp1,temp2;
uchar f=0;
LcdInt();
delay(5);
sysinit();
CLK=0;
WriteAddress(0); //從第0行開始顯示
WriteData('f'); //顯示 f ; 等
WriteData(':');
WriteAddress(5); //從第5行開始顯示
WriteData('H'); //顯示H
WriteData('z'); //顯示z
while(1) //一直循環(huán)
{
temp2=temp1;
temp1=adc();//ad采集
if(((temp1>=128)&&(temp2<=128))||((temp1<=128)&&(temp2>=128))) //過零時兩次采集極性相反
{
f++;
out_pulse=1; //過零時輸出脈沖信號
_nop_(); //運(yùn)行一個機(jī)器周期
_nop_();
_nop_();
_nop_();
_nop_();
out_pulse=0; //產(chǎn)生5us的脈沖信號
}
if(flag==1) //1s后計算頻率
{
flag=0; // 標(biāo)志位清0
f=f/2; // 一個周期兩次過零點(diǎn)
display(f); //顯示頻率
f=0;
}
}
}
受于文本原因,本文相關(guān)實(shí)驗(yàn)工程無法展示出來,現(xiàn)已將資源上傳,可自行下載。文章來源:http://www.zghlxwxcb.cn/news/detail-466981.html
山東大學(xué)單片機(jī)原理與應(yīng)用實(shí)驗(yàn)工程文件3.8ADC0808/9信號采集實(shí)驗(yàn)-單片機(jī)文檔類資源-CSDN下載山東大學(xué)單片機(jī)原理與應(yīng)用實(shí)驗(yàn)工程文件3.8ADC0808/9信號采集實(shí)驗(yàn)詳解博客地址:http更多下載資源、學(xué)習(xí)資料請訪問CSDN下載頻道.https://download.csdn.net/download/m0_52316372/85926174文章來源地址http://www.zghlxwxcb.cn/news/detail-466981.html
到了這里,關(guān)于山東大學(xué)單片機(jī)原理與應(yīng)用實(shí)驗(yàn) 3.8 ADC0808/9信號采集實(shí)驗(yàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!