通過(guò)光敏電阻輸入模擬信號(hào),得到相應(yīng)的數(shù)字信號(hào),通過(guò)數(shù)字量的大
小設(shè)置閾值,通過(guò)閾值可以控制燈泡等設(shè)備的開關(guān)
模擬信號(hào)輸入口為AN0,模擬電壓的產(chǎn)生由外圍電路搭建,參考電壓為內(nèi)部的VCC和VSS
通過(guò)串行口連接上位機(jī)顯示轉(zhuǎn)換后的數(shù)字信號(hào)
主程序
#include “p18f4620.h”
//初始化,可不需要
void initial()
{
INTCON = 0x00; //位7~0:關(guān)總中斷
ADCON1 = 0x07; //設(shè)置數(shù)字輸入輸出口
PIE1 = 0;
PIE2 = 0;
}
//串行口初始化
void EUSART_Init()
{
TXSTA = 0xA4; //選擇異步高速方式傳輸8位數(shù)據(jù)
RCSTA = 0x90; //允許串行口工作
BAUDCON =0x00; //
TRISC = TRISC|0x80; //將RC7(RX)設(shè)置為輸入方式
TRISC = TRISC&0xBF; //將RC6(TX)設(shè)置為輸出方式
SPBRG = 25; //4MHZ晶振時(shí)波特率設(shè)置為9600
}
//通過(guò)串口發(fā)送數(shù)據(jù)
void send_ch(unsigned char d)
{
PIR1bits.TXIF = 0;
TXREG = d;
Nop();
while(TXSTAbits.TRMT == 0); //等待發(fā)送完畢
}
//AD初始化函數(shù)
void AD_Init(void)
{
ADCON1 = 0x0E; //參考電壓為VCC~VSS,配置模擬輸入口為AN0和AN1
ADCON2 = 0xA6; //AD結(jié)果右對(duì)齊,采樣時(shí)間8個(gè)TAD,轉(zhuǎn)換時(shí)鐘選擇為Fos/64
ADCON0 = 1; //啟動(dòng)AD
PIR1bits.ADIF = 0; //
TRISAbits.TRISA0 = 1; //設(shè)置模擬輸入口RA0和RA1為輸入方式
TRISAbits.TRISA1 = 0;
}
//讀取指定通道的AD采集數(shù)據(jù)
unsigned int Read_AD(unsigned char ch)
{
unsigned int adtemp;
PIR1bits.ADIF = 0;
ADCON0 = (ch 《《 2)|1; //模擬輸入通道的選擇
ADCON0bits.GO = 1;
while(ADCON0bits.GO); //等待轉(zhuǎn)換的結(jié)束
PIR1bits.ADIF = 0;
// adtemp = ADRESL + (ADRESH 《《 8);
adtemp = ADRESH; //讀取AD的轉(zhuǎn)換值
adtemp = (adtemp 《《 8) + ADRESL;
return adtemp;
}
//軟件延時(shí)函數(shù)
void wait(unsigned char t)
{
unsigned char i;
unsigned int j;
for(i=0;i for(j=0;j《10000;j++);
}
//主控制函數(shù)
void main()
{
unsigned int adtempdat;
// TRISAbits.TRISA0=0;
// LATAbits.LATA0=1;
initial();
EUSART_Init();
AD_Init();
while(1)
{
adtempdat = Read_AD(0); //選擇通道0
send_ch(0xFF); //發(fā)送間隔標(biāo)志
send_ch(adtempdat); //發(fā)送數(shù)字低八位
send_ch(adtempdat 》》 8); //發(fā)送數(shù)字高八位
if(adtempdat 《 0x0100) //燈的開關(guān)閾值可以調(diào)節(jié)
{
LATAbits.LATA1 = 1;//如果亮度小于閾值,開燈,否則關(guān)燈
}
else
{
LATAbits.LATA1 = 0;
}
Nop();
wait(10);
}
}
評(píng)論
查看更多