單片機C51語言是由C語言繼承而來的。和C語言不同的是,C51語言運行于單片機平臺,而C語言則運行于普通的桌面平臺。C51語言具有C語言結(jié)構(gòu)清晰的優(yōu)點,便于學習,同時具有匯編語言的硬件操作能力。對于具有C語言編程基礎(chǔ)的讀者,能夠輕松地掌握單片機C51語言的程序設(shè)計。
C語言是一種高級程序設(shè)計語言,它提供了十分完備的規(guī)范化流程控制結(jié)構(gòu)。因此采用C51語言設(shè)計單片機應用系統(tǒng)程序時,首先要盡可能地采用結(jié)構(gòu)化的程序設(shè)計方法,這樣可使整個應用系統(tǒng)程序結(jié)構(gòu)清晰,易于調(diào)試和維護。對于一個較大的程序,可將整個程序按功能分成若干個模塊,不同的模塊完成不同的功能。對于不同的功能模塊,分別指定相應的入口參數(shù)和出口參數(shù),而經(jīng)常使用的一些程序最好編成函數(shù),這樣既不會引起整個程序管理的混亂,還可增強可讀性,移植性也好。
在程序設(shè)計過程中,要充分利用C51語言的預處理命令。對于一些常用的常數(shù),如TRUE,F(xiàn)ALSE,PI以及各種特殊功能寄存器,或程序中一些重要的依據(jù)外界條件可變的常量,可采用宏定義“#define”或集中起來放在一個頭文件中進行定義,再采用文件包含命令“#include”將其加入到程序中去。這樣當需要修改某個參量時,只須修改相應的包含文件或宏定義,而不必對使用它們的每個程序文件都作修改,從而有利于文件的維護和更新。
源程序,是指未經(jīng)編譯的,按照一定的程序設(shè)計語言規(guī)范書寫的,人類可讀的文本文件。通常由高級語言編寫。源程序可以是以書籍或者磁帶或者其他載體的形式出現(xiàn),但最為常用的格式是文本文件,這種典型格式的目的是為了編譯出計算機可執(zhí)行的程序。將人類可讀的程序代碼文本翻譯成為計算機可以執(zhí)行的二進制指令,這種過程叫做編譯,由各種編譯器來完成。一般用高級語言編寫的程序稱為“源程序”
//==============================================================================//2005-03-28.。.2005-03-29//ADC0834模塊的C51程序源文件//File Name=ADC083X.c//==============================================================================#include #include
//==============================================================================
//2005-03-28.。.2005-03-29
//ADC0834模塊的C51程序源文件
//File Name=ADC083X.c
//==============================================================================
#include
#include “DELAY_S.h”
#include “ADC083X.h”
//外部全局變量的預定義
//*******************************************************
//序號:
// HD_ADC083X_S01
//功能:
// 端口初始化
//輸入:
// 無
//輸出:
// 無
//********************************************************
void adc083x_init(void)
{
SET_ADC083X_CS;
SET_ADC083X_DO;
CLR_ADC083X_CLK;
#if TYPE_VAL 》=ADC0832
SET_ADC083X_DI;
#endif
#if TYPE_VAL 》=ADC0834
SET_ADC083X_SARS;
#endif
}
//*******************************************************
//序號:
// HD_ADC083X_S02
//功能:
// 讀出AD數(shù)據(jù)字節(jié)
//輸入:
// chanel 通道號以及單、雙端設(shè)置選擇,它的值被類型值限制!
// 即有效值是select分別取最低4、3、2位或不使用
// 具體的值參見pdf文檔!
//輸出:
// AD轉(zhuǎn)換的結(jié)果字節(jié)
//********************************************************
uchar adc083x_do_one_change(uchar chanel)
{
uchar data ad_val;
uchar data i;
//轉(zhuǎn)換前的初始化
SET_ADC083X_CS;
CLR_ADC083X_CLK;
SET_ADC083X_DO;
CLR_ADC083X_CS;
//SARS引腳非必要時可以不使用,以節(jié)省引腳資源!
#if (TYPE_VAL==ADC0838)
//chanel_.3 .2 .1 .0 =0000 通道0+_通道1-,
=001 通道2+_通道3-,(雙端方式)
// SGL/DIF ODD/SIGN SELECT SELECT =0010 通道4+_通道5-,
=011 通道6+_通道7-,(雙端方式)
// =0100 通道0-_通道1+,
=0101 通道2-_通道3+,(雙端方式)
// =0110 通道4-_通道5+,
=0111 通道6-_通道7+,(雙端方式)
// =1000 通道0+, =1001
通道2+,(單端方式)
// =1010 通道4+, =1011
通道6+,(單端方式)
// =1100 通道1+, =1101
通道3+,(單端方式)
// =1110 通道5+, =1111
通道7+,(單端方式)
//引腳/SE可以接地,不使用其控制反響字節(jié)的輸出延時功能!
chanel |=0x10; //附加起始位
for(i=0; i《5; i++)
{
if( (chanel &0
x10)!=0)
{
SET_ADC083X_DI;
}
else
{
CLR_ADC083X_DI;
}
SET_ADC083X_CLK;
CLR_ADC083X_CLK;
chanel 《《=1;
}
#elif (TYPE_VAL==ADC0834)
//chanel_.2 .1 .0 =000 通道0+_通道1-, =001 通道2+_通
道3-, (雙端方式)
// SGL/DIF ODD/SIGN SELECT =010 通道0-_通道1+, =011 通道2-_通
道3+, (雙端方式)
// =100 通道0+, =101 通道2+,
(單端方式)
// =110 通道1+, =111 通道3+,
(單端方式)
chanel |=0x08; //附加起始位
for(i=0; i《4; i++)
{
if( (chanel &0x08)!=0)
{
SET_ADC083X_DI;
}
else
{
CLR_ADC083X_DI;
}
SET_ADC083X_CLK;
CLR_ADC083X_CLK;
chanel 《《=1;
}
#elif (TYPE_VAL==ADC0832)
//chanel_.1 .0 =00 通道0+_通道1-, =01 通道0-_通道
1+, (雙端方式)
// SGL/DIF ODD/SIGN =10 通道0+, =11 通道1+,
(單端方式)
chanel |=0x04; //附加起始位
for(i=0; i《3; i++)
{
if( (chanel &0x04)!=0)
{
SET_ADC083X_DI;
}
else
{
CLR_ADC083X_DI;
}
SET_ADC083X_CLK;
CLR_ADC083X_CLK;
chanel 《《=1;
}
#else //缺省時為ADC0831
SET_ADC083X_CLK;
CLR_ADC083X_CLK;
#endif
SET_ADC083X_CLK; //數(shù)據(jù)接收前的轉(zhuǎn)換位
CLR_ADC083X_CLK;
for(ad_val=0, i=0; i《8; i++)
{
ad_val 《《=1;
SET_ADC083X_CLK;
ad_val +=(JUDGE_ADC083X_DO ==1? 1:0);
CLR_ADC083X_CLK;
}
//對非ADC0831的型號而言,后續(xù)波形沒有使用!
SET_ADC083X_CS;
return(ad_val);
}
//=============================================================================
//End Of File
評論
查看更多