单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 634|回复: 4
打印 上一主题 下一主题
收起左侧

单片机PCF8591制作的电压表和四种波形发生器(工程+仿真)分享

[复制链接]
跳转到指定楼层
楼主
分享一个好资料给大家学习单片机技术
工程包含PCF8591驱动文件,可以通过改变传入参数轻松改变ADC四通道电压测量,调用DAC函数产生DAC。
可以产生正弦波,方波,三角板和锯齿波。
使用四个数码管作为显示,一个独立按键作为模式切换。

PCF8591电压表+四种波形发生器仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include <reg51.h>
  2. #include <PCF8591.h>
  3. #include <seg.h>

  4. sbit KEY = P3^7;

  5. unsigned char code sin_num[]={
  6. 0,0,0,0,0,0,0,0,1,1,1,1,1,2,2,2,
  7. 2,3,3,4,4,4,5,5,6,6,7,7,8,8,9,9,
  8. 10,10,11,12,12,13,14,15,15,16,17,18,18,19,20,21,
  9. 22,23,24,25,25,26,27,28,29,30,31,32,34,35,36,37,
  10. 38,39,40,41,42,44,45,46,47,49,50,51,52,54,55,56,
  11. 57,59,60,61,63,64,66,67,68,70,71,73,74,75,77,78,
  12. 80,81,83,84,86,87,89,90,92,93,95,96,98,99,101,102,
  13. 104,106,107,109,110,112, 113,115,116,118,120,121,123,124,126,128,
  14. 129,131, 132,134,135, 137, 139,140,142,143,145,146,148, 149,151,153,
  15. 154,156,157,159,160,162,163,165, 166,168,169,171,172,174,175,177,
  16. 178,180,181, 182,184,185,187,188,189,191,192,194,195,196,198,199,
  17. 200,201,203,204,205,206,208,209,210,211,213,214,215,216,217,218,
  18. 219,220,221,223,224,225,226,227,228,229,230,230,231,232,233,234,
  19. 235,236,237,237,238,239,240,240,241,242,243,243,244,245,245,246,
  20. 246,247,247,248,248,249,249,250,250,251,251, 251,252,252,253,253,
  21. 253,253,254,254,254,254,254,255,255,255,255, 255,255,255,255,255
  22. }; //这是正弦波上升半周期的采样

  23. uchar Recv_Buffer;//数据接收缓冲
  24. uchar Voltage[]="0.000V  ";//数据分解为电压x.xx
  25. float Vol_Am;                                                                //放大后的电压值
  26. uchar key_ms;
  27. uchar mode;

  28. void delay(unsigned int x)//延时
  29. {
  30.         while(--x);
  31. }

  32. void key_pro()
  33. {
  34.         if(KEY == 0)        key_ms++;
  35.         if(key_ms        >= 5)
  36.         {
  37.                 if(KEY == 0)
  38.                 {
  39.                         key_ms = 0;
  40.                         mode++;
  41.                         if(mode >= 5)        mode = 0;
  42.                         while(!KEY);
  43.                 }
  44.         }
  45. }

  46. void DAC_Wave()
  47. {
  48.         int i;
  49.         switch(mode)
  50.   {
  51.    case 1: //三角波
  52.                         for(i=0;i<255;i++)
  53.                         {
  54.                                 DAC_PCF(i);
  55.                                 key_pro();
  56.                         }
  57.                         for(i=255;i>0;i--)
  58.                         {
  59.                                 DAC_PCF(i);
  60.                                 key_pro();
  61.                         }
  62.                         break;
  63.                         
  64.           case 2://方波
  65.                         DAC_PCF(0);
  66.                         delay(2500);
  67.                         DAC_PCF(0xff);
  68.                         delay(2500);
  69.                         break;
  70.                
  71.           case 3://三角波
  72.                         for(i=255;i>0;i--)
  73.                         {
  74.                                         DAC_PCF(i);
  75.                                         key_pro();
  76.                         }
  77.                         break;
  78.                
  79.           case 4: //正弦波 采用数组采样值 波形更好
  80.                         for(i=0;i<255;i++)
  81.                         {
  82.                                 DAC_PCF(sin_num[i]);
  83.                                 key_pro();
  84.                         }
  85.                         for(i=255;i>=0;i--)
  86.                         {
  87.                                 DAC_PCF(sin_num[i]);
  88.                                 key_pro();
  89.                         }
  90.                         break;
  91.           default : DAC_PCF(0x00);//否则为0 防错
  92.         }
  93. }

  94. // 转换模数转换后得到的值
  95. void Convert_To_Voltage(uchar val)
  96. {
  97.         Vol_Am = val;
  98.         Vol_Am = Vol_Am*5/255*1000;
  99.         Voltage[4]=(uint)Vol_Am%10+'0';
  100.         Voltage[3]=(uint)Vol_Am/10%10+'0';
  101.         Voltage[2]=(uint)Vol_Am/100%10+'0';
  102.         Voltage[0]=(uint)Vol_Am/1000%10+'0';
  103. }

  104. void dis_pro()
  105. {
  106.         if(mode == 0)
  107.         {
  108.                 ISendByte(0x00);
  109.                 Recv_Buffer=IRcvByte();
  110.                 Convert_To_Voltage(Recv_Buffer);
  111.                 seg_display((uint)Vol_Am);
  112.         }
  113.         else
  114.         {
  115.                 seg_display_One(mode);
  116.                 DAC_Wave();
  117.         }
  118. }

  119. void main()
  120. {
  121.         while(1)
  122.         {
  123.                 key_pro();
  124.                 dis_pro();
  125.         }
  126. }
复制代码

所有资料51hei提供下载:
电压表.zip (108.96 KB, 下载次数: 41)


评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 顶 踩
回复

使用道具 举报

沙发
2695154202 发表于 2019-6-15 12:59 | 只看该作者
好东西,谢谢分享。对我作用很大。
回复

使用道具 举报

板凳
sugarplum 发表于 2019-6-15 23:31 | 只看该作者
非常感谢!!!
回复

使用道具 举报

地板
超级困困 发表于 2019-7-2 18:02 | 只看该作者
请问你的protues是什么版本呀?我是8.0但打不开你的原理图
回复

使用道具 举报

5#
 楼主| miaomi_love 发表于 2019-7-14 09:22 | 只看该作者
超级困困 发表于 2019-7-2 18:02
请问你的protues是什么版本呀?我是8.0但打不开你的原理图

是 8.6 版本的 图在别人那能打开的,你再试试~
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51Hei单片机16群 联系QQ:125739409;技术交流QQ群7344883

Powered by 单片机教程网

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