/************STC12C5A60S2单片机 PCF8591 AD DA转换实验**************

程序功能:PCF8591模块测试

开发环境:Keil3

硬件环境:CEPARK多功能开发学习板/实验箱(2013版),STC12C5A60S2,11.0592M晶振
  
接线说明:单片机P36接底板JP68.具体为:SCL——P37 ,SDA——P36

跳线说明:J3,J66

实验现象:打开上位机软件。打开串口,串口号从设备管理器中查看。波特率设为115200. 
 打开 AD 转换,打开DA 转换。

AD转换测试时
上位机选择一个转换通道,跳接对应的J63上的跳线,调节可调电阻,上位机显示转换后的相应数值。 
DA转换测试时 
调节滑动条,改变输入的数字量。模块上的LED 指示灯亮度相应改变。

******************************************************************/

#include "STC12C5A.h"
#include "PCF8591_STC12C5A.h"

uint ii;
ulong ad_result=0;
uchar pcf8591_adchannel=0;

uchar da_val=0;

//*************** 函数定义 ******************
void delay1ms(unsigned int j);

void senddata_uart0(uchar dc);
void sendstring_uart0(uchar *dd);
void senduint_uart0(uint dd,uchar* dec_hex);

//*************** 主程序 ********************
void main(void)
{
  //将这段代码嵌入到程序中
  if((PCON&0x10)==0)  //如果POF位=0
  {
    PCON=PCON|0x10;   //将POF位置1
    IAP_CONTR|=0x60;  //软复位,从ISP监控区启动
  }
  else
  {
    PCON=PCON&0xef;   //将POF位清零
  }

SCON=0x50;         //uart0方式1,允许接收 
  AUXR=BRTR|S1BRS|BRTx12; //独立波特率发生器时钟为1T,uart0使用并启动独立波特率发生器
  BRT=0xfd;          //设置独立波特率发生器波特率  115200bps
  ES=1;              //uart0中断允许
  EA=1;              //中断总允许

delay1ms(12000);
  sendstring_uart0("***          STC12C5A60S2         ***\r\n");
  sendstring_uart0("***     PCF8591 AD DA转换实验     ***\r\n");
  sendstring_uart0("***      2013年1月9日8:29:16      ***\r\n");

for(ii=0;ii<256;ii++)
  {
    pcf8591_da_write(ii);
    delay1ms(60);
  }

delay1ms(8000);
  for(ii=254;ii!=0;ii--)
  {
    pcf8591_da_write(ii);
    delay1ms(60);
  }

while(1)
  {
    pcf8591_ad_write(0x40+pcf8591_adchannel);
    ad_result=pcf8591_ad_read();

ad_result=(ad_result*5000)/256;
    sendstring_uart0("pcf8591_adchannel");
    senduint_uart0(pcf8591_adchannel,"1d");
    sendstring_uart0("=");

senduint_uart0(ad_result/1000,"1d");
    sendstring_uart0(".");
    senduint_uart0(ad_result%1000,"3d");
    sendstring_uart0("V  ");

pcf8591_da_write(da_val);
    sendstring_uart0("pcf8591_da=0x");
    senduint_uart0(da_val,"2h");
    sendstring_uart0("\r\n");

delay1ms(3800);
  }
}

//uart interrupt
void uart0(void) interrupt 4
{
  uchar tc[2];

uint m=0;
  uint count=0;

EA=0;
  if(RI)
  {
    while(count<10000)
    {
      if(RI)
      {
        RI=0;
        if(m<2)
        {
          tc[m]=SBUF;
        }
        m++;
        count=0;
      }
      else                //循环等待10000次,没有接收到数据退出while循环
      {
        count++;
      }
    }
  }

if(1==m)
  {
    if(0xaa==tc[0])
    {
      IAP_CONTR=0x20;       //软复位,从用户程序区启动
    }
    else
    {
      senddata_uart0(tc[0]+1);    //将接收到的数据+1,再发送回去
    }
  }
  else if(2==m)
  {
    if(0x40==tc[0])
    {
      pcf8591_adchannel=tc[1]%4;
    }
    else if(0x50==tc[0])
    {
      da_val=tc[1];
    }
  }

EA=1;
}

//***************************发送数据**************************
void senddata_uart0(uchar dc)
{
  SBUF=dc;
  while (!TI);     //当TI=0时,发送未结束,循环等待
  TI=0;            //当TI=1时,发送结束,用软件将TI清零
}

//************************发送字符串数据***********************
void sendstring_uart0(uchar *dd)
{
  while ((*dd)!=0)
  {
    senddata_uart0(*dd);
    dd++;
  }
}

//******************以ascii码方式发送uint型数据*****************
void senduint_uart0(uint dd,uchar* dec_hex)
{
  uchar code asciitab[16]={
                            '0','1','2','3','4','5','6','7',
                            '8','9','A','B','C','D','E','F',
                          };
  if (dec_hex=="1d")
  {
    if (dd<10)
    {
      senddata_uart0((dd%10)+'0');
    }
    else if (dd<100)
    {
      senddata_uart0((dd%100/10)+'0');
      senddata_uart0((dd%10)+'0');
    }
    else if (dd<1000)
    {
      senddata_uart0((dd%1000/100)+'0');
      senddata_uart0((dd%1000%100/10)+'0');
      senddata_uart0((dd%10)+'0');
    }
    else if (dd<10000)
    {
      senddata_uart0((dd/1000)+'0');
      senddata_uart0((dd%1000/100)+'0');
      senddata_uart0((dd%1000%100/10)+'0');
      senddata_uart0((dd%10)+'0');
    }
    else
    {
      senddata_uart0((dd/10000)+'0');
      senddata_uart0((dd%10000/1000)+'0');
      senddata_uart0((dd%10000%1000/100)+'0');
      senddata_uart0((dd%10000%1000%100/10)+'0');
      senddata_uart0((dd%10)+'0');
    }
  }
  else if (dec_hex=="2d")
  {
    if (dd<100)
    {
      senddata_uart0((dd%100/10)+'0');
      senddata_uart0((dd%10)+'0');
    }
    else if (dd<1000)
    {
      senddata_uart0((dd%1000/100)+'0');
      senddata_uart0((dd%1000%100/10)+'0');
      senddata_uart0((dd%10)+'0');
    }
    else if (dd<10000)
    {
      senddata_uart0((dd/1000)+'0');
      senddata_uart0((dd%1000/100)+'0');
      senddata_uart0((dd%1000%100/10)+'0');
      senddata_uart0((dd%10)+'0');
    }
    else
    {
      senddata_uart0((dd/10000)+'0');
      senddata_uart0((dd%10000/1000)+'0');
      senddata_uart0((dd%10000%1000/100)+'0');
      senddata_uart0((dd%10000%1000%100/10)+'0');
      senddata_uart0((dd%10)+'0');
    }
  }
  else if (dec_hex=="3d")
  {
    if (dd<1000)
    {
      senddata_uart0((dd%1000/100)+'0');
      senddata_uart0((dd%1000%100/10)+'0');
      senddata_uart0((dd%10)+'0');
    }
    else if (dd<10000)
    {
      senddata_uart0((dd/1000)+'0');
      senddata_uart0((dd%1000/100)+'0');
      senddata_uart0((dd%1000%100/10)+'0');
      senddata_uart0((dd%10)+'0');
    }
    else
    {
      senddata_uart0((dd/10000)+'0');
      senddata_uart0((dd%10000/1000)+'0');
      senddata_uart0((dd%10000%1000/100)+'0');
      senddata_uart0((dd%10000%1000%100/10)+'0');
      senddata_uart0((dd%10)+'0');
    }
  }
  else if (dec_hex=="4d")
  {
    if (dd<10000)
    {
      senddata_uart0((dd/1000)+'0');
      senddata_uart0((dd%1000/100)+'0');
      senddata_uart0((dd%1000%100/10)+'0');
      senddata_uart0((dd%10)+'0');
    }
    else
    {
      senddata_uart0((dd/10000)+'0');
      senddata_uart0((dd%10000/1000)+'0');
      senddata_uart0((dd%10000%1000/100)+'0');
      senddata_uart0((dd%10000%1000%100/10)+'0');
      senddata_uart0((dd%10)+'0');
    }
  }
  else if (dec_hex=="5d")
  {
    senddata_uart0((dd/10000)+'0');
    senddata_uart0((dd%10000/1000)+'0');
    senddata_uart0((dd%10000%1000/100)+'0');
    senddata_uart0((dd%10000%1000%100/10)+'0');
    senddata_uart0((dd%10)+'0');
  }

else if (dec_hex=="2h")
  {
    if (dd<256)
    {
      senddata_uart0(asciitab[dd>>4]);
      senddata_uart0(asciitab[dd&0x0f]);
    }
    else
    {
      senddata_uart0(asciitab[dd>>12]);
      senddata_uart0(asciitab[(dd>>8)&0x000f]);
      senddata_uart0(asciitab[(dd>>4)&0x000f]);
      senddata_uart0(asciitab[dd&0x000f]);
    }
  }
  else if (dec_hex=="4h")
  {
    senddata_uart0(asciitab[dd>>12]);
    senddata_uart0(asciitab[(dd>>8)&0x000f]);
    senddata_uart0(asciitab[(dd>>4)&0x000f]);
    senddata_uart0(asciitab[dd&0x000f]);
  }
}

//*************************延时 n*1ms********************
void delay1ms(unsigned int j)
{
  unsigned int i;
  for (;j>0;j--)
  {
    for (i=0;i<124;i++)
    {;}
  }
}

PCF8591模块测试相关推荐

  1. stm32双向可控硅调压程序_单向可控硅和双向可控硅的测量与模块测试

    可控硅,是可控硅整流元件的简称,是一种具有三个PN结的四层结构的大功率半导体器件,亦称为晶闸管.具有体积小.结构相对简单.功能强等特点,是比较常用的半导体器件之一. 可控硅导通条件:一是可控硅阳极与阴 ...

  2. 对于150kHz导航信号放大接收模块测试实验

    简 介: 由 龙邱 根据 测试基于2SK241的 150kHz 的高频放大器设计的导航信号放大检波模块测试结果.并根据传统AM接收机的电路讨论了几点增加接收电路灵敏度的方案. 关键词: 调幅接收,无线 ...

  3. 树莓派实现AD转换(pcf8591模块)

    一.树莓派启动I2C 使用: ls /dev/命令可以查看I2C设备是启动. 如果没有启动执行 sudo raspi-config选择 interfacing Options->I2C-> ...

  4. 计算机应用基础 专2018秋,广东开放大学远程教育专科2018年秋计算机应用基础Word模块测试.pdf...

    广东开放大学远程教育专科 2018 年秋计算机应用基础 Word模块测试 1. 撤销输入可以按 ___________键. a. Ctrl+Z b. Ctrl+S c. Ctrl+C d. Ctrl+ ...

  5. boost::units模块测试元函数 is_unit, is_quantity, is_dimension_list ....

    boost::units模块测试元函数 is_unit, is_quantity, is_dimension_list .... 实现功能 C++实现代码 实现功能 boost::units模块测试元 ...

  6. boost::test模块测试树管理单元测试

    boost::test模块测试树管理单元测试 实现功能 C++实现代码 实现功能 boost::test模块测试树管理单元测试 C++实现代码 #define BOOST_TEST_MODULE te ...

  7. boost::test模块测试功能模板测试用例

    boost::test模块测试功能模板测试用例 实现功能 C++实现代码 实现功能 boost::test模块测试功能模板测试用例 C++实现代码 #define BOOST_TEST_MAIN #i ...

  8. boost::test模块测试参数化测试

    boost::test模块测试参数化测试 实现功能 C++实现代码 实现功能 boost::test模块测试参数化测试 C++实现代码 #define BOOST_TEST_MAIN #include ...

  9. boost::test模块测试可变参数样本元素支持和数据集定义的移动语义

    boost::test模块测试可变参数样本元素支持和数据集定义的移动语义 实现功能 C++实现代码 实现功能 boost::test模块测试可变参数样本元素支持和数据集定义的移动语义 C++实现代码 ...

最新文章

  1. git idea 可视化_那些你应该知道的,但是你一定不知道的 Git 骚操作
  2. cl: 命令行 error D8021 :无效的数值参数“/Wno-cpp” 和 cl: 命令行 error D8021 :无效的数值参数“/Wno-unused-function”
  3. linux6.6系统安装,CentOS6.6系统怎么安装
  4. matlab支持的文件类型,MATLAB可以读取的数据文件类型有()
  5. 学习java很痛苦_Java日期细微的痛苦提醒
  6. Nginx内置模块简介
  7. 数据太大?你该了解Hadoop分布式文件系统
  8. AC日记——A+B Problem(再升级) 洛谷 P1832
  9. kali中binwalk/foremost/zip2john工具的配合使用
  10. java解决合并两个有序链表问题
  11. 用javascript实现点击按钮删除一个文本框
  12. Job for named.service failed because the control process exited with error code.
  13. 【机器学习】基于mnist数据集的手写数字识别
  14. 【markdown】用markdown制作简历
  15. winfrom 实现条形码批量打印以及将条形码信息生成PDF文件
  16. 安卓测试基础入门——ADB命令
  17. 面试被骗 :当了一小时讲师,最后反倒说我不合格
  18. 2023年破产重整投资策略研究报告
  19. 硬盘插到群晖上使用之后再插回Windows就不识别了,记录一次解决过程
  20. 网页服务器编程,50行代码实现简单网站服务器

热门文章

  1. 禁止蝰蛇鼠标驱动软件自动安装;如何在插入Razer设备时停止Razer Synapse安装程序
  2. 第一次有人把5G讲得这么简单明了!
  3. DNA旋转特效 html+css
  4. 锐捷交换机系统版本升级11.X平台
  5. ATECC608A的完美兼容国产替代芯片
  6. Hadoop YARN配置参数剖析(4)—Fair Scheduler相关参数
  7. 大一 计算机应用基础 进制转换
  8. Python 函数 pass
  9. 机器人学习笔记——机器人概述
  10. 计算机二级Java考试笔记