實訓任務書 2
摘 要 4
Abstract 4
波形發生器的設計 5
1.1 實訓目的 5
1.2 實訓內容 5
1.3 實訓步驟 5
1.4 Keil uVision簡介 6
1.5 實驗原理 7
1.5.1 數碼管顯示原理 7
1.5.2 各種波形產生思路 8
1.6 DAC0832介紹 10
1.6.1 DAC0832的主要特性參數 11
1.6.2 DAC0832結構 11
1.6.3 DAC0832工作方式 12
1.7 程序 13
1.7.1 主程序 13
1.7.2 VIIC_C51.C 22
1.7.3 ZLG7290 33
實訓心得 38
參考文獻 39
實訓任務書
課程名稱 微計算機應用及計控技術實訓
實訓地點 秋實樓 時間 2015年1月
項目 波形發生器的設計
指導教師 賈玉瑛、李愛蓮、梁麗、陳波、李琦
一、實訓目的
1、掌握使用D/A轉換器生成用戶所需要的波形;
2、掌握數/模轉換的基本原理及編程方法;
3、掌握D/A轉換芯片DAC0832的結構特點、工作原理及使用方法;
二、基本要求
(1)預習要求:學生要根據實訓題目要求查閱參考資料,提前進行認真的預習,初步弄懂實訓內容、原理,并寫出預習報告;預習報告應包括基本的實訓內容和實訓方案,基本實訓步驟、過程以及數據記錄,對于有設計內容的項目要提前做好設計方案。
(2)操作要求:學生要搞清本次實訓需使用的儀器,每種儀器在實訓中所起的作用,合理選擇使用儀器,正確使用測量方法。根據已設計的實訓步驟并經老師同意后開始實訓。學生要認真觀察分析實訓現象, 記錄實訓數據。運用所學知識解決實訓中發生的問題;每項實訓結果,需經教師認可后,方可結束實訓;實訓后認真填寫實訓記錄。
(3)實訓報告要求:學生在做完實訓后,科學地、真實地、完整地完成實訓報告。實 訓報告應包括實訓原理、實訓方法的概述;實訓步驟的描述;實訓現象和實訓數據的記載;
三、實訓內容
1、設計軟件程序,通過DAC0832實現D/A轉換,使其分別產生三角波、個鋸齒波、方波;
2、設計一個單片機系統,能夠在不同開關控制下輸出不同的波形形式。
3、利用2*4鍵盤輸入加四位LED顯示器顯示,改變波形的周期。
四、參考資料
1、DAC08320的數據手冊。
2、參考《單片機實驗與實驗教程》實驗37內容。
五、實訓步驟
1、參考實驗37進行接線
2、開關線接到單片機的P1口,自己設計接線。
3、運行程序觀察結果,通過開關控制輸出波形的形式,用示波器觀察輸出的波 形。
摘 要
本設計是波形發生器的設計,以 51單片機為核心,通過按鍵輸入控制輸出信號的類型、頻率,采用 D/A轉換芯片DAC0832輸出相應的波形,同時以LED 顯示器進行實時顯示信號相關信息。我們采用 C 語言進行編程,可實現方波,鋸齒波,三角波,三種波形的產生,且波形的類型、頻率可通過按鍵調節,并頻率顯示在數碼管上。
關鍵字:單片機、D/A轉換芯片DAC0832
Abstract
This design is the design of waveform generator, using 51 single chip microcomputer as the core, through the key input type, frequency control output signal, using D/A conversion chip DAC0832 the corresponding output waveform, simultaneously by LED display to display information related to real time signal. We use C language to program, can achieve a square wave, sawtooth wave, triangle wave, three kinds of waveform generation, type, frequency and waveform can be adjusted via buttons, and frequency in the digital tube display.
Key word: Microcontroller, D/A conversion chip DAC0832
波形發生器的設計
一.1 實訓目的1、掌握使用D/A轉換器生成用戶所需要的波形;
2、掌握數/模轉換的基本原理及編程方法;
3、掌握D/A轉換芯片DAC0832的結構特點、工作原理及使用方法;
一.2 實訓內容1、設計軟件程序,通過DAC0832實現D/A轉換,使其分別產生三角波、個鋸齒波、方波;
2、設計一個單片機系統,能夠在不同開關控制下輸出不同的波形形式。
3、利用2*4鍵盤輸入加四位LED顯示器顯示,改變波形的周期。
一.3 實訓步驟1、參考實驗37進行接線
2、開關線接到單片機的P1口,自己設計接線。
3、運行程序觀察結果,通過開關控制輸出波形的形式,用示波器觀察輸出的波形。
一.4 Keil uVision簡介
Keil C51是美國Keil Software公司出品的51系列兼容單片機C語言軟件開發系統,與匯編相比,C語言在功能上、結構性、可讀性、可維護性上有明顯的優勢,因而易學易用。Keil提供了包括C編譯器、宏匯編、連接器、庫管理和一個功能強大的仿真調試器等在內的完整開發方案,通過一個集成開發環境(uVision)將這些部分組合在一起。運行Keil軟件需要WIN98、NT、WIN2000、WINXP等操作系統。如果你使用C語言編程,那么Keil幾乎就是你的不二之選,即使不使用C語言而僅用匯編語言編程,其方便易用的集成環境、強大的軟件仿真調試工具也會令你事半功倍。
優點:
1.Keil C51生成的目標代碼效率非常之高,多數語句生成的匯編代碼很緊湊,容易理解。在開發大型軟件時更能體現高級語言的優勢。
2.與匯編相比,C語言在功能上、結構性、可讀性、可維護性上有明顯的優勢,因而易學易用。用過匯編語言后再使用C來開發,體會更加深刻。 Keil C51軟件提供豐富的庫函數和功能強大的集成開發調試工具,全Windows界面
一.5 實驗原理一.5.1 數碼管顯示原理
一位 LED 顯示器由 8 個發光二極管組成,其中 7 個發光二極管 a-h控制 7 個筆畫段的亮或暗,另一位控制一個小數點的亮和暗。LED 顯示器有共陰極和共陽極 2 種形式。共陽極顯示器是發光二極管的陽極連接在一起,當需要顯示某字符時,只需要將共陽極端接高電平,a-h 中某些位接低電平即可。共陰極顯示器是發光二極管的陰極連接在一起,當需要顯示某字符時,只需要將共陰極端接低電平,a-h 中某些位接高電平即可。
顯示器的工作方式
顯示器的工作方式分為靜態顯示方式和動態顯示方式兩種。
☞ 靜態顯示方式
靜態顯示方式就是顯示器在顯示一個字符時,相應的發光二極管恒定的導通或截止,例如 a、b、c、、e、f 導通,g 截止時顯示“0”,這種使顯示器顯示字符的字形數據常稱為段數據。靜態顯示方式的每一個七段顯示器,需要由一個 8 位并行口控制。優點是顯示穩定,提高了工作效率,缺點是位數較多時顯示口隨之增加。
☞ 動態顯示方式
動態顯示方式是一位一位的輪流點亮各位顯示器,對于每一位顯示器來說,每隔一段時間點亮一次。顯示器的亮度既與導通電流有關,也與點亮時間和間隔時間的比例有關。調整電流和時間參數可以實現亮度較高較穩定的顯示,如顯示器的位數不大于 8 位,則控制顯示器公共極的電位只需要一個 8 位口(位數據口),控制字形也需要一個 8 位口(段數據口)。
數碼管字型碼
要使顯示管顯示不同的數字或者字符,需要使端口輸出相應的字型碼
顯示器字形與字型碼對應關系表
一.5.2 各種波形產生思路【1】 方波產生思路
方波的產生比較簡單,只需要根據按鍵輸入的幅值和頻率計算出相應的DA數據送給數據就可以產生相應的波形。
具體來說,例如產生500Hz的2.5V的波形。
首先,要計算出定時器的定時頻率,由于,方波只有兩種狀態,峰值和0值。峰值時由按鍵設定的,其中峰值占一個周期的一半,即要定時產生1000Hz的定時器頻率,每進一次中斷函數就把DA的數據更新為上次值的取反。讓DA數據在峰值和0之間依次切換即可。
【2】 鋸齒波產生思路
首先,根據按鍵設定的波形頻率,選擇一個周期內合適的點數,根據點數和峰值計算相鄰3個點的幅度的步進值,根據點數和頻率設定相鄰3點的時間值,計算出定時器的初值,然后從0開始逐漸疊加,當疊加到最高點,然后溢出歸零。
【3】 三角波產生思路
首先,根據按鍵設定的波形頻率,選擇一個周期內合適的點數,根據點數和峰值計算相3個點的幅度的步進值,根據點數和頻率設定相鄰3點的時間值,計算出定時器的初值,然后,設置一個變量每進一次定時中斷DA數據就加幅值步進,當等于總點數的一半時,每進一次定時中斷就把DA數據減幅值步進直到DA數據為0,計數變量清零。每進一次定時中斷輸出刷新DA的數據就可以產生一定頻率和幅值的三角波。
一.6 DAC0832介紹 DAC0832是8分辨率的D/A轉換集成芯片。與微處理器完全兼容。這個DA芯片以其價格低廉、接口簡單、轉換控制容易等優點,在單片機應用系統中得到廣泛的應用。D/A轉換器由8位輸入鎖存器、8位DAC寄存器、8位D/A轉換電路及轉換控制電路構成。
一.6.1 DAC0832的主要特性參數 * 分辨率為8位;
* 電流穩定時間1us;
* 可單緩沖、雙緩沖或直接數字輸入;
* 只需在滿量程下調整其線性度;
* 單一電源供電(+5V~+15V);
* 低功耗,20mW。
一.6.2 DAC0832結構* D0~D7:8位數據輸入線,TTL電平,有效時間應大于90ns(否則鎖存器的數據會出錯);
* ILE:數據鎖存允許控制信號輸入線,高電平有效;
* CS:片選信號輸入線(選通數據鎖存器),低電平有效;
* WR1:數據鎖存器寫選通輸入線,負脈沖(脈寬應大于500ns)有效。由ILE、CS、WR1的邏輯組合產生LE1,當LE1為高電平時,數據鎖存器狀態隨輸入數據線變換,LE1的負跳變時將輸入數據鎖存;
* XFER:數據傳輸控制信號輸入線,低電平有效,負脈沖(脈寬應大于500ns)有效;
* WR2:DAC寄存器選通輸入線,負脈沖(脈寬應大于500ns)有效。由WR2、XFER的邏輯組合產生LE2,當LE2為高電平時,DAC寄存器的輸出隨寄存器的輸入而變化,LE2的負跳變時將數據鎖存器的內容打入DAC寄存器并開始D/A轉換。
* IOUT1:電流輸出端1,其值隨DAC寄存器的內容線性變化;
* IOUT2:電流輸出端2,其值與IOUT1值之和為一常數;
* Rfb:反饋信號輸入線,改變Rfb端外接電阻值可調整轉換滿量程精度;
* Vcc:電源輸入端,Vcc的范圍為+5V~+15V;
* VREF:基準電壓輸入線,VREF的范圍為-10V~+10V;
* AGND:模擬信號地
* DGND:數字信號地
一.6.3 DAC0832工作方式⑴單緩沖方式。單緩沖方式是控制輸入寄存器和DAC寄存器同時接收資料,或者只用輸入寄存器而把DAC寄存器接成直通方式。此方式適用只有一路模擬量輸出或幾路模擬量異步輸出的情形。
⑵雙緩沖方式。雙緩沖方式是先使輸入寄存器接收資料,再控制輸入寄存器的輸出資料到DAC寄存器,即分兩次鎖存輸入資料。此方式適用于多個D/A轉換同步輸出的情節。
⑶直通方式。直通方式是資料不經兩級鎖存器鎖存,即 CS*,XFER* ,WR1* ,WR2* 均接地,ILE接高電平。此方式適用于連續反饋控制線路和不帶微機的控制系統,使用時,必須通過另加I/O接口與CPU連接,以匹配CPU與D/A轉換。
一.7 程序一.7.1 主程序#include"reg51.h"
#include"ZLG7290.h"
#include"VIIC_C51.h"
#include"absacc.h"
#include"intrins.h"
#define PA XBYTE[0xfff]
#define uchar unsigned char
#define uint unsigned int
uchar count,change ,val,num,zk,keyport;
uchar code Table[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
bit flag,ful_flag;
uint cycle;
uint bai,shi,ge,shu;
void KeyScan(void);
void delay(uint time);
void fangbo(void);
void juchi();
void sanjiao();
void out();
void Init();
void display();
void main()
{
Init();
while(1)
{
KeyScan();
display();
}
}
void time0()interrupt 1
{
switch(cycle)
{
case 0:{TH0=(65536-461)/256;TL0=(65536-461)%256; break;}
case 1:{TH0=(65536-921)/256;TL0=(65536-921)%256; break;}
case 2:{TH0=(65536-1382)/256;TL0=(65536-1382)%256; break;}
}
out();
}
void Init()
{
TMOD|=0X01;
TR0=1;
EA=1;
ET0=1;
TH0=(65536-461)/256;
TL0=(65536-461)%256;
}
void fangbo()
{
change++;
if(change<42)
PA=255;
else
PA=0;
if(change==85)
change=0;
}
void juchi()
{
PA=val;
val+=3;
}
void sanjiao()
{
if(ful_flag==0)
{
val+=3;
PA=val;
}
if(val>=255)
ful_flag=1;
if(ful_flag==1)
{
val-=3;
PA=val;
}
if(val<3)
ful_flag=0;
}
void out()
{
if(num==1)
{
sanjiao();
}
if(num==2)
{
juchi();
}
if(num==3)
{
fangbo();
}
if(zk==1)
{
cycle=0;
zk=0;
}
if(zk==2)
{
cycle=1;
zk=0;
}
if(zk==3)
{
cycle=2;
zk=0;
}
}
void display()
{
if(cycle==0)
{
if(num==1)
shu=1*85;
else
shu=0.5*85;
bai=shu/100;
shi=shu%100/10;
ge=shu%10;
}
if(cycle==1)
{
if(num==1)
shu=2*85;
else
shu=1*85;
bai=shu/100;
shi=shu%100/10;
ge=shu%10;
}
if(cycle==2)
{
if(num==1)
shu=3*85;
else
shu=1.5*85;
bai=shu/100;
shi=shu%100/10;
ge=shu%10;
}
// com1=0;com2=1;com3=1;
// Send_164(Table[bai]);
// delay(4);
// com1=1;com2=0;com3=1;
// Send_164(Table[shi]);
// delay(4);
// com1=1;com2=1;com3=0;
// Send_164(Table[ge]);
// delay(4);
ZLG7290_SendCmd(0x60,Table[ge]);
delay(1);
ZLG7290_SendCmd(0x60+1,Table[shi]);
delay(1);
ZLG7290_SendCmd(0x60+2,Table[bai]);
delay(1);
}
void delay(uint time) //1ms
{
uint i,j;
for(i=time;i<0;i--)
for(j=110;j<0;j--);
}
void KeyScan(void)
{
keyport=ZLG7290_GetKey();
switch(keyport)
{
case 1:num=1;break;
case 2:num=2;break;
case 3:num=3;break;
case 4:zk=1;break;
case 5:zk=2;break;
case 6:zk=3;break;
}
}
一.7.2 VIIC_C51.C 此程序是I2C操作平臺(主方式的軟件平臺)的底層的C子程序,如發送數據
及接收數據
#include <reg52.h> /*頭文件的包含*/
#include <intrins.h>
#define uchar unsigned char /*宏定義*/
#define uint unsigned int
#define _Nop() _nop_() /*定義空指令*/
/* 常,變量定義區 */
/*端口位定義*/
sbit SDA=P1^7; /*模擬I2C數據傳送位*/
sbit SCL=P1^6; /*模擬I2C時鐘控制位*/
/*狀態標志*/
bit ack; /*應答標志位*/
/*******************************************************************
起動總線函數
函數原型: void Start_I2c();
功能: 啟動I2C總線,即發送I2C起始條件.
********************************************************************/
void Start_I2c()
{
SDA=1; /*發送起始條件的數據信號*/
_Nop();
SCL=1;
_Nop(); /*起始條件建立時間大于4.7us,延時*/
_Nop();
_Nop();
_Nop();
_Nop();
SDA=0; /*發送起始信號*/
_Nop(); /* 起始條件鎖定時間大于4μs*/
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0; /*鉗住I2C總線,準備發送或接收數據 */
_Nop();
_Nop();
}
/*******************************************************************
結束總線函數
函數原型: void Stop_I2c();
功能: 結束I2C總線,即發送I2C結束條件.
********************************************************************/
void Stop_I2c()
{
SDA=0; /*發送結束條件的數據信號*/
_Nop(); /*發送結束條件的時鐘信號*/
SCL=1; /*結束條件建立時間大于4μs*/
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=1; /*發送I2C總線結束信號*/
_Nop();
_Nop();
_Nop();
_Nop();
}
/*******************************************************************
字節數據傳送函數
函數原型: void SendByte(uchar c);
功能: 將數據c發送出去,可以是地址,也可以是數據,發完后等待應答,并對
此狀態位進行操作.(不應答或非應答都使ack=0 假)
發送數據正常,ack=1; ack=0表示被控器無應答或損壞。
********************************************************************/
void SendByte(uchar c)
{
uchar BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) /*要傳送的數據長度為8位*/
{
if((c<<BitCnt)&0x80)SDA=1; /*判斷發送位*/
else SDA=0;
_Nop();
SCL=1; /*置時鐘線為高,通知被控器開始接收數據位*/
_Nop();
_Nop(); /*保證時鐘高電平周期大于4μs*/
_Nop();
_Nop();
_Nop();
SCL=0;
}
_Nop();
_Nop();
SDA=1; /*8位發送完后釋放數據線,準備接收應答位*/
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
if(SDA==1)ack=0;
else ack=1; /*判斷是否接收到應答信號*/
SCL=0;
_Nop();
_Nop();
}
/*******************************************************************
字節數據傳送函數
函數原型: uchar RcvByte();
功能: 用來接收從器件傳來的數據,并判斷總線錯誤(不發應答信號),
發完后請用應答函數。
********************************************************************/
uchar RcvByte()
{
uchar retc;
uchar BitCnt;
retc=0;
SDA=1; /*置數據線為輸入方式*/
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_Nop();
SCL=0; /*置時鐘線為低,準備接收數據位*/
_Nop();
_Nop(); /*時鐘低電平周期大于4.7μs*/
_Nop();
_Nop();
_Nop();
SCL=1; /*置時鐘線為高使數據線上數據有效*/
_Nop();
_Nop();
retc=retc<<1;
if(SDA==1)retc=retc+1; /*讀數據位,接收的數據位放入retc中 */
_Nop();
_Nop();
}
SCL=0;
_Nop();
_Nop();
return(retc);
}
/*******************************************************************
應答子函數
原型: void Ack_I2c(bit a);
功能:主控器進行應答信號,(可以是應答或非應答信號)
********************************************************************/
void Ack_I2c(bit a)
{
if(a==0)SDA=0; /*在此發出應答或非應答信號 */
else SDA=1;
_Nop();
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop(); /*時鐘低電平周期大于4μs*/
_Nop();
_Nop();
_Nop();
SCL=0; /*清時鐘線,鉗住I2C總線以便繼續接收*/
_Nop();
_Nop();
}
/*******************************************************************
向無子地址器件發送字節數據函數
函數原型: bit ISendByte(uchar sla,ucahr c);
功能: 從啟動總線到發送地址,數據,結束總線的全過程,從器件地址sla.
如果返回1表示操作成功,否則操作有誤。
注意: 使用前必須已結束總線。
********************************************************************/
bit ISendByte(uchar sla,uchar c)
{
Start_I2c(); /*啟動總線*/
SendByte(sla); /*發送器件地址*/
if(ack==0)return(0);
SendByte(c); /*發送數據*/
if(ack==0)return(0);
Stop_I2c(); /*結束總線*/
return(1);
}
/*******************************************************************
向有子地址器件發送多字節數據函數
函數原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);
功能: 從啟動總線到發送地址,子地址,數據,結束總線的全過程,從器件
地址sla,子地址suba,發送內容是s指向的內容,發送no個字節。
如果返回1表示操作成功,否則操作有誤。
注意: 使用前必須已結束總線。
********************************************************************/
bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
{
uchar i;
Start_I2c(); /*啟動總線*/
SendByte(sla); /*發送器件地址*/
if(ack==0)return(0);
SendByte(suba); /*發送器件子地址*/
if(ack==0)return(0);
for(i=0;i<no;i++)
{
SendByte(*s); /*發送數據*/
if(ack==0)return(0);
s++;
}
Stop_I2c(); /*結束總線*/
return(1);
}
/*******************************************************************
向無子地址器件讀字節數據函數
函數原型: bit IRcvByte(uchar sla,ucahr *c);
功能: 從啟動總線到發送地址,讀數據,結束總線的全過程,從器件地
址sla,返回值在c.
如果返回1表示操作成功,否則操作有誤。
注意: 使用前必須已結束總線。
********************************************************************/
bit IRcvByte(uchar sla,uchar *c)
{
Start_I2c(); /*啟動總線*/
SendByte(sla+1); /*發送器件地址*/
if(ack==0)return(0);
*c=RcvByte(); /*讀取數據*/
Ack_I2c(1); /*發送非就答位*/
Stop_I2c(); /*結束總線*/
return(1);
}
/*******************************************************************
向有子地址器件讀取多字節數據函數
函數原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);
功能: 從啟動總線到發送地址,子地址,讀數據,結束總線的全過程,從器件
地址sla,子地址suba,讀出的內容放入s指向的存儲區,讀no個字節。
如果返回1表示操作成功,否則操作有誤。
注意: 使用前必須已結束總線。
********************************************************************/
bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
{
uchar i;
Start_I2c(); /*啟動總線*/
SendByte(sla); /*發送器件地址*/
if(ack==0)return(0);
SendByte(suba); /*發送器件子地址*/
if(ack==0)return(0);
Start_I2c();
SendByte(sla+1);
if(ack==0)return(0);
for(i=0;i<no-1;i++)
{
*s=RcvByte(); /*發送數據*/
Ack_I2c(0); /*發送就答位*/
s++;
}
*s=RcvByte();
Ack_I2c(1); /*發送非應位*/
Stop_I2c(); /*結束總線*/
return(1);
}
一.7.3 ZLG7290#include "REG52.h"
#include "viic_c51.h"
#define zlg7290 0x70 //ZLG7290的IIC地址
#define SubKey 0x01
#define SubCmdBuf 0x07
#define SubDpRam 0x10
** 函數名稱: DelayNS
** 功能描述: 長軟件延時
** 輸 入: i : 延時參數,值越大時延時越久
** 輸 出: 無
** 全局變量: 無
** 調用模塊: 無
void delayMS(unsigned char i)
{
unsigned char j,k;
for(k=0;k<i;k++)
for(j=0;j<60;j++);
}
** 函數名稱: ZLG7290_SendData
** 功能描述: 發送數據
** 輸 入:SubAdd : 輸入數據
** DATA : 輸入值
**
** 輸 出: 0 : Fail
** 1 : OK
** 全局變量: 無
** 調用模塊: delayMS
unsigned char ZLG7290_SendData(unsigned char SubAdd,unsigned char Data)
{
if(SubAdd>0x17)
return 0;
ISendStr(zlg7290,SubAdd,&Data,1);
delayMS(10);
return 1;
}
** 函數名稱: ZLG7290_SendCmd
** 功能描述: 發送命令(對子地址7、8)
** 輸 入:DATA1 : 命令1
** DATA2 : 命令2
** 輸 出: 0 : Fail
** 1 : OK
** 全局變量: 無
** 調用模塊: ISendStr、delayMS
unsigned char ZLG7290_SendCmd(unsigned char Data1,unsigned char Data2)
{
unsigned char Data[2];
Data[0]=Data1;
Data[1]=Data2;
ISendStr(zlg7290,0x07,Data,2);
delayMS(10);
return 1;
}
/*********************************************************************************************************
** 函數名稱: ZLG7290_SendBuf
** 功能描述: 向顯示緩沖區發送數據
** 輸 入: * disp_buf : 要發送數據的起始地址
** num : 發送個數
** 輸 出: 無
** 全局變量: 無
** 調用模塊: ZLG7290_SendCmd
********************************************************************************************************/
void ZLG7290_SendBuf(unsigned char * disp_buf,unsigned char num)
{
unsigned char i;
for(i=0;i<num;i++)
{
ZLG7290_SendCmd(0x60+i,*disp_buf);
disp_buf++;
}
}
/*********************************************************************************************************
** 函數名稱: ZLG7290_GetKey
** 功能描述: 讀取鍵值
** 輸 入: 無
** 輸 出: >0 鍵值
** =0 無鍵按下
** 全局變量: 無
** 調用模塊: IRcvStr、delayMS
********************************************************************************************************/
unsigned char ZLG7290_GetKey()
{
unsigned char rece;
rece=0;
IRcvStr(zlg7290,1,&rece,1);
delayMS(10);
return rece;
}
實訓心得 經過這段時間的單片機課程設計,終于完成了波形發生器的設計,基本達到設計要求,從心底里來說,還是很高興的,畢竟這次設計把實物都做了出來。
在本次設計的過程中,我發現很多的問題,雖然以前還做過這樣的設計但這次設計真的讓我長進了很多。對于單片機設計,其硬件電路是比較簡單的,主要是解決程序設計的問題,而程序設計是一個很靈活的東西,它反映了你解決問題的邏輯思維和創新能力,它才是一個設計的靈魂所在。因此在整個設計過程中大部分時間是用在程序上面的。很多子程序是可以借鑒書本上的,但怎樣銜接各個子程序才是關鍵的問題所在,這需要對單片機的結構很熟悉。因此可以說單片機的設計是軟件和硬件的結合,二者是密不可分的。
同時在本次設計的過程中,我還學會了高效率的查閱資料、運用工具書、利用網絡查找資料。我發現,在我們所使用的書籍上有一些知識在實際應用中其實并不是十分理想,各種參數都需要自己去調整。偶而還會遇到錯誤的資料現象,這就要求我們應更加注重實踐環節。
最后還要在此感謝指導老師們和我的同學,他們在整個過程中都給予了我充分的幫助與支持。
參考文獻1、DAC08320的數據手冊。
2、參考《單片機實驗與實驗教程》實驗37內容。
3、周立功《單片機應用設計基礎》
4、網絡上一些資源
5、譚浩強《C 程序設計》
|