第15章 采用ADC0832的两路电压表设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CLK=1;_nop_();_nop_();_nop_();_nop_();//产生第1个CLK时钟脉冲
CLK=0;_nop_();_nop_();_nop_();_nop_();
DIO=1;_nop_();_nop_();_nop_();_nop_();//写SGL位
CLK=1;_nop_();_nop_();_nop_();_nop_();//产生第2个CLK时钟脉冲
// LCD1602初始化函数
{ delay_ms(20);
Wr1602Cmd(0x38);
delay_ms(5);
Wr1602Cmd(0x38);
delay_ms(5);
Wr1602Cmd(0x06);
Wr1602Cmd(0x0c);
Wr1602Cmd(0x01); //清屏
Wr1602Cmd(0x80); //设置地址
//第二路电压显示引脚
CH3
i=RdAdc0832(1);
//读取Adc0832 1通道的值
i=(i*5000/255);
Wr1602Dat('C');
//显示Adc0832 1通道的值
Wr1602Dat('H');
Wr1602Dat('1');
Wr1602Dat('=');
Wr1602Dat('0'+i/1000);
}
CS=1;
// Adc0832片选失效
return (value0==value1) ? value0:0x00;
//如果MSB->LSB和LSB->MSB读取的结果相同则返回读
取的结果,否则返回0
}
void main()
//主程序
{ unsigned long i;
Init1602();
while(1)
2
15.2 硬件设计
图15-2 用ADC0832设计的两路电压表的电路原理图
3
15.3 程序设计
#include<reg52.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int #define IO_1602 P0//IO口 sbit RS_1602=P2^0; // 1602RS引脚接P2.0 sbit RW_1602=P2^1; //1602R/W引脚接P2.1 sbit E_1602=P2^2; //1602E引脚接P2.2 sbit CS=P1^0; //ADC0832片选引脚接P1.0 sbit CLK=P1^1; //ADC0832CLK引脚接P1.1 sbit DIO=P1^2; //ADC0832DI、DO引脚接P1.2 void delay_ms(unsigned int t)//延时子函数晶振 11.0592MHz,延时1ms { uchar x,y; for(t;t>0;t--) { for(x=0;x<114;x++) for(y=0;y<1;y++); } } void Wr1602Cmd(unsigned char dat) //LCD1602写命令 函数 { E_1602=0; IO_1602=dat; RS_1602=0; RW_1602=0; E_1602=1; delay_ms(1); E_1602=0; delay_ms(1); }
CLK=0;_nop_();_nop_();_nop_();_nop_();
DIO=Hx;_nop_();_nop_();_nop_();_nop_();//写通道号位
4
15.3 程序设计
CLK=1;_nop_();_nop_();_nop_();_nop_();//产生第3个
CLK时钟脉冲
CLK=0;_nop_();_nop_();_nop_();_nop_();
的数据向低位移动一位
if(DIO==1)value1|=0x80;
//当前CLK时钟脉冲接收
的数据置位或清零
else value1&=0x7f;
CLK=1;_nop_();_nop_();_nop_();_nop_();//产生第12~19
个CLK时钟脉冲
CLK=0;_nop_();_nop_();_nop_();_nop_();
void Wr1602Dat(unsigned char dat)// LCD1602写数据函数
{ E_1602=0;
IO_16ห้องสมุดไป่ตู้2=dat;
RS_1602=1;
RW_1602=0;
E_1602=1;
delay_ms(1);
E_1602=0;
delay_ms(1);
}
void Init1602(void)
第15章 采用ADC0832的两路电压表设计
15.1 项目任务 15.2 硬件设计 15.3 程序设计 15.4 仿真与实验结果
1
15.1 项目任务
利用单片机STC89C52与ADC0832设计一个两路电压表,可以 将两路0~5V之间的模拟直流电压值转换成数字量信号,在 LCD1602液晶显示器上实时显示。
DIO=1;
for(i=0;i<8;i++)
// 第4~11个CLK时钟脉冲,
下降沿读取数据
{ CLK=1;_nop_();_nop_();_nop_();_nop_();//产生第4~
11个CLK时钟脉冲
CLK=0;_nop_();_nop_();_nop_();_nop_();
value0<<=1;
图15-5 ADC0832两路电压表实物
7
//上一个CLK时钟脉冲接收的
数据向高位移动一位
if(DIO==1)value0|=0x01;
//当前CLK时钟脉冲接
收的数据置位或清零
else value0&=0xfe;
}
for(i=0;i<8;i++)
//第12~19个CLK时钟脉冲,
下降沿读取数据
{ value1>>=1;
//上一个CLK时钟脉冲接收
Wr1602Dat('.');
Wr1602Dat('0'+i%1000/100);
Wr1602Dat('0'+i%1000%100/10);
Wr1602Dat('0'+i%1000%100%10);
Wr1602Dat('V');
}
}
5
15.4 仿真与实验结果
图15-4 仿真结果
6
15.4 仿真与实验结果
{Wr1602Cmd(0x80+0x03);
i=RdAdc0832(0);
//读取Adc0832 0通道的
值
i=(i*5000/255);
Wr1602Dat('C');
//显示Adc0832 0通道的
值
Wr1602Dat('H');
Wr1602Dat('0');
Wr1602Dat('=');
Wr1602Dat('0'+i/1000);//个位
Wr1602Dat('.');
Wr1602Dat('0'+i%1000/100); //小数点后一位
Wr1602Dat('0'+i%1000%100/10); //小数点后两位
Wr1602Dat('0'+i%1000%100%10); //小数点后三位
Wr1602Dat('V');
Wr1602Cmd(0xC0+0x03);
}
uchar RdAdc0832(bit Hx)
//ADC0832工作时序程序
{ uchar value0,value1,i;
CS=1;
CLK=0;
DIO=1;
CS=0;
// Adc0832片选有效
DIO=1;_nop_();_nop_();_nop_();_nop_();//写Start Bit位