📄 main_bak.c
字号:
/*ADC0809驱动程序,采用AT89C51与ADC0809芯片进行实现,结果在LCD上显示*/
#include <REG51.H>
#include <stdio.h>
#include <INTRINS.H> //为调用nop空指令需要
#define DS_NOP() _nop_();_nop_();_nop_();_nop_()
#define REF_Voltage 5.25 //ADC0809基准电压
#define PLUS_CH0 1 //各个通道增益
#define PLUS_CH1 1
#define PLUS_CH2 1
#define PLUS_CH3 4
#define PLUS_CH4 1
#define PLUS_CH5 1
#define PLUS_CH6 1
#define PLUS_CH7 1
/*对ADC0809的控制信号进行设置,使能够进行控制*/
sbit ST = P2^5;
sbit OE = P2^4;
sbit EOC = P2^3;
sbit ADC0809_C = P2^2;
sbit ADC0809_B = P2^1;
sbit ADC0809_A = P2^0;
/*
sbit RW = P3^6;
sbit RS = P3^5;
sbit E = P3^7;
*/
//unsigned char r1[] = {"pass voltage:"};;
//void delay();
/*ADC0809转换函数,通道3输入模拟信号*/
unsigned char ADC0809test(unsigned char ch0)
{
unsigned char ADCdata; //AD转换后得到的数字量
ST = 0;
EOC = 1;
OE = 0;
switch(ch0)
{
case 0:
{
ADC0809_A = 0;
ADC0809_B = 0;
ADC0809_C = 0;
break;
}
case 1:
{
ADC0809_A = 1;
ADC0809_B = 0;
ADC0809_C = 0;
break;
}
case 2:
{
ADC0809_A = 0;
ADC0809_B = 1;
ADC0809_C = 0;
break;
}
case 3:
{
ADC0809_A = 1;
ADC0809_B = 1;
ADC0809_C = 0;
break;
}
case 4:
{
ADC0809_A = 0;
ADC0809_B = 0;
ADC0809_C = 1;
break;
}
case 5:
{
ADC0809_A = 1;
ADC0809_B = 0;
ADC0809_C = 1;
break;
}
case 6:
{
ADC0809_A = 0;
ADC0809_B = 1;
ADC0809_C = 1;
break;
}
case 7:
{
ADC0809_A = 1;
ADC0809_B = 1;
ADC0809_C = 1;
break;
}
default:break;
}
ST = 1;
ST = 0;
DS_NOP();
while(EOC == 0)
{
;
}
if(EOC == 1)
{
OE = 1;
ADCdata = P0;
return (ADCdata);
}
}
/*******************************************************
电压测量并装换成实际的电压值
入口参数: AD_ChannelNumber 输入通道号:在0-7之间选择
出口参数: 转换后的电压值,实际的值
********************************************************/
float VoltageSurvey(unsigned char AD_ChannelNumber)
{
float SurveyVoltage; //测量到的电压值
float plus_ch; //通道增益
switch(AD_ChannelNumber)
{
case 0: plus_ch = PLUS_CH0;break;
case 1: plus_ch = PLUS_CH1;break;
case 2: plus_ch = PLUS_CH2;break;
case 3: plus_ch = PLUS_CH3;break;
case 4: plus_ch = PLUS_CH4;break;
case 5: plus_ch = PLUS_CH5;break;
case 6: plus_ch = PLUS_CH6;break;
case 7: plus_ch = PLUS_CH7;break;
default:break;
}
SurveyVoltage = ADC0809test(AD_ChannelNumber);
SurveyVoltage = (SurveyVoltage / 256) * REF_Voltage * plus_ch;
return(SurveyVoltage);
}
//延时程序
void delay(unsigned int k)
{
unsigned int i,j;
for(i=k; i>0; i--)
{
for(j=255; j>0; j--);
}
}
/*
void enable() //写指令寄存器
{
RS = 0;
RW = 0;
E = 0;
dealy();
E = 1;
}
void write_com() //写命令程序
{
P1 = 0x01;
enable();
P1 = 0x02;
enable();
P1 = 0x07;
enable();
P1 = 0X0F;
enable();
P1 = 0x1f;
enable();
P1 = 0x30;
enable();
}
void write_data() //写数据寄存器
{
RS = 1;
RW = 0;
E = 0;
delay();
E = 1;
}
void enable(); //写数地址和数据到LCD
{
P1 = 0x80
enable();
P1 = r1;
write_data();
P1 = 0xc6;
enabke();
P1 = adc0809test(); //是ADC0809的驱动函数*
write_data();
P1 = 0xc7;
enable();
P1 = 'V';
write_data();
}
*/
/*主函数程序, LCD驱动函数*/
void main(void)
{
float OutVoltage;
unsigned int Adc0809CHx;
SCON = 0x50; // SCON: mode 1, 8-bit UART, enable rcvr
TMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit reload
TH1 = 221; // TH1: reload value for 1200 baud @ 16MHz
TR1 = 1; // TR1: timer 1 run
TI = 1; // TI: set TI to send first char of UART
while(1)
{
Adc0809CHx = 3;
OutVoltage = VoltageSurvey(Adc0809CHx);
printf("the CH%d",Adc0809CHx);
printf("Voltage is %1.3f\r\n",OutVoltage);
delay(100);
/*
if(Adc0809CHx < 7)
{
Adc0809CHx++;
}
else
{
Adc0809CHx = 0;
}
*/
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -