為何程序//功能:ADC0809模塊測試,讀取IN3口的模擬電
//編譯環境: KEIL UVISION2
//單片機晶振:12M 單片機型號AT89S52
//單片機晶振: 無特殊要求
//作者:興向榮電子元件店
//日期:2013.06.20
//功能:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
// adc0809模塊接線
#define uchar unsigned char
sbit STR=P1^0; //單片機P1.0接模塊STR引腳, 啟動轉換信號
sbit EOC=P1^1; //單片機P1.1接模塊EOC, 轉換結束信號,高電平有效
sbit OE=P1^2; //單片機P1.2接模塊OE,輸出允許信號,高電平有效
sbit CLK=P1^3; //單片機P1.3接CLK ,ADC0809時鐘,輸入50-800KHZ的頻率
//一般選用500K
#define adc0809_data P3// ADC0809模塊的D0-D7分別接P3.0-P3.7
/*地址選擇 A 接H
B 接H
C 接L
選擇通到IN3,當然也可以通過軟件設置地址
REF+ 接VCC
REF- 接GND
這樣 AD=256*(VIN-(VREF-))/(VREF+)-(VREF-)
(VREF+)=5V;
(VREF-)=0V;
AD=256*VIN/5
所以IN3口的電壓VIN=AD*5/256;
*/
uchar AD_DATA[1]; //保存IN0通道轉換后的數據
uint addata2;
//==============LCD1602接口連接方法=====================
/*-----------------------------------------------------
|DB0-----P0.0 | DB4-----P0.4 | RW-------P2.3 |
|DB1-----P0.1 | DB5-----P0.5 | RS-------P2.4 |
|DB2-----P0.2 | DB6-----P0.6 | E--------P2.2 |
|DB3-----P0.3 | DB7-----P0.7 |
---------------------------------------------------*/
//================================================*/
#define LCM_Data P0 //LCD1602數據接口
#define Busy 0x80 //用于檢測LCM狀態字中的Busy標識
sbit LCM_RW = P2^3; //讀寫控制輸入端,LCD1602的第五腳
sbit LCM_RS = P2^4; //寄存器選擇輸入端,LCD1602的第四腳
sbit LCM_E = P2^2; //使能信號輸入端,LCD1602的第6腳
//**************函數聲明***************************************
void WriteDataLCM (uchar WDLCM);//LCD模塊寫數據
void WriteCommandLCM (uchar WCLCM,BuysC); //LCD模塊寫指令
uchar ReadStatusLCM(void);//讀LCD模塊的忙標
void DisplayOneChar(uchar X,uchar Y,uchar ASCII);//在第X+1行的第Y+1位置顯示一個字符
void LCMInit(void);//LCD初始
void delayms(uint ms);//1MS基準延時程序
void delay(uchar i); //延時函數2
void DisplayListChar(uchar X,uchar Y,uchar delayms, uchar code *DData);
void judge_xianshi(void);//顯示處理程序
void init();//系統初始化設置
void AD();//讀取AD數據
uchar flag1;
//***********************主程序******************************
main()
{
init();//系統初始化設置
LCMInit();
while(1)
{
AD();
judge_xianshi();
delayms(100);
}
}
/*********
系統初始化
***********/
void init()
{
EA=1; //開總中斷
TMOD=0x02; //設定定時器 T0工作方式
TH0=216; //利用T0中斷產生CLK信號
TL0=216;
TR0=1; //啟動定時器T0
ET0=1;
STR=0;
OE=0;
}
void judge_xianshi()
{
addata2=AD_DATA[0]*100;//把數據擴大100,為下面求取小數位后2位做準備
DisplayListChar(0,1,0, "xingxiangrong");//在液晶的第一行顯示字符"XINGXIANGR"
DisplayListChar(1,0,0, "AD="); //在液晶的第二行第0位開始顯示"AD="
DisplayOneChar( 1, 3, AD_DATA[0]/100+0x30); //顯示AD數據的百位
DisplayOneChar( 1, 4, AD_DATA[0]/10%10+0x30);//顯示AD數據的十位
DisplayOneChar( 1, 5, AD_DATA[0]%10+0x30);//顯示AD數據的各位
DisplayListChar(1,7,0, "Vin="); //在液晶的第二行第8位開始顯示"Vin="
//根據VIN=AD*5/256,求取IN3通到輸入的電壓
DisplayOneChar( 1, 11, AD_DATA[0]/51+0x30);//顯示輸入電壓的整數位
DisplayListChar(1,12,0, ".");//顯示小數點
DisplayOneChar( 1, 13, addata2/51/10%10+0x30);//顯示輸入電壓小數后1位
DisplayOneChar( 1, 14, addata2/51%10+0x30);//顯示輸入電壓小樹后2位
DisplayListChar(1,15,0, "V");
}
/***********AD
轉換函數
**********/
void AD()
{
STR=0;
//ADDR這樣如果不是通道0,可以在這邊加一條其他地址的程序
delay(10);
STR=1; //啟動AD轉換
delay(10);
STR=0;
while(0==EOC);//等待轉換結束
OE=1;
AD_DATA[0]=adc0809_data; //讀取AD數據,數據范圍為0-255
OE=0;
程序沒有下載完成
|