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