?? ad.c
字號:
/**********************AD轉換的實驗**************************/
/*說明:用RA3腳來采樣室內溫度對應的端口,當室內溫度對應 */
/* 的電阻值大于5.1K(分得的電壓高于2.5V)的時候進入中斷*/
/* 并報警,低于2.5V時退出中斷服務程序并正常進行A/D采樣,*/
/* 正常采樣時亮首尾兩盞等,報警時亮三盞燈。 */
/************************************************************/
#include "pic1687x.h"
#include "pic.h"
union adres
{
int y1;
unsigned char adre[2];
}adresult; //定義一個共用體,用于存放A/D轉換的結果
unsigned char i,j;
/*系統各I/O初始化子程序*/
void initial()
{
//TRISD=0X00; //E端口為輸出
TRISB=0X00;
i=0X00;
}
/*A/D轉換初始化子程序*/
void adinitial()
{
ADCON0=0X59; //選擇A/D通道為RA3,打開A/D轉換器
//在工作狀態,且使A/D轉換時鐘為8Tosc
ADCON1=0X80; //轉換結果右移,即ADRESH寄存器的高六位為零
//且把RA3口設置為模擬量輸入方式
PIE1=0X00;
PIE2=0X00;
ADIE=1; //A/D轉換中斷允許
PEIE=1; //外圍中斷允許
TRISA3=1; //設置R3為輸入方式
//PORTD=0X00; //置4051的S0,S1,S2腳,選擇室內溫度作為采樣對象
}
/*延時子程序*/
void delay()
{
for (j=255;--j;)
continue;
}
/*報警子程序*/
void alarm()
{
i=i^0X00; //取反,用于顯示LED
PORTB=i; //E口輸出i的值
}
/*中斷服務程序*/
void interrupt adint(void)
{ asm("clrwdt"); //清除看門狗
ADIF=0; //清除中斷標志
adresult.adre[0]=ADRESL;
adresult.adre[1]=ADRESH; //讀取并存儲A/D轉換的結果,A/D轉換的結果
//用共用體的形式放入了變量y1中
if(adresult.y1>0X200)
{
alarm(); //如果輸入量大于2.5V(對應的數子量為0X200,則
//調用報警子程序
delay(); //延時程序,使電壓檢測不要過于頻繁
}
else
PORTB=0X01; //如果輸入的模擬量小于2.5V,則四盞燈亮,表示
//系統正常
ADGO=1; //啟動下一次A/D轉換
}
/*主程序*/
main()
{
adinitial(); //A/D初始化
initial(); //系統各I/O口初始化
ei(); //總中斷允許
ADGO=1; //啟動A/D轉換
while(1)
{
; //等待中斷,在中斷中循環檢測外部電壓
}
}
/******************************END*******************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -