STC89C52单片机AD测试实验

发布者:lidong4069最新更新时间:2016-04-15 来源: eefocus关键字:STC89C5  2单片机  AD测试实验 手机看文章 扫描二维码
随时随地手机看文章
///////////////////////////////////////////////////////////////////////////

实现功能: 调节实验板上的标号为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);//把电压值显示到数码管上
 }
}

关键字:STC89C5  2单片机  AD测试实验 引用地址:STC89C52单片机AD测试实验

上一篇:STC89C52单片机AD测试实验
下一篇:STC89C52单片机蜂鸣器唱歌实验

推荐阅读最新更新时间:2024-03-16 14:50

EZ-USB FX2单片机CY7C68013的特性介绍
作者Email: cai_yang@etang.com 摘要:本文主要介绍Cypress Semiconductor公司的EZ-USB FX2单片机CY7C68013,该单片机是一个带USB2.0内核、8051兼容的单片机。 关键词:USB2.0 EZ-USB FX2 单片机 CY7C68013 1 介绍 Cypress Semiconductor公司的EZ-USB FX2是世界上第一款集成USB2.0的微处理器,它集成了USB2.0收发器、SIE(串行接口引擎)、增强的8051微控制器和可编程的外围接口。FX2这种独创性结构可使数据传输率达到56Mbytes/s,即USB2.0允许的最大带宽。在FX2中
[应用]
STC12C5A60S2单片机制作的锂电池容量测试源程序
去年做了一个89C52+ad0804的锂电池容量测试仪,没有成功,今年新买入了12C5A60S2,自带AD,开始着手再次制作。学习了很多论坛里高手的程序,由于水平有限,没有运用中断,只会利用1S延时,在开发板实验成功。放电可以仿照LM358电子负载+锂电池充电板,这样电路可以简单一些。 程序很简单,鉴于水平有限,如有问题还请各位多多指教。 /*--------------------------------------------------------------*/ #include STC12C5A60S2.H #include LCD5510_V3.H #include STC12ADC.C #define ui
[单片机]
STM32Note初识单片机(2)
本期主要介绍单片机核心--CPU的架构、组成及运作方式。 架构之争 目前微型计算机系统的架构主要有X86、MIPS、ARM、PowerPC、SPARC这几种,但市场上最常见的还是X86和ARM架构的,我们接下来以这两种为例了解下微型计算机体系结构,至于剩下几种如果读者有兴趣就只能自行百度了(任天堂、索尼PS、摩托罗拉了解一下)。 在了解X86和ARM架构之前,我们先介绍下复杂指令集CISC(Complex InstucTIon Set Computer)和精简指令集RISC(Reduced InstrucTIon Set Computer)。上期我们说过CPU运行是通过取指令完成的,根据CPU可执行指令我们分成CISC和R
[单片机]
STM32Note初识<font color='red'>单片机</font>(<font color='red'>2</font>)
基于使用STM8单片机I2C方式实现读写操作
STM8硬件I2C知识 STM8S的I2C模块不仅可以接收和发送数据,还可以在接收时将数据从串行转换成并行数据,在发送时将数据从并行转换成串行数据。可以开启或禁止中断。接口通过数据引脚(SDA)和时钟引脚(SCL)连接到I2C总线。允许连接到标准(最高100kHz)或快速(最高400kHz)的I2C总线。 1.I2C的4种模式 ● 从设备发送模式 ● 从设备接收模式 ● 主设备发送模式 ● 主设备接收模式 2.I2C的主要特点 ● 并行总线/I2C总线协议转换器 ● 多主机功能:该模块既可做主设备也可做从设备 ●I2C主设备功能 ─ 产生起始和停止信号 ●I2C从设备功能 ─ 可编程的I2C 地址检测 ─ 停止位检测 ●
[单片机]
基于使用STM8<font color='red'>单片机</font>I<font color='red'>2</font>C方式实现读写操作
瑞萨日本MCU工厂遭雷击,最高或损失2周产量
7月6日,瑞萨电子在一份声明中表示,日本时间7月5日上午5时43分,由于第4号台风“艾利(Aere)”引发的暴雨,该公司位于熊本县熊本市川尻工厂的一条输电线被雷电击中,瞬时电压下降,导致该工厂的生产设备暂停生产,最高损失大约2周的 产量 。据悉,该公司川尻工厂主要生产低端MCU。 针对瞬时电压下降,瑞萨一直在实施应急措施,如安装不间断电源(UPS)。但此次电压下降持续的时间比过去十年中的任何事故以及该公司所做的任何预估都要长,导致川尻工厂大约90%的生产设备暂时停产。 瞬时电压下降预计会影响川尻工厂正在生产的产品,最高损失大约2周的产量,但瑞萨正努力恢复生产。瑞萨正在重启川尻工厂的生产设备,部分生产流程已于7月6日恢复运行
[汽车电子]
瑞萨日本<font color='red'>MCU</font>工厂遭雷击,最高或损失<font color='red'>2</font>周产量
Laird SimpleLink SaBLE-x-R2蓝牙5模块携手TI无线微控制器
电子网消息,专注于新产品引入 (NPI) 并提供极丰富产品类型的业界顶级半导体和电子元器件分销商贸泽电子 (Mouser Electronics),宣布即日起开始备货Laird Technologies的SaBLE-x-R2蓝牙® 5模块。SaBLE-x-R2 模块采用初始版SaBLE-x模块经过现场验证的硬件,缩短了系统开发时间,可以为物联网 (IoT) 传感器实现领先的低能耗蓝牙连接,为商业、医疗和工业应用实现信标技术。 贸泽电子备货的Laird SaBLE-x-R2模块采用外部或PCB引线天线,其传输范围、速度和吞吐率完全符合蓝牙5规范,并针对应用目标和OTA能力扩展了闪存容量。此独立模块采用Texas Instrume
[半导体设计/制造]
单片机I2C驱动程序
void delay() {; ;} void delay1ms ( uint z ) { uint x, y; for ( x = z; x 0; x -- ) for ( y = 110; y 0; y -- ); } I2C启动:在SCL为高电平期间,SDA出现下降沿 void start_I2C ( ) / { sda = 1; delay (); scl = 1; delay (); sda = 0; delay (); } I2C停止:在SCL高电平期间,SDA上产生一上升沿 void stop_I2C () //停止 { sda = 0; delay (); scl = 1; delay ();
[单片机]
<font color='red'>单片机</font>I<font color='red'>2</font>C驱动程序
51单片机 I2C AT24C02
I2C协议在项目开发中使用很常见,很多存储芯片使用I2C接口。由于51单片机没有I2C接口,这里使用IO口模拟I2C通讯协议,来完成I2C芯片驱动。使用的I2C芯片为AT24C02。 原理图如下: 代码如下: //程序功能:计时器每一秒向AT24C02保持数据,同时数码管显示,重启之后读取出数据接着计时,100S循环 //程序问题:无法写入 #include #define uint unsigned int #define uchar unsigned char //变量定义 uint timer_flag; //用于判断定时器T0方式一是否计满1s u
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved