十年專注單片機方案開發(fā)的方案公司英銳恩,分享PIC16F877 單片機A/D轉(zhuǎn)化的C的源程序。英銳恩現(xiàn)提供服務產(chǎn)品涉及主控芯片:8位單片機、16位單片機、32位單片機及各類運算放大器等。
6.1 A/D轉(zhuǎn)換的應用
例6.1 A/D轉(zhuǎn)換初始化程序
//A/D轉(zhuǎn)換初始化子程序
void adinitial( )
{
ADCON0 = 0x51; //選擇A/D通道為RA2,打開A/D轉(zhuǎn)換器
//在工作狀態(tài),且使AD轉(zhuǎn)換時鐘為8tosc
ADCON1 = 0X80; //轉(zhuǎn)換結果右移,及ADRESH寄存器的高6位為"0"
//且把RA2口設置為模擬量輸入方式
PIE1 = 0X00;
PIE2 = 0X00;
ADIE = 1; //A/D轉(zhuǎn)換中斷允許
PEIE = 1; //外圍中斷允許
TRISA2=1; //設置RA2為輸入方式
}
6.1.2 程序清單
下面給出一個調(diào)試通過的例程,可作為讀者編制程序的參考。該程序中用共用體的方式把A/D轉(zhuǎn)換的10位結果組合在一起。有關共用體的詳細資料請參考本書相關章節(jié)。
# include
union adres
{int y1;
unsigned char adre[2];
}adresult; //定義一個共用體,用于存放A/D轉(zhuǎn)換的結果
unsigned char i;
unsigned int j;
//系統(tǒng)各I/O口初始化子程序
void initial()
{
TRISD=0X00; //D口為輸出
i=0x00;
}
//A/D轉(zhuǎn)化初始化子程序
void adinitial()
{
ADCON0=0x51; //選擇A/D通道為RA2,打開A/D轉(zhuǎn)換器
//在工作狀態(tài),且使A/D轉(zhuǎn)換時鐘為8tosc
ADCON1=0X80; //轉(zhuǎn)換結果右移,及ADRESH寄存器的高6位為"0"
//且把RA2口設置為模擬量輸入方式
PIE1=0X00;
PIE2=0X00;
ADIE=1; //A/D轉(zhuǎn)換中斷允許
PEIE=1; //外圍中斷允許
TRISA2=1; //設置RA2為輸入方式
}
//延時子程序
void delay()
{
for(j=5535;--j;) continue;
}
//報警子程序
void alarm()
{
i=i^0xFF; //通過異或方式每次把i的各位值取反
PORTD=i; //D口輸出i的值
}
//中斷服務程序
void interrupt adint(void)
{
ADIF=0; //清除中斷標志
adresult.adre[0]=ADRESL;
adresult.adre[1]=ADRESH; //讀取并存儲A/D轉(zhuǎn)換結果,A/D轉(zhuǎn)換的結果通過共
//用體的形式放入了變量y1中
if(adresult.y1>0x200)
{
alarm(); //如果輸入的模擬量大于2.5V(對應數(shù)字量
//0X200h),則調(diào)用報警子程序
delay(); //調(diào)用延時子程序,使電壓檢測不要過于頻繁
}
else PORTD=0XF0 ; //如果輸入的模擬量小于2.5V,則與D口相連的
//8個發(fā)光二極管的低4個發(fā)亮,表示系統(tǒng)正常
ADGO=1; //啟動下一次A/D轉(zhuǎn)換
}
//主程序
main()
{
adinitial(); //A/D轉(zhuǎn)換初始化
initial(); //系統(tǒng)各I/O口初始化
ei(); //總中斷允許
ADGO=1; //啟動A/D轉(zhuǎn)換
while(1)
{
;
} //等待中斷,在中斷中循環(huán)檢測外部電壓
}
6.2.2 I2C總線工作方式相關子程序
1.C語言編寫的I2C總線工作方式的初始化子程序
//I2C初始化子程序
void i2cint()
{
SSPCON = 0X08; //初始化SSPCON寄存器
TRISC3 =1; //設置SCL為輸入口
TRISC4 =1; //設置SDA為輸入口
TRISA4 = 0;
SSPSTAT=0X80; //初始化SSPSTAT寄存器
SSPADD=0X02; //設定I2C時鐘頻率
SSPCON2=0X00; //初始化SSPCON2寄存器
di(); //關閉總中斷
SSPIF=0; //清SSP中斷標志
RA4=0; //關掉74HC165的移位時鐘使能,以免74HC165移位
//數(shù)據(jù)輸出與I2C總線的數(shù)據(jù)線發(fā)生沖突(此操作與該
//實驗板的特殊結構有關,不是通用的)
SSPEN=1; //SSP模塊使能
}
2.C語言編寫的I2C總線工作方式傳輸數(shù)據(jù)子程序
需要發(fā)送的數(shù)據(jù)在寄存器j中。
//I2C總線輸出數(shù)據(jù)子程序
i2cout()
{
SEN=1; //產(chǎn)生I2C啟動信號
for(n=0x02;--n;) continue;//給予一定的延時,保證啟動
do {
RSEN=1; //產(chǎn)生I2C重啟動信號
}while(SSPIF==0); //等待數(shù)據(jù)發(fā)送完畢
SSPIF=0; //SSPIF標志清0
PEN=1; //產(chǎn)生停止條件
do {
;
}while(SSPIF==0); //等待停止條件產(chǎn)生
SSPIF=0; //SSPIF標志清0
}
//主程序
main ()
{
i2cint(); //I2C初始化
while(1){
for(i=0x00;i<=127;++i)
{
j=table[i]; //從數(shù)組中得到需要傳輸?shù)臄?shù)據(jù)量
i2cout(); //利用I2C總線方式送出數(shù)據(jù)
}
}
}