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

標題: 單片機雙積分AD-數碼管 Proteus仿真程序 [打印本頁]

作者: 展乾741    時間: 2020-1-4 12:14
標題: 單片機雙積分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)


作者: 學習習鴨    時間: 2021-3-22 15:48
你好,可以問問你這個雙積分程序的思路么?




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 狠狠操电影 | 亚洲综合久久久 | 九九视频在线观看 | 欧美一级欧美一级在线播放 | 国产欧美日韩一区 | 国产在线视频一区二区董小宛性色 | 日本不卡一区二区 | 日韩免费中文字幕 | 欧美精品一区二区三区在线播放 | 国产精品亚洲欧美日韩一区在线 | www.9191.com| 成人h动漫精品一区二区器材 | 国产精品美女久久久久久免费 | 久久成人综合 | 天堂在线91 | 99免费视频 | 久久久精品一区二区三区 | 婷婷久久综合 | 亚洲视频www| 在线观看国产wwwa级羞羞视频 | 欧美日韩a | 日韩视频一区二区 | www亚洲成人| 欧美在线日韩 | 成人在线免费看 | 欧美亚洲一区二区三区 | 久久久噜噜噜www成人网 | 国产美女久久 | 亚洲视频免费在线观看 | 亚洲欧洲精品一区 | 伊人网国产| 国产精品一区久久久久 | 亚洲一区有码 | 在线成人免费视频 | 一级做a爰片性色毛片16美国 | 永久精品| 午夜国产精品视频 | 99精品网 | 欧美色人 | 欧美日韩在线一区二区三区 | 久久r免费视频 |