新闻中心

EEPW首页>嵌入式系统>设计应用> STC89C52单片机AD测试实验

STC89C52单片机AD测试实验

作者: 时间:2016-11-21 来源:网络 收藏
///////////////////////////////////////////////////////////////////////////

实现功能: 调节实验板上的标号为AD0的电位器改变电压,通过PCF8591的采集,把
数据传输给单片机,单片机通过处理把采集到的电压值,显示在数码管
上,注意所采用的通道为第0通道,也就是说调节的是AD0电位器
实验板型号:BS-XYD-C52
实验名称:AD测试实验
编写人:谢应东
编写日期:2012-4-30
///////////////////////////////////////////////////////////////////////////
#include //包含5 2单片机头文件
#include //包含标准输入输出文件

本文引用地址://m.amcfsurvey.com/article/201611/319237.htm

#define uchar unsigned char//宏定义这个谁都知道的
#define uint unsigned int

uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴数码管1至F数字编码

sbit duan=P2^6;//573锁存器段锁存端
sbit wei=P2^7;//位锁存端

sbit sda=P2^0;//定义模拟IIC总线的数据线
sbit scl=P2^1;//定义模拟IIC总线的时钟线

float val;
///////////////////////////////////////////////////////////////////////////
函数名称:毫秒延时函数
函数功能:实现毫秒级的延时
参数介绍:Delay_MS: 定义需要延时的毫秒的数值
iNumber: 记录Delay_MS的数值,以for语句实现所要求的延时
iValue: 要延时毫秒所要进行的循环数值,本数值为实际测得
返回值:
注意事项:本实验是在所用晶振为12M的前提下实现的毫秒延时,本函数是通过循环的形
式完成,所以如果改变了晶振的频率,请做相应的改变
///////////////////////////////////////////////////////////////////////////
void DelayMs(uint Delay_MS)
{
uint iNumber,iValue;
for(iNumber=0;iNumber {
iValue=107;
while(iValue--);
}
}
///////////////////////////////////////////////////////////////////////////
函数名称:DelayUs
函数功能:延时几个微秒(us),用来IIC总线延时
参数介绍:无
返回值:
注意事项:无
///////////////////////////////////////////////////////////////////////////
void DelayUs()
{;;}
///////////////////////////////////////////////////////////////////////////
函数名称:Display_V
函数功能:把通过PCF8591采集到的数据,在单片机处理完之后,显示在数码管上
参数介绍:cBai:要显示在第一个数码管上的数字
cShi:要显示在第二个数码管上的数字
cGe:要显示在第三个数码管上的数字
返回值:
注意事项:注意实验板上所要用到底的数码管为共阴极的数码管
///////////////////////////////////////////////////////////////////////////
voidDisplay_V(uchar cBai,uchar cShi,uchar cGe)
{
duan=1;//打开数码管的段选
P0=table[cBai]|0x80;//送入相应的段选0x80是为了点亮数码管小数点(dp端)
duan=0;//关闭数码管的段选
P0=0xff;
wei=1;//打开数码管的位选
P0=0xfe;//给要点亮数码管的公共极低电平
wei=0;//关闭数码管的位选
DelayMs(5);//稳定时序

duan=1;//打开数码管的段选
P0=table[cShi];//送入相应的段选
duan=0;//关闭数码管的段选
P0=0xff;
wei=1;//打开数码管的位选
P0=0xfd;//给要点亮数码管的公共极低电平
wei=0;//打开数码管的位选
DelayMs(5);//稳定时序

duan=1;//打开数码管的段选
P0=table[cGe];//送入相应的段选
duan=0;//关闭数码管的段选
P0=0xff;
wei=1;//打开数码管的位选
P0=0xfb;//给要点亮数码管的公共极低电平
wei=0;//打开数码管的位选
DelayMs(5);//稳定时序
}
///////////////////////////////////////////////////////////////////////////
函数名称:Init_IIC
函数功能:完成对IIC总线数据线时钟线初始化
参数介绍:无
返回值:
注意事项:无
///////////////////////////////////////////////////////////////////////////
void Init_IIC()
{
sda=1;
scl=1;
}
///////////////////////////////////////////////////////////////////////////
函数名称:Start_IIC
函数功能:IIC总线的开始条件
参数介绍:无
返回值:
注意事项:具体请参考相关的文档
///////////////////////////////////////////////////////////////////////////
void Start_IIC()//开始条件
{
sda=1;
DelayUs();
scl=1;
DelayUs();
sda=0;
}
///////////////////////////////////////////////////////////////////////////
函数名称:Stop_IIC
函数功能:IIC总线的终止条件
参数介绍:无
返回值:
注意事项:具体请参考相关的文档
///////////////////////////////////////////////////////////////////////////
void Stop_IIC()
{
sda=0;
DelayUs();
scl=1;
DelayUs();
sda=1;
DelayUs();
}
///////////////////////////////////////////////////////////////////////////
函数名称:Response_IIC
函数功能:IIC总线的应答条件
参数介绍:cNumber: 定义一个延时的变量
返回值:
注意事项:具体请参考相关的文档
///////////////////////////////////////////////////////////////////////////
void Response_IIC()//
{
uchar cNumber=0;
scl=1;
DelayUs();
while((sda==1)&&(cNumber<255))
cNumber++;//加一个等待时间防止程序一直处在检测状态
scl=0;//这个是应答和非应答综合的应答条件
DelayUs();
}
///////////////////////////////////////////////////////////////////////////
函数名称:Write_byte
函数功能:通过IIC总线向PCF8591写入一个字节
参数介绍:cData:要写入的字节的值
cNumber: 定义for语句中用到的变量,因为IIC总线是一位一位写入的,所
以需要循环8次
cTempValue: 临时的一个变量
返回值:
注意事项:具体请参考相关IIC文档
///////////////////////////////////////////////////////////////////////////
void Write_byte(uchar cData)
{
uchar cNumber,cTempValue;
cTempValue=cData;
for(cNumber=0;cNumber<8;cNumber++) //循环8次,完成一个字节的写入
{
cTempValue=cTempValue<<1; //CY=cTempValue^7;
scl=0;
DelayUs();
sda=CY;//CY 进位标志位
DelayUs();
scl=1;
DelayUs();
}
scl=0;
DelayUs();
sda=1;
DelayUs();
}
///////////////////////////////////////////////////////////////////////////
函数名称:Read_byte
函数功能:通过IIC总线,从器件里读取一个字节,因为必须是一位一位读,所以需要
循环8次
参数介绍:cNumber:for句用到的循环变量
返回值:cValue:返回读取到的字节
注意事项:请参考相应的文档
///////////////////////////////////////////////////////////////////////////
uchar Read_byte()
{
uchar cNumber=0,cValue=0;
scl=0;
DelayUs();
sda=1;
DelayUs();
for(cNumber=0;cNumber<8;cNumber++) //完成对一个字节的读取
{
scl=1;
DelayUs();
cValue=(cValue<<1)|sda;//通过循环得到一个字节
scl=0;
DelayUs();
}
return cValue;//返回读取到的字节
}
///////////////////////////////////////////////////////////////////////////
函数名称:Read_channel
函数功能:选取PCF8591的AD输入通道,然后再读出采集到数值,即电压值
参数介绍:无
返回值:cValue:返回采集到的数据
注意事项:无
///////////////////////////////////////////////////////////////////////////
uchar Read_channel(uchar cChannel)//PCF通道选择函数
{
uchar cValue;//从这个通道读出数据是大多数学习者
Start_IIC();//比较模糊的地方
Write_byte(0x90);//这个时序请按照AT24C02的任意读时序图进行操作
Response_IIC();
Write_byte(0x40|cChannel);
Response_IIC();
Start_IIC();
Write_byte(0x91);//给IIC器件写入相应的命令
Response_IIC();
cValue=Read_byte();//读取采集到的数据
Stop_IIC();

return cValue;//返回采集到的数据
}
///////////////////////////////////////////////////////////////////////////
函数名称:main
函数功能:完成对采集到的电压值的处理,然后显示到前三个数码管上
参数介绍:cBai:因为把数分离,才能显示到数码管上,作为分离后显示在第一个数
码管上的数
cShi:显示在第二个数码管上的数
cGe:显示在第三个数码管上的数
iTempValue:临时变量,赋予从PCF8591通道0读出来的数值
返回值:
注意事项:无
///////////////////////////////////////////////////////////////////////////
void main()
{
uchar cBai,cShi,cGe;
int iTempValue;
Init_IIC();//IIC总线初始化
while(1) //大循环是用来不停地扫描PCF8591的数据变换
{
iTempValue=Read_channel(0);//从PCF8591通道0读出来的数值
val=(float)iTempValue/51; //要把num强制转换为float型进行计算
cBai=iTempValue/51;//下面这三个分离是把从通道读取到的数值转换为电压
cShi=iTempValueQ*10/51; //想一下5V为255那么1v是不是代表51
cGe=iTempValueQ*10Q*10/51;//1.8v是不是数值92
Display_V(cBai,cShi,cGe);//把电压值显示到数码管上
}
}



评论


技术专区

关闭