久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機雙積分AD-數碼管 Proteus仿真程序

[復制鏈接]
跳轉到指定樓層
樓主
使用兩個運放組成積分電路,比較器電路,結合單片機定時器計數,測量ADC,并使用protues仿真實現
視頻連接:https://www.bilibili.com/video/av81800813/



單片機源程序如下:
  1. #include<reg52.h>
  2. //#include<absacc.h>
  3. //#include<intrins.h>
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. #define GPIO_DIG P0      //傳送數據的端口設為P0,以上端口根據實際硬件電路圖可做修改

  7. sbit S4=P2^3;
  8. sbit S3=P2^2;         //使能信號
  9. sbit S2=P2^1;         //讀寫控制信號
  10. sbit S1=P2^0;         //數據命令選擇端口

  11. sbit P30=P3^0;
  12. sbit P31=P3^1;
  13. sbit P33=P3^3;
  14. uint ss,vin;
  15. uchar lo,kl = 0;

  16. //--定義全局變量--//
  17. unsigned char code DIG_CODE[10]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  18. //0、1、2、3、4、5、6、7、8、9的顯示碼
  19. unsigned char DisplayData[4];
  20. //用來存放要顯示的4位數的值

  21. /****************10MS延時函數******************************/
  22. void Delay10ms()                //@12.000MHz
  23. {
  24.         unsigned char i, j;

  25.         i = 20;
  26.         j = 113;
  27.         do
  28.         {
  29.                 while (--j);
  30.         } while (--i);
  31. }


  32. /****************1MS延時函數******************************/

  33. void delay(unsigned int n)
  34. {
  35.     unsigned int i,j;
  36.     for(j=n;j>0;j--)
  37.     for(i=112;i>0;i--);
  38. }


  39. void led_byte(unsigned int byte_data)                //以十進制的方式顯示一個字符變量
  40. {

  41.           DisplayData[0] = ~DIG_CODE[(byte_data % 10000 /1000)];                            //求千位數   
  42.           DisplayData[0] |= 0x80;         //小數點
  43.           DisplayData[1] = ~DIG_CODE[(byte_data%1000/100)];                            //求百位數   
  44.           DisplayData[2] = ~DIG_CODE[(byte_data%100/10)];                          //求十位數   
  45.           DisplayData[3] = ~DIG_CODE[(byte_data%10)];                             //求個位數
  46. }

  47. /*******************************************************************************
  48. * 函 數 名         : DigDisplay
  49. * 函數功能                   : 使用數碼管顯示
  50. * 輸    入         : 無
  51. * 輸    出         : 無
  52. *******************************************************************************/
  53. void DigDisplay()
  54. {
  55.         unsigned char i;

  56.         led_byte(vin);
  57.         for(i=0;i<4;i++)
  58.         {
  59.                 switch(i)         //位選,選擇點亮的數碼管,
  60.                 {
  61.                         case(0):
  62.                                 S1=0;S2=1;S3=1;S4=1; break;//顯示第0位
  63.                         case(1):
  64.                                 S1=1;S2=0;S3=1;S4=1; break;//顯示第1位
  65.                         case(2):
  66.                                 S1=1;S2=1;S3=0;S4=1; break;//顯示第2位
  67.                         case(3):
  68.                                 S1=1;S2=1;S3=1;S4=0; break;//顯示第3位
  69.                 }
  70.                 GPIO_DIG=DisplayData[i];//發送段碼
  71.                 delay(10);                                         //掃描間隔時間設定
  72.                 GPIO_DIG=0x00;//消隱
  73.         }
  74. }
  75. /**************數碼管顯示*************************/


  76. void my_t0(void) interrupt 1  //定時器0中斷用于固定時間對輸入待測電壓進行積分
  77. {
  78.           TR0 = 0;    //T0中斷關                                               ///
  79.           TH0 = 0;
  80.           TL0 = 0;
  81.           lo++;                                                                                ///
  82.           TF0 = 0;   //清除T0中斷標志                                          ///
  83.           TR0 = 1;    //T0中斷開
  84. }

  85. void my_int0(void) interrupt 0          //外部中斷 用于反積分過程結束檢測
  86. {
  87.           EX0 = 0;    //INT0中斷關
  88.           TR0 = 0;    //T0中斷關
  89.           TF0 = 0;   //清除T0中斷標志
  90.           ss = TH0 * 256 + TL0;
  91.                   if(ss == 5) ss = vin;  //解決數據緩存溢出BUG
  92.           else  {
  93. //                ss = ss/10 + lo*6553 ;  //計算電壓
  94. //          ss = ss/10 + lo*6553 + 37;  //補償系統誤差
  95.                        
  96.                         if((ss % 10000 /1000) < 4)
  97.           vin = ss/10 + lo*6553 + ss/1000;  //補償系統誤差
  98.                         else
  99.                                    vin = ss/10 + lo*6553 + ss/2000;
  100.                 }
  101.           TH0 = 0;
  102.           TL0 = 0;
  103.           kl = 1;                                        
  104.                 lo = 0;               
  105.                 ss = 0;
  106.           EA = 0;
  107. }

  108. void main()
  109. {
  110.   char i = 0;
  111.         P33 = 0;
  112.         P31 = 0;                            ///
  113.         P30 = 1;
  114.         kl = 0;
  115.         EA =  1;   //中斷開
  116.         ET0 = 1;   //定時計數0中斷開       
  117.         //IP  = 1;    //定時0中斷最高優先級 =2
  118.         TMOD = 0x01;        //定時0,1模式1 2個16位定時/計數器
  119.         EX0 = 1;    //INT0中斷開

  120.         TCON=0x01;  //INT0負邊緣觸發或低電平觸發在此好象作用相同
  121.         IT0 = 1;

  122.         while(1)
  123.         {

  124.                 if(kl == 1 && i == 20)
  125.                 {
  126.                         ss = 0;
  127.                         lo = 0;
  128.         //                vin = 0;
  129.                           TR0 = 0;
  130.                                 P31 = 0;
  131.                                 P33 = 0;
  132.                                 P30 = 1;   //選擇放電                                                ///
  133.                                 delay(100);               
  134.                        
  135.                            kl = 0;
  136.                                 P30 = 0;
  137.                                 P33 = 0;
  138.                                 P31 = 1;    //選擇輸入電壓
  139.                                 Delay10ms();
  140.                        
  141.                                 TH0 = 0;
  142.                                 TL0 = 0;       
  143.                                 P31 = 0;
  144.                                 P33 = 1;     //選擇比較電壓
  145.                                 TF0 = 0;   //清除T0中斷標志
  146.                                 TR0 = 1;   //定時計數0起動
  147.                           EX0 = 1;
  148.                                 EA =  1;
  149.                 }
  150.             i++;
  151.                 if(i==21) i=0;  //徹底完成第一次轉換后進行下一次轉換,防止互相干擾
  152.                  // delay(1);
  153.                
  154.                
  155.                 delay(1);
  156.     DigDisplay();
  157.                        
  158.         }
  159. }
復制代碼

所有資料51hei提供下載:
單片機雙積分AD-數碼管.rar (89.47 KB, 下載次數: 49)

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:658684 發表于 2021-3-22 15:48 | 只看該作者
你好,可以問問你這個雙積分程序的思路么?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品欧美一区二区精品久久久 | 久久一二三区 | 福利在线看 | 国产精品美女久久久久久久久久久 | 国产在线观看 | 日本精品一区二区在线观看 | 国产玖玖 | 在线观看免费av片 | 国产女人与拘做受视频 | 男人的天堂一级片 | 中文字幕亚洲区 | 色综合99 | 性一交一乱一透一a级 | 视频一区二区三区在线观看 | 国产一区二区在线视频 | 天天看片天天干 | 亚洲国产精品久久久久婷婷老年 | 欧美精品三区 | 亚洲欧美综合 | 亚洲网站观看 | 97久久超碰 | 中文字幕日韩一区 | 国产在线视频一区 | 国产精品精品视频一区二区三区 | 国产精品久久久久久久久免费丝袜 | 国产精品久久久久久中文字 | 亚洲日本欧美日韩高观看 | 男人的天堂在线视频 | 久久99视频 | 欧美日本一区二区 | 天天躁天天操 | 狠狠干天天干 | 国产美女视频黄a视频免费 国产精品福利视频 | 日韩精品免费在线观看 | 中文字幕免费视频 | 中文字幕视频一区二区 | av片在线播放 | 亚洲福利| 久久中文视频 | 欧美精品中文字幕久久二区 | 深夜爽视频 |