您的位置 首页 解答

STC89C52单片机AD测验试验

实现功能:调节实验板上的标号为AD0的电位器改变电压,通

///////////////////////////////////////////////////////////////////////////

完结功用: 调理试验板上的标号为AD0的电位器改动电压,经过PCF8591的收集,把
数据传输给单片机,单片机经过处理把收集到的电压值,显现在数码管
上,留意所选用的通道为第0通道,也就是说调理的是AD0电位器
试验板类型:BS-XYD-C52
试验称号:AD测验试验
编写人:谢应东
编写日期: 2012-4-30
///////////////////////////////////////////////////////////////////////////
#include //包括52单片机头文件
#include//包括规范输入输出文件

#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:要显现在第三个数码管上的数字
回来值:
留意事项:留意试验板上所要用究竟的数码管为共阴极的数码管
///////////////////////////////////////////////////////////////////////////
void Display_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);//把电压值显现到数码管上
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/jieda/262885.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部