基于STC15F104W的单片机示波器

代码如下,利用PCF8591和iic采集模拟信号然后通过iic接口的OLED显示出来
代码不完善有BUG,望大神斧正!
这个示波器推荐输入电压0-5V,显示的时候右上角会显示实时电压(单位毫伏)
但是由于前置硬件的存在输入超过5V的电压甚至是负电压也是可以的,但是超过±5V的电压会被钳位二极管钳住到±5V

主要思路还是画点函数画出图像

这段代码我是直接抄B站UP主@x麟枫 的作业的,比较懒23333

void Setpos(unsigned char x0,unsigned char y0)
{unsigned char y,mod,pos;if(y0%8==0){ //输入的y进行处理,如果能被8整除,值必然在0~7页y=y0/8;  //设它的点在对应值的第一个点。pos = 0x01;    }else{y = y0/8;        //如果不能被整除mod = y0%8;       //取余数,用把余数看成1~7个二进制位//然后用16进制在那一页上设立对应的值switch(mod){case 1:pos = 0x02;break;case 2:pos = 0x04;break;case 3:pos = 0x08;break;case 4:pos = 0x10;break;case 5:pos = 0x20;break;case 6:pos = 0x40;break;case 7:pos = 0x80;break;default:break;}}oled_set_pos(x0,y);       //OLED设置起始位置的函数oled_wr_byte(pos,1); //在那个位置写数据,1表示那个点亮,0表示那个点灭}

然后主代码如下:

#include<stc15.h>    //包含单片机寄存器的头文件
#include <I2C.H>#define uchar unsigned char
#define  PCF8591 0x90    //PCF8591 地址
int xx=0;int y11,y22;// 变量定义
unsigned char AD_CHANNEL;
unsigned int  D[32];
int ii,hh;// 函数申明 void delay(uchar i);
bit DACconversion(unsigned char sla,unsigned char c,  unsigned char Val);
bit ISendByte(unsigned char sla,unsigned char c);
unsigned char IRcvByte(unsigned char sla);//******************************************************************/
int main()
{  oled_init();//初始化/*oled_wr_byte(0x2e,0);//关滚动oled_showstring(0,0,"TM VALUE",16);oled_showstring(0,2,"PR VALUE",16);oled_showstring(0,4,"NO VALUE",16);oled_showstring(0,6,"AR VALUE",16);*/while(1){oled_DrawLine(0,0,0,63);oled_DrawLine(0,63,127,63);/********以下AD-DA处理*************/  for(xx=0;xx<128;xx++){switch(AD_CHANNEL){case 0: ISendByte(PCF8591,0x41);D[0]=IRcvByte(PCF8591);  //ADC0 模数转换1      光敏电阻break;  case 1: ISendByte(PCF8591,0x42);D[1]=IRcvByte(PCF8591);  //ADC1  模数转换2    热敏电阻break;  case 2: ISendByte(PCF8591,0x43);D[2]=IRcvByte(PCF8591);  //ADC2  模数转换3      输入端break;  case 3: ISendByte(PCF8591,0x40);D[3]=IRcvByte(PCF8591);  //ADC3   模数转换4     可调0-5vbreak;  case 4: DACconversion(PCF8591,0x40, D[4]); //DAC     数模转换break;}D[4]=D[2];//把模拟输入采样的信号 通过数模转换输出if(++AD_CHANNEL>4) AD_CHANNEL=0;ii=map(D[2],0,255,63,9);hh=map(D[2],0,255,0,5000);/********以下将AD的值通过OLED显示*************/oled_shownum(64,0,hh,4,32);//oled_shownum(80,1,ii,3,32);   Setpos(xx,ii);      delay(200);}oled_clear();}
}void delay(uchar i)
{uchar j,k; for(j=i;j>0;j--)for(k=125;k>0;k--);
}/*******************************************************************
DAC 变换, 转化函数
*******************************************************************/
bit DACconversion(unsigned char sla,unsigned char c,  unsigned char Val)
{Start_I2c();              //启动总线SendByte(sla);            //发送器件地址//if(ack==0)return(0);SendByte(c);              //发送控制字节//if(ack==0)return(0);SendByte(Val);            //发送DAC的数值  //if(ack==0)return(0);Stop_I2c();               //结束总线return(1);
}/*******************************************************************
ADC发送字节[命令]数据函数
*******************************************************************/
bit ISendByte(unsigned char sla,unsigned char c)
{Start_I2c();              //启动总线SendByte(sla);            //发送器件地址//if(ack==0)return(0);SendByte(c);              //发送数据//if(ack==0)return(0);Stop_I2c();               //结束总线return(1);
}/*******************************************************************
ADC读字节数据函数
*******************************************************************/
unsigned char IRcvByte(unsigned char sla)
{  unsigned char c;Start_I2c();          //启动总线SendByte(sla+1);      //发送器件地址//if(ack==0)return(0);c=RcvByte();          //读取数据0Ack_I2c(1);           //发送非就答位Stop_I2c();           //结束总线return(c);
}

迷你单片机示波器!51单片机和STC15F104W适用~相关推荐

  1. 【51单片机】51单片机学习资料合集

    [51单片机]51单片机学习资料合集 资源文件架构 一次全部保存是保存不了的,超过了文件上限,需要分批保存,对于爱好学习和感兴趣学习51单片机的人来说是一波很不错的福利,希望大家多多支持. 51程序 ...

  2. pic单片机与51单片机,谁更易于学习?

    pic 单片机是学单片机人士必须掌握的一款单片机,对于 pic 单片机,小编层带来诸多介绍. 如果你对 pic 单片机很感兴趣,不妨翻阅往期文章.本文对 pic 单片机的介绍内容为:pic 单片机与 ...

  3. 基于51单片机的51单片机的LED彩灯霓虹灯控制器(心形流水灯)设计

    基于51单片机的51单片机的LED彩灯霓虹灯控制器(心形流水灯)设计 必看!!视频讲解 基于51单片机的LED彩灯霓虹灯心形流水灯设计 这里写目录标题 1 开发环境 2 功能说明介绍 3 仿真图 4 ...

  4. 红外测距模块 51单片机_[51单片机] HC-SR04超声波测距仪

    1.HC-SR04超声波模块工作原理 (1)采用IO口触发测距,给至少10us高电平脉冲: (2)模块自动发送八个40khz方波,并自主检测是否有电波返回: (3)当有信号返回时,通过IO口输出一个高 ...

  5. matlab ds18b20 单片机,基于51单片机ds18b20温度检测————设计报告.doc

    基于51单片机ds18b20温度检测----设计报告 课程名称: 微机原理课程设计 题 目: 温度检测课程设计 摘要 随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为 ...

  6. 利用51单片机+HC-SR04+51单片机制造超声波测距模块

    利用HC-SR04和51单片机制造超声波测距模块 完整的项目链接: https://github.com/linxinloningg/51_chip_core.git 硬件电路分析: 1.HC-SR0 ...

  7. nRF24L01--2.4G无线通信模块(1)(51单片机和51单片机通信)

    作者:李剀 出处:https://www.cnblogs.com/kevin-nancy/ 或者 https://blog.csdn.net/Kevin_8_Lee/article/details/9 ...

  8. 【单片机】51单片机最小系统

    51单片机最小系统由三部分组成:主控电路.复位电路.晶振电路. 添加LED电路和独立按键.原理图如下所示:

  9. 初识单片机:51单片机简介

    目录 一.STC89C51单片机引脚简介 二.电平特性 三.单片机周期 四.中断(后面再详细了解) 今天开始,我们正式进入51单片机的学习! 51单片机是最好入门的,下面就开始介绍51系列的经典--S ...

  10. 初始单片机:51单片机最小系统最全讲解

    目录 复位电路 用途 工作原理 开机复位 按键复位 晶振电路 P0口的上拉电阻 P0口使用注意事项: 单片机最小系统是指用最少的元件组成的单片机可以工作的系统.对51系列单片机来说,最小系统一般包括单 ...

最新文章

  1. java 查询sql_java如何实现sql连接和查询的代码?
  2. 比特币现金支持者为网络的未来六个月做准备
  3. 在Ubuntu 18.04上安装和使用Tesseract 4
  4. android数据库给单选赋值,如何使用android studio将单选按钮的值保存到mysql数据库?...
  5. 拿来就能用!行,这本 Python 书彻底火了!
  6. python 如何定义空字典_python字典中如何添加键值对
  7. 微信小程序 ---- 学习目标认识小程序
  8. [Android]Android TraceView工具使用
  9. 雅黑PHP探针Light,雅黑php探针
  10. [挑战杯] 火焰检测
  11. 多层次细节(Level of detail)
  12. Linux下如何查看硬盘型号、序列号、缓存 CPU 主板 等信息
  13. 板内板间通信协议及接口(六)RS232 RS485 RS422
  14. Apollo 3.0来了!百度自动驾驶硬件系统全解读
  15. 常用的DOS命令大全
  16. linux挂载smb增加空间,[linux]挂载smb
  17. “不安分”的花椒直播,搞了史上首个网红演唱会
  18. 考研常识|夏令营和预推免有什么区别?
  19. whistle工具常用功能
  20. java直接打印数组 结果输出[I@28d93b30

热门文章

  1. 【文学文娱】《致青春--我的大学(吉林大学)》
  2. Dubbo(十四)源码解析 之 远程调用
  3. SpringMVC常见面试题总结(超详细回答)
  4. stm32和树莓派哪个好?哪个入手难度更高?
  5. Javascript刷新页面的几种方法。
  6. Qt之QProcess 连续执行多条指令并获取指令返回内容
  7. 线性八叉树_游戏场景管理的八叉树算法是怎样的?
  8. C#服务端的微信小游戏——多人在线角色扮演(十四)
  9. Python中的环境变量
  10. 经典Z字形编排问题的详细解读