STC89C52单片机AD测试实验

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

实现功能: 调节实验板上的标号为AD0的电位器改变电压,通过PCF8591的采集,把
     数据传输给单片机,单片机通过处理把采集到的电压值,显示在数码管
     上,同时把通过AD0采集到的数据重新写入PCF8591,让其转换成模拟信
     号,改变开发板上D11的亮暗程度,注意所采用的通道为第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;      //返回采集到的数据
}
////////////////////////////////////////////////////////////////////////////

函数名称:Write_Data
函数功能:把要写入的数据写入PCF8591,让其开始转换,然后输出相应的模拟值
参数介绍:cData:要写入PCF8591的数据
返回值: 
注意事项:无
////////////////////////////////////////////////////////////////////////////
void Write_Data(uchar cData)
{
 Start_IIC();  //以下严格按照PCF8591写时序图
 Write_byte(0x90); //进行操作
 Response_IIC(); 
 Write_byte(0x40);
 Response_IIC();
 Write_byte(cData);
 Response_IIC();
 Stop_IIC();
}
////////////////////////////////////////////////////////////////////////////
函数名称:main
函数功能:完成对采集到的电压值的处理,然后显示到前三个数码管上,把采集到的
    数据同时写入PCF8591里,让其转换成模拟信号,改变发光二极管D11的亮
    暗程度
参数介绍: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);//把电压值显示到数码管上
  Write_Data(iTempValue);//把采集到数据写到PCF8591,让其转换成模拟信号
 }
}

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

上一篇:STC89C52单片机UART AD DA测试实验
下一篇:STC89C52单片机AD测试实验

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

7个基于STM32单片机的精彩设计实例
  STM32单片机   STM32是ST公司推出的基于ARM-Cortex-M3内核的32位单片机。      STM32单片机的架构优势   除新增的功能强化型外设接口外,STM32互连系列还提供与其它STM32微控制器相同的标准接口,这种外设共用性提升了整个产品家族的应用灵活性,使开发人员可以在多个设计中重复使用同一个软件。新STM32的标准外设包括10个定时器、两个12位1-Msample/s 模数转换器 (交错模式下2-Msample/s)、两个12位数模转换器、两个I2C接口、五个USART接口和三个SPI端口。新产品外设共有12条DMA通道,还有一个CRC计算单元,像其它STM32微控制器一样,支持96位唯一标
[单片机]
7个基于STM32<font color='red'>单片机</font>的精彩设计实例
初步认识51单片机-2.2单片机控制LCD1602液晶显示模块
上面学的两招,控制IO和延时,在这里要举的第一个例子就是LCD1602。LCD1602什么意思,表示一行可以显示16个字符,一共有两行。先来个LCD1602的简单介绍,1602LCD主要技术参数: 显示容量:16 2个字符 芯片工作电压:4.5 5.5V 工作电流:2.0mA(5.0V) 模块最佳工作电压:5.0V 字符尺寸:2.95 4.35(W H)mm 引脚功能说明 1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表1所示: 第1脚:VSS为地电源。 第2脚:VDD接5V正电源。 第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产
[单片机]
初步认识51<font color='red'>单片机</font>-2.2<font color='red'>单片机</font>控制LCD1602液晶显示模块
讲述如何实现单片机与触摸屏的通信
  随着触摸屏的应用和产量的增加,价格下降。因而有可能使用触摸屏作为单片机控制设备的键盘和显示装置,提高单片机控制设备的档次。触摸屏与PLC联合使用时,触摸屏的主要功能是:   ①显示PLC输入,输出端13或辅助继电器的开关状态。   ②用触摸按键强制PLC输入,输出端口或辅助继电器的开/关。   ③显示PLC中定时器、计数器和数据寄存器的内容。   ④用触摸屏键盘把设定数据送入PLC的数据寄存器中。   可规纳成触摸屏与PLC问对应地址的数据位、字的读和写。因此可以利用MOD—BUS通信协议来实现触摸屏与单片机的通信和控制,或触摸屏与多台单片机通信,构成一个集散控制系统。    1 触摸屏与单片机的硬件联接   采
[单片机]
讲述如何实现<font color='red'>单片机</font>与触摸屏的通信
四维图新旗下杰发科技MCU家族迎来最强成员AC7840x成功点亮
近日,四维图新旗下杰发科技首款功能安全MCU– AC7840x提前回片,并成功启动点亮。AC7840x的到来,将全面提升汽车电子零部件的安全性,拓展国产MCU在汽车电子领域的应用,是杰发科技发展又一重要里程碑,也是杰发科技为实现“中国芯”的又一突破。 图:杰发科技AC7840x样片 图:验证工作进行中 目前,AC7840x验证工作正在紧张有序地进行,预计2022年年底正式量产。 AC7840x是基于ARM® Cortex-M4F内核的车规级MCU,符合ISO26262功能安全ASIL-B,支持AUTOSAR V4.3,提供MCAL及配置工具;支持SHE,支持通信加密及安全启动,并且拥有更大Flash与更多的引脚。 在车用芯
[手机便携]
四维图新旗下杰发科技<font color='red'>MCU</font>家族迎来最强成员AC7840x成功点亮
基于51单片机最小系统点亮一个灯的程序
51单片机最小系统 今天我们开始进行51单片机编程学习,首先我们要了解一下单片机工作需要的基本条件。前面的内容中我们知道了51单片机的引脚有电源引脚,时钟引脚,控制引脚,以及通用输入输出端口。那要怎样才能让单片机工作呢? 如果将单片机与人类比,那它的电源就像人的心脏;时钟信号就像人的脉搏;控制引脚就如人的五官;通用端口就如人的四肢;芯片内部的控制逻辑就如我们的神经系统。这么说的话我们就很容易确定单片机的最小系统了吧。首先我们需要给单片机供电,再给他提供时钟,然后配置它的控制电路,最后给它的引脚接上一些外部电路,据此我们就可以绘制出下图这个最小系统电路了。 例程实图 以上最小系统电路图中使用的是89C51单片机,因为它的功能
[单片机]
基于51<font color='red'>单片机</font>最小系统点亮一个灯的程序
SPWM波在单片机上的实现与调节(基于MSP430F5529)
SPWM波的定义和生成方法在这里就不多说了,本文主要说SPWM波在单片机上的实现,以及如何调节滤出后的正弦波的频率及幅度。 先弄清楚SPWM在单片机上如何产生,比如你要输出100HZ的SPWM正弦波,每个周期100个点,则定时器B的中断频率为100*100=10K,用于载波(定时器A)的PWM频率应 =10K(这里我建议载波为1M,因为定时器的配合问题会有+-1的误差,所以载波尽量的大则滤出的正弦波的波形越好)。 通过软件,你先得到100个点的正弦波采样值,你可以用定时器A来产生1MHZ的PWM,然后用定时器B,做定时器中断,10KHZ的频率,每次中断,就把一个采样值赋值给定时器A的输出通道:CCRx。然后不停的循环,每中断一
[单片机]
51单片机学习感悟与51单片机上拉电阻心得
1、我从不说51是基础,如果我这么说,也请把这句话理解为微机原理是基础。 2、对51单片机的操作本质上就是对寄存器的操作,对其他单片机也是如此。库只是一个接口,方便使用者使用而已。 3、汇编语言在工作中很少用到,了解就好。 4、51单片机的P0口很特别。 5、C语言就是C语言,51单片机就是51单片机,算法就是算法,外围电路就是外围电路,传感器就是传感器,通信器件就是通信器件,电路图就是电路图,PCB图就是PCB图,仿真就是仿真。 当你以后再也不使用51了,C语言的知识还在,算法的知识还在,搭建单片机的最小系统的技能还在,传感器和通信器件的使用方法还在,还会画电路图和PCB图,当然也会仿真。 6、51单片机
[单片机]
80C51单片机中断的编程使用方法介绍
1、单片机中断: 找了一张 80C51 单片机的图如下: 其中,在 P3.2、P3.3 的位置,即 12 ,13 引脚处,标有 INT0 和 INT1,那两个引脚就是外部中断的输入。上面一个横杠代表低电平有效,给 P3.2、P3.3 赋值 0,就可以运行已经写好的中断服务程序。具体怎么用,还要熟悉一些中断寄存器的使用。 2、中断寄存器: (1)、IE (Interrupt Enable):中断允许控制寄存器 EA (IE.7):EA=0 时,所有中断禁止(即不允许中断) EA=1 时,各中断的产生由个别的允许位决定 ET2 (IE.5):定时器 2 溢出中断允许(8052 用,博主用的 STC89C54RD+ 也有) ES
[单片机]
80C51<font color='red'>单片机</font>中断的编程使用方法介绍
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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