📄 adc0832.c
字号:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/*******LCD口线定义*******/
#define LCD_DATA P0 //定义数据线D0-D7
sbit LCD_RS=P1^0; //定义寄存器选择位
sbit LCD_RW=P1^1; //定义读写信号线位
sbit LCD_E=P1^2; //定义使能信号位
sbit LCD_BUSY=LCD_DATA^7;//检测LCD状态字中BUSY标识
/*******ADC0832口线定义*******/
sbit AD_CLK=P3^6;
sbit AD_CS=P2^0;
sbit AD_DI=P3^7;
/*******通道定义*******/
sbit CH1=P3^0;
sbit CH2=P3^1;
/*******函数申明*******/
void LCD_Init(void);
void LCD_Write_Data(uchar dat);
void LCD_Write_Cmd(uchar cmd,BusyC);
void LCD_Disp_Char(uchar X,uchar Y,uchar DData);
void LCD_Disp_String(uchar X,uchar Y,uchar code *DData);
void LCD_Delay(uint ms);
uchar LCD_Check_Busy(void);
uchar readadc(void);
uchar code disptab[]={'0','1','2','3','4','5','6','7','8','9'};//字符代表码;
uchar code a_1[]={"WILLAR"};
uchar code a_2[]={"DIGITAL"};
uchar code a_3[]={"VOLTMETER"};
uchar code dispstring1[]={"VOLTAGE:"};
uchar code channel[]={"INPUT"};
uchar code channel2[]={"CHANNEL"};
/*******LCD函数部分*******/
void LCD_Init(void)
{
LCD_DATA=0;
LCD_Write_Cmd(0x38,0); //三次显示模式设置,不检测忙信号
LCD_Delay(5);
LCD_Write_Cmd(0x38,0);
LCD_Delay(5);
LCD_Write_Cmd(0x38,0);
LCD_Delay(5);
LCD_Write_Cmd(0x38,1); //显示模式设置,开始要求检测忙信号:8位、2行、5X7点阵
LCD_Write_Cmd(0x08,1); //关闭显示
LCD_Write_Cmd(0x01,1); //清屏
LCD_Write_Cmd(0x06,1); //显示光标移动设置:文字不动,光标自动右移
LCD_Write_Cmd(0x0C,1); //显示开及光标设置:光标关、光标不闪烁
}
void LCD_Write_Cmd(uchar cmd,BusyC)
{
if(BusyC) LCD_Check_Busy();
LCD_DATA=cmd;
LCD_RS=0;
LCD_RW=0;
LCD_E=0;
LCD_Delay(5);
LCD_E=1;
}
void LCD_Write_Data(uchar dat)
{
LCD_Check_Busy();
LCD_DATA=dat;
LCD_RS=1;
LCD_RW=0;
LCD_E=0;
LCD_Delay(5);
LCD_E=1;
}
void LCD_Disp_Char(uchar X,uchar Y,uchar DData)
{
Y &=0x01;
X &=0x0F;
if(Y) X|=0x40;
X|=0x80;
LCD_Write_Cmd(X,0);
LCD_Write_Data(DData);
}
void LCD_Disp_String(uchar X,uchar Y,uchar code *DData)
{
uchar StringLength;
StringLength=0;
Y &=0x01;
X &=0x0F;
while(DData[StringLength]>0x20)
{
if(X<=0x0F)
{
LCD_Disp_Char(X,Y,DData[StringLength]);
StringLength++;
X++;
}
}
}
uchar LCD_Check_Busy(void)
{
LCD_DATA=0xFF;
LCD_RS=0;
LCD_RW=1;
LCD_E=0;
LCD_Delay(5);
LCD_E=1;
while(LCD_DATA & 0x80);
return(LCD_DATA);
}
void LCD_Delay(uint ms)
{
uchar i;
while(ms--)
{
for(i=0;i<250;i++);
}
}
/*******ADC0832函数部分*******/
uchar readadc1(void)
{
uchar dat,i;
AD_CS=1; //芯片复位
AD_CLK=0;
_nop_();
AD_CS=0; //CS拉低,启动A/D转换
_nop_();
AD_DI=1; //启动标志位
AD_CLK=1; //第一个脉冲
_nop_();
AD_DI=0; //在负跳变之前加一个DI反转操作
AD_CLK=0;
AD_DI=1; //配置位1,单通道/差分输入选择
_nop_();
AD_CLK=1; //第二个脉冲
_nop_();
AD_CLK=0;
AD_DI=0; //配置位2
_nop_();
AD_CLK=1; //第三个脉冲
_nop_();
AD_CLK=0;
AD_DI=1;
_nop_(); //空闲位
AD_CLK=1; //第四个脉冲
for(i=0;i<=8;i++){ //读出8字节数据
dat=dat<<1;
_nop_();
AD_CLK=1; //这里要先1后0...如果是先0后1则输出结果错误...
if(AD_DI){
dat|=0x01;
}
_nop_();
AD_CLK=0;
}
AD_CS=1; //关闭芯片
return(dat); //返回数据
}
uchar readadc2(void)
{
uchar dat,i;
AD_CS=1; //芯片复位
AD_CLK=0;
_nop_();
AD_CS=0; //CS拉低,启动A/D转换
_nop_();
AD_DI=1; //启动标志位
AD_CLK=1; //第一个脉冲
_nop_();
AD_DI=0; //在负跳变之前加一个DI反转操作
AD_CLK=0;
AD_DI=1; //配置位1,单通道/差分输入选择
_nop_();
AD_CLK=1; //第二个脉冲
_nop_();
AD_CLK=0;
AD_DI=1; //配置位2
_nop_();
AD_CLK=1; //第三个脉冲
_nop_();
AD_CLK=0;
AD_DI=1;
_nop_(); //空闲位
AD_CLK=1; //第四个脉冲
for(i=0;i<=8;i++){ //读出8字节数据
dat=dat<<1;
_nop_();
AD_CLK=1; //这里要先1后0...如果是先0后1则输出结果错误...
if(AD_DI){
dat|=0x01;
}
_nop_();
AD_CLK=0;
}
AD_CS=1; //关闭芯片
return(dat); //返回数据
}
/*******主函数部分*******/
void main(void)
{
uint dat1,dat2;
LCD_Delay(400);
LCD_Init();
LCD_Disp_String(1,0,a_1);
LCD_Disp_String(8,0,a_2);
LCD_Disp_String(4,1,a_3);
LCD_Delay(1000);
LCD_Init();
LCD_Disp_String(1,0,channel);
LCD_Disp_String(7,0,channel2);
LCD_Disp_String(2,1,dispstring1);
LCD_Disp_Char(11,1,'.');
LCD_Disp_Char(14,1,'V');
while(1)
{
while(!CH1)
{
dat1=readadc1()/0.51;
LCD_Disp_Char(15,0,'0');
LCD_Disp_Char(10,1,disptab[dat1/100]);
LCD_Disp_Char(12,1,disptab[(dat1%100)/10]);
LCD_Disp_Char(13,1,disptab[dat1%10]);
LCD_Delay(400);
}
while(!CH2)
{
dat2=readadc2()/0.51;
LCD_Disp_Char(15,0,'1');
LCD_Disp_Char(10,1,disptab[dat2/100]);
LCD_Disp_Char(12,1,disptab[(dat2%100)/10]);
LCD_Disp_Char(13,1,disptab[dat2%10]);
LCD_Delay(400);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -