?? wadc0.c
字號:
//功能:將AIN0.0的輸入值(電壓)轉換為12位數字量,保存在片內外部存儲器XRAM中
//LCD顯示電壓值
#include<c8051f020.h> //作SFR定義
sfr16 TMR3RL=0x92; //保存重裝載值
sfr16 TMR3=0x94; //保存計數值
sfr16 ADC0=0xbe; //保存轉換后代碼
#define SYSCLK 22118400 //取22.118400MHz外部晶振
#define DEC 256
#define SAMPLE_RATE 50000
unsigned long x;
unsigned char xdata LCDdata[7]={0x30,0x30,0x2e,0x30,0x30,0x30,0x56};
long result;
unsigned char *lcdpoint; //指向 lcddata數組的指針
unsigned char lcd_data_count; //要顯示的數據個數
unsigned char xdata *point; //指向XRAM的指針
void SYSCLK_Init (void);
void PORT_Init(void);
void Timer3_Init(int counts);
void ADC_Init(void);
void ADC_ISR(void);
void LCD_Init(void);
void main(void)
{
unsigned char data1;
long voltage;
int v_int,v_frac;
WDTCN=0xde; //關看門狗定時器
WDTCN=0xad;
SYSCLK_Init(); //初始化系統時鐘
PORT_Init(); //初始化IO端口
Timer3_Init(SYSCLK/SAMPLE_RATE); //初始化定時器3
ADC_Init(); //初始化ADC0
EA=1; //允許所有中斷
while(result==0); //等于0,則等待
while(1)
{
EA = 0;
voltage=result;
point=0x0000; //XRAM中0x0000單元保存數字量低8位
*point=voltage&0x00ff;
point=point+1; //0x0001單元保存高4位
*point=(voltage>>8)&0x000f;
for(x=0;x<50000;x++);
EA = 1;
voltage=8611L-(voltage*2968L)/1024; //通道0
//voltage=(voltage*625L)/1024; //通道1
v_int=voltage/1000;
v_frac=voltage-(v_int*1000);
LCDdata[0]=v_int/10+0x30;LCDdata[1]=v_int%10+0x30; //整數部分
LCDdata[3]=v_frac/100+0x30;LCDdata[4]=v_frac%100/10+0x30;LCDdata[5]=v_frac%100%10+0x30; //小數部分
LCD_Init(); //LCD初始化
P2=0xA0; //準備送數據
for(x=0;x<50000;x++); //通過改變延時量可改變LCD顯示速度
lcdpoint=&LCDdata;
for(lcd_data_count=7;lcd_data_count>0;lcd_data_count--) //顯示第一行字符
{
data1=*lcdpoint;
P3=data1; //送顯
P2=0x20;
P2=0xA0;
lcdpoint++;
for(x=0;x<5000;x++);
}
}
}
void LCD_Init(void)
{
unsigned long x;
P2 = 0X80;
for(x=0;x<1000;x++);
//P7 = 0x30; /*一行顯示*/
P3 = 0x38; /*兩行顯示*/
P2 = 0X00;//0x08;
P2 = 0X80;//0x09;
for(x=0;x<1000;x++);
P3 = 0x0e;
P2 = 0x00;
P2 = 0x80;
for(x=0;x<1000;x++);
P3= 0x06;
P2 = 0x00;
P2 = 0x80;
for(x=0;x<5000;x++);
P3 = 0x01;
P2 = 0x00;
P2 = 0x80;
for(x=0;x<5000;x++);
}
void SYSCLK_Init(void)
{
int i; // delay counter
OSCXCN=0x67; // 啟動外部振蕩器用22.1184MHz晶體
for(i=0;i<256;i++); // 最少等待>1ms
while (!(OSCXCN & 0x80)); // 等待晶體穩定
OSCICN=0x88; // 選擇外部振蕩器作為系統時鐘源,使能丟失時鐘檢測器
}
void PORT_Init(void)
{
XBR2=0x40; //使能交叉開關
P2MDOUT = 0xe0; // P2口設為推挽方式
P3MDOUT = 0xff; // P3口設為推挽方式
EMI0CF|=0x20; //只用片內數據存儲器,ALE高/低脈沖占1個SYSCLK周期
EMI0TC|=0x6c; //地址建立/保持時間占0個SYSCLK周期,讀寫占12個SYSCLK周期
}
void Timer3_Init (int counts)
{
TMR3CN = 0x02;
TMR3RL = -counts;
TMR3 = 0xffff;
EIE2 &= ~0x01;//使能T3標志位有效,允許作中斷申請
TMR3CN |= 0x04;
}
void ADC_Init(void)
{
ADC0CN|=0x84; //ADC0使能,定時器3溢出使能模數轉換
REF0CN = 0x07; // 啟用內部基準源
ADC0CF =0x40; //設置轉換周期=2.5MHz,PGA增益系數為1
AMX0CF|=0x00; //單端輸入
AMX0SL=0x00; //選擇通道0
//AMX0SL=0x01; //選擇通道1
EIE2|=0x02; //使能ADC0轉換結束中斷
}
void ADC_ISR(void)interrupt 15 //ADC0轉換結束中斷服務程序
{
static unsigned dec=DEC;
static long accumulator=0L;
AD0INT = 0; // 清 ADC 中斷標志位
accumulator += ADC0; // 累加ADC采樣數據
dec--; // 指針減1
if(dec==0) // 累加完了嗎?
{
dec = DEC; // 指針復位
result=accumulator>>8; // 取平均
accumulator=0L; // 累加和變量清0
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -