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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機數字電流電壓表程序Proteus仿真

[復制鏈接]
跳轉到指定樓層
樓主
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. /******引腳說明
  2. LCD液晶RS2.5  RW2.6    E2.7       DB0~DB7:P0.0~P0.7
  3. 電壓測量P1.1;需要0~30v需要加分流電阻,,分辨率0.03v;
  4. 電流側量P1.7;需要加放大電路如lm358;op07等,分辨率3ma
  5. **********/
  6. //stc12c5a60
  7. //時間20141107                           
  8. #include<STC12C5A60S2.h>
  9. #include<stdio.h>
  10. #include<intrins.h>//頭文件

  11. #define uchar unsigned char//宏定義
  12. #define uint unsigned int//宏定義
  13. #define ulint unsigned long int//宏定義
  14. #define N 21//ADC中值濾波次數,必須為基數
  15. #define ISP_TRIG() ISP_TRIG=0x5A,ISP_TRIG=0xA5//ISP觸發命令

  16. sbit rs=P3^5;//液晶RS
  17. sbit rw=P3^6;//液晶RW
  18. sbit e=P3^4;//液晶E

  19. void AD_init(void);//ADC初始化
  20. void delay(uint z);//延時函數
  21. uint AD_get(uchar haha );//讀ADC的數值
  22. void LCD_data(uchar shuju);//寫數據
  23. void zhiling(uchar zhilin);//寫指令
  24. void LCD_init(void);//初始化LCD
  25. void tablex(uint tab);//數據分解
  26. uint filter(uchar dat);//中值濾波
  27. void timer_init(void);//定時器初始化

  28. uchar h1,h2,h3,h4;//LCD顯示變量
  29. ulint mas,maz;//容量計算

  30. uchar table[]="0123456789";//顯示數組
  31. uchar table1[]=".VAWa";

  32. void main()
  33. {
  34.         ulint tempv,tempa;//存放電壓電流值
  35.         AD_init();//ADC初始化
  36.         timer_init();//定時器初始化
  37.         LCD_init();//LCD初始化
  38.         while(1)
  39.         {
  40.                 tempv=filter(0x88);//設置ADC通道0、開始轉換
  41.                 tablex(tempv*3);//分解數據
  42.                 zhiling(0x80);//LCD地址
  43.                 LCD_data(table[h1]);//
  44.                 LCD_data(table[h2]);//
  45.                 LCD_data(table1[0]);//
  46.                 LCD_data(table[h3]);//
  47.                 LCD_data(table[h4]);//
  48.                 LCD_data(table1[1]);//顯示
  49.                
  50.                 tempa=filter(0x8f);//設置ADC通道7、開始轉換
  51.                 if(tempa<=10)//防止數據成負數
  52.                         tempa=10;
  53.                 mas=tempa*3-30;//計算容量取樣賦值
  54.                 tablex(tempa*3-30);//減去LM358失調的數值
  55.                 zhiling(0x88);//LCD地址
  56.                 LCD_data(table[h1]);
  57.                 LCD_data(table1[0]);
  58.                 LCD_data(table[h2]);
  59.                 LCD_data(table[h3]);
  60.                 LCD_data(table[h4]);
  61.                 LCD_data(table1[2]);
  62.                
  63.                 tablex((tempv*3/10)*((tempa*3-30)/10)/10);//計算功率
  64.                 zhiling(0x80+0x40);
  65.                 LCD_data(table[h1]);
  66.                 LCD_data(table[h2]);
  67.                 LCD_data(table1[0]);
  68.                 LCD_data(table[h3]);
  69.                 LCD_data(table[h4]);
  70.                 LCD_data(table1[3]);
  71.                
  72.                 tablex(maz/1000);//顯示MAH
  73.                 zhiling(0x88+0x40);
  74.                 LCD_data(table[h1]);
  75.                 LCD_data(table1[0]);
  76.                 LCD_data(table[h2]);
  77.                 LCD_data(table[h3]);
  78.                 LCD_data(table[h4]);
  79.                 LCD_data(table1[4]);
  80.                
  81.         }
  82. }
  83. //-------------------------------------------------------------
  84. void delay(uint z)///////////////延時程序
  85. {
  86.    uint x,y;
  87.    for(x=z;x>0;x--)
  88.    for(y=19;y>0;y--);
  89. }
  90. void AD_init(void)/////////////////////初始化ADC
  91. {
  92. P1ASF=0xff;//P1口全部作為模擬功能AD使用
  93. ADC_RES=0;//清零轉換結果寄存器高8位
  94. ADC_RESL=0;//清零轉換結果寄存器低2位
  95. ADC_CONTR=0x80;//開啟AD電源
  96. delay(5);//等待1ms,讓AD電源穩定
  97. }

  98. uint AD_get(uchar haha )//ADC讀數
  99. {
  100.         uint rew;
  101.         ADC_CONTR=haha;//開啟AD轉換
  102.         _nop_(); _nop_(); _nop_(); _nop_();//要經過4個CPU時鐘的延時
  103.         while(!(ADC_CONTR&0x10));//等待轉換完成
  104.         ADC_CONTR&=0xe7;//關閉AD轉換,ADC_FLAG位由軟件清0
  105.         rew=ADC_RES*4+ADC_RESL;//組合成10位
  106.         delay(1);//等待
  107.         return rew;//返回ADC值
  108. }
  109. void zhiling(uchar zhilin)//寫指令
  110. {
  111.         e=0;
  112.         rs=0;
  113.         rw=0;
  114.         P0=zhilin;
  115.         delay(20);
  116.         e=1;
  117.         delay(20);
  118.         e=0;
  119. }
  120. void LCD_data(uchar shuju)//寫數據
  121. {
  122.         e=0;
  123.         rs=1;
  124.         rw=0;
  125.         P0=shuju;
  126.         delay(20);
  127.         e=1;
  128.         delay(20);
  129.         e=0;
  130. }
  131. void LCD_init(void)//初始化LCD
  132. {
  133. delay(300);
  134. zhiling(0x38);
  135. delay(100);
  136. zhiling(0x38);
  137. delay(100);
  138. zhiling(0x38);
  139. delay(100);
  140. zhiling(0x38);
  141. zhiling(0x38);
  142. zhiling(0x08);
  143. zhiling(0x01);
  144. zhiling(0x06);
  145. zhiling(0x0c);
  146. }
  147. void tablex(uint tab1)//數據分解
  148. {
  149.         h1=tab1/1000;//1023//1
  150.         h2=tab1%1000/100;//023//0
  151.         h3=tab1%100/10;//23//2
  152.         h4=tab1%10;//3
  153. }
  154. uint filter(uchar dat)//中位值濾波
  155. {
  156.    uint value_buf[N];
  157.    uint count,i,j,temp;
  158.    for(count=0;count<N;count++)
  159.    {
  160.                          AD_init();//初始化ADC
  161.       value_buf[count] = AD_get(dat);//讀ADC數值
  162.       delay(1);
  163.    }
  164.    for (j=0;j<N-1;j++)
  165.    {
  166.       for (i=0;i<N-j;i++)
  167.       {
  168.          if ( value_buf[i]>value_buf[i+1] )
  169.          {
  170.             temp = value_buf[i];
  171.             value_buf[i] = value_buf[i+1];
  172.             value_buf[i+1] = temp;
  173.          }
  174.       }
  175.    }
  176.    return value_buf[(N-1)/2];
  177. }
  178. void timer_init(void)//定時器初始化
  179. {
  180.         TMOD=0x01;/////////設置工作方式1
  181.         TH0=(65536-50000)/256;///////賦值
  182.         TL0=(65536-50000)%256;
  183.         EA=1;ET0=1;//開總中斷;開定時器中斷
  184.         TR0=1;////////啟動計數器
  185. }
  186. void timer0()interrupt 1  //定時中斷
  187. {
  188.         uchar t;
  189.         TR0=0;
  190.         TH0=(65536-50000)/256;///////賦初值
  191.         TL0=(65536-50000)%256;
  192.         t++;
  193.         if(t==20)
  194.         {
  195.                 t=0;
  196.                 maz+=(mas*1000)/3600;
  197.         }
  198.         TR0=1;
  199. }
復制代碼

全部資料51hei下載地址:
單片機數字電壓表.rar (20.96 KB, 下載次數: 47)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1 發表于 2020-11-25 15:14 | 只看該作者
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復

使用道具 舉報

板凳
ID:852236 發表于 2020-12-2 22:15 | 只看該作者
等待樓主補了原理圖好好學習下
回復

使用道具 舉報

地板
ID:308393 發表于 2021-3-19 16:06 | 只看該作者
謝謝樓主,但是是分別用兩個單片機測嘛
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕视频免费 | 日韩一区二区av | 一区二区播放 | 中文字幕在线一区二区三区 | 中文字幕av亚洲精品一部二部 | 玖玖精品 | 成人影| 成在线人视频免费视频 | 国产精品久久毛片av大全日韩 | 欧美一区永久视频免费观看 | 日本成人中文字幕在线观看 | 欧美最猛性xxxxx亚洲精品 | 亚洲小说图片 | 亚洲午夜精品视频 | 久久最新 | 欧美老少妇一级特黄一片 | 超碰成人在线观看 | 一区二区三区在线 | 欧 | 国产成人久久精品一区二区三区 | 国产精品亚洲综合 | 碰碰视频 | 日韩午夜在线播放 | av网站免费观看 | 污视频免费在线观看 | av一区二区三区四区 | 成人乱人乱一区二区三区软件 | 国产精品mv在线观看 | 北条麻妃99精品青青久久 | 欧美性极品xxxx做受 | 久久久精品一区二区三区四季av | 999久久精品 | 日韩高清中文字幕 | 亚洲精品视频免费 | 亚洲国产成人精品女人 | 日韩国产一区 | 日本 欧美 国产 | 色婷婷综合网站 | 亚洲一区精品视频 | 国产99免费| 亚洲视频自拍 | 亚洲精品一区二区另类图片 |