欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7786|回復: 7
打印 上一主題 下一主題
收起左側

單片機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, 下載次數: 152)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂2 踩
回復

使用道具 舉報

沙發
ID:229772 發表于 2019-6-15 12:59 | 只看該作者
好東西,謝謝分享。對我作用很大。
回復

使用道具 舉報

板凳
ID:399906 發表于 2019-6-15 23:31 | 只看該作者
非常感謝!!!
回復

使用道具 舉報

地板
ID:576564 發表于 2019-7-2 18:02 | 只看該作者
請問你的protues是什么版本呀?我是8.0但打不開你的原理圖
回復

使用道具 舉報

5#
ID:344053 發表于 2019-7-14 09:22 | 只看該作者
超級困困 發表于 2019-7-2 18:02
請問你的protues是什么版本呀?我是8.0但打不開你的原理圖

是 8.6 版本的 圖在別人那能打開的,你再試試~
回復

使用道具 舉報

6#
ID:425175 發表于 2019-10-9 16:13 來自觸屏版 | 只看該作者
超級困困 發表于 2019-7-2 18:02
請問你的protues是什么版本呀?我是8.0但打不開你的原理圖

右鍵選擇“打開方式”選擇“proteus 8”,試試看,有驚喜喔
回復

使用道具 舉報

7#
ID:622212 發表于 2019-10-11 12:13 | 只看該作者
為什么打不開仿真?
回復

使用道具 舉報

8#
ID:344053 發表于 2019-10-16 13:52 | 只看該作者
ljg1998 發表于 2019-10-11 12:13
為什么打不開仿真?

可能是版本比較新,我用的8.6的,你可以試試新版本的或者右鍵使用8.0的打開~
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表