找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3665|回复: 6
收起左侧

基于STC15f104w单片机的adc和dac读取以及Oled显示

[复制链接]
ID:442609 发表于 2021-7-5 16:49 | 显示全部楼层 |阅读模式
第一次做这种程序,有很多写的不好的地方,望大神斧正!
  1. /*********************************************************************************
  2. * 【函数功能】: DA-AD试验                                                                                          
  3. * 【使用说明】: 单片机:STC89C52
  4.          1 光敏电阻
  5.                                  2 热敏电阻
  6.                                  3 悬空
  7.                                  4 可调0-5V电压(蓝色电位器调节)
  8.                                  
  9. **********************************************************************************/
  10. /********************************************************************************************/

  11. #include<stc15.h>    //包含单片机寄存器的头文件
  12. #include <I2C.H>

  13. #define uchar unsigned char
  14. #define  PCF8591 0x90    //PCF8591 地址



  15. // 变量定义
  16. unsigned char AD_CHANNEL;
  17. unsigned long xdata  LedOut[8];
  18. unsigned int  D[32];
  19. unsigned char date;



  20.   // 函数申明

  21. void delay(uchar i);
  22. bit DACconversion(unsigned char sla,unsigned char c,  unsigned char Val);
  23. bit ISendByte(unsigned char sla,unsigned char c);
  24. unsigned char IRcvByte(unsigned char sla);
  25. //******************************************************************/
  26. int main()
  27. {  
  28.   oled_init();//初始化
  29.         oled_wr_byte(0x2e,0);//关滚动
  30.   oled_showstring(0,0,"AR VALUE",16);
  31.   oled_showstring(0,2,"PR VALUE",16);
  32.   oled_showstring(0,4,"TM VALUE",16);
  33.   oled_showstring(0,6,"NO VALUE",16);
  34.         while(1)
  35.         {
  36.         
  37.         /********以下AD-DA处理*************/  
  38.         
  39.             switch(AD_CHANNEL)
  40.                 {
  41.                         case 0: ISendByte(PCF8591,0x41);
  42.                              D[0]=IRcvByte(PCF8591);  //ADC0 模数转换1      光敏电阻
  43.                                  break;  
  44.                         
  45.                         case 1: ISendByte(PCF8591,0x42);
  46.                              D[1]=IRcvByte(PCF8591);  //ADC1  模数转换2          热敏电阻
  47.                                  break;  
  48.                         
  49.                         case 2: ISendByte(PCF8591,0x43);
  50.                              D[2]=IRcvByte(PCF8591);  //ADC2        模数转换3           悬空
  51.                                  break;  
  52.                         
  53.                         case 3: ISendByte(PCF8591,0x40);
  54.                              D[3]=IRcvByte(PCF8591);  //ADC3   模数转换4           可调0-5v
  55.                                  break;  
  56.                         
  57.                         case 4: DACconversion(PCF8591,0x40, D[4]); //DAC          数模转换
  58.                              break;
  59.                  
  60.                 }

  61.               D[4]=D[0];//把模拟输入采样的信号 通过数模转换输出
  62.                         
  63.            if(++AD_CHANNEL>4) AD_CHANNEL=0;
  64.         
  65.            /********以下将AD的值通过OLED显示*************/
  66.          delay(200);        
  67.          oled_shownum(96,0,D[0],4,16);                           
  68.          delay(200);
  69.         oled_shownum(96,2,D[1],4,16);                           
  70.          delay(200);
  71.         oled_shownum(96,4,D[2],4,16);                           
  72.          delay(200);
  73.                 oled_shownum(96,6,D[3],4,16);                           
  74.          delay(200);

  75.          
  76.    }
  77. }


  78. void delay(uchar i)
  79. {
  80.   uchar j,k;
  81.   for(j=i;j>0;j--)
  82.     for(k=125;k>0;k--);
  83. }

  84. /*******************************************************************
  85. DAC 变换, 转化函数               
  86. *******************************************************************/
  87. bit DACconversion(unsigned char sla,unsigned char c,  unsigned char Val)
  88. {
  89.    Start_I2c();              //启动总线
  90.    SendByte(sla);            //发送器件地址
  91.    //if(ack==0)return(0);
  92.    SendByte(c);              //发送控制字节
  93.    //if(ack==0)return(0);
  94.    SendByte(Val);            //发送DAC的数值  
  95.    //if(ack==0)return(0);
  96.    Stop_I2c();               //结束总线
  97.    return(1);
  98. }

  99. /*******************************************************************
  100. ADC发送字节[命令]数据函数               
  101. *******************************************************************/
  102. bit ISendByte(unsigned char sla,unsigned char c)
  103. {
  104.    Start_I2c();              //启动总线
  105.    SendByte(sla);            //发送器件地址
  106.    //if(ack==0)return(0);
  107.    SendByte(c);              //发送数据
  108.    //if(ack==0)return(0);
  109.    Stop_I2c();               //结束总线
  110.    return(1);
  111. }

  112. /*******************************************************************
  113. ADC读字节数据函数               
  114. *******************************************************************/
  115. unsigned char IRcvByte(unsigned char sla)
  116. {  unsigned char c;

  117.    Start_I2c();          //启动总线
  118.    SendByte(sla+1);      //发送器件地址
  119.    //if(ack==0)return(0);
  120.    c=RcvByte();          //读取数据0

  121.    Ack_I2c(1);           //发送非就答位
  122.    Stop_I2c();           //结束总线
  123.    return(c);
  124. }
复制代码
51hei.png

以上3个文件下载: adc-OLED显示.rar (6.7 KB, 下载次数: 48)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:839438 发表于 2021-7-9 16:07 | 显示全部楼层
下下来看看,正在研究12864,
回复

使用道具 举报

ID:442609 发表于 2021-7-12 00:24 | 显示全部楼层
我会想你的 发表于 2021-7-9 16:07
下下来看看,正在研究12864,

更基础的12864显示可以看我的上一篇帖子
回复

使用道具 举报

ID:63317 发表于 2021-7-12 05:58 | 显示全部楼层
有原理图吗
回复

使用道具 举报

ID:97678 发表于 2021-7-12 11:55 | 显示全部楼层
这个程序能不能再STC08G 上面运行?
回复

使用道具 举报

ID:442609 发表于 2021-7-12 14:34 | 显示全部楼层
jovew 发表于 2021-7-12 11:55
这个程序能不能再STC08G 上面运行?

当然可以,只不过需要改一下定义啥的,这个程序几乎兼容所有的STC单片机
回复

使用道具 举报

ID:442609 发表于 2021-7-12 14:35 | 显示全部楼层
jovew 发表于 2021-7-12 11:55
这个程序能不能再STC08G 上面运行?

不过STC08G自带ADC,就不需要额外的ADC模块了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表