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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機1602電壓電流表程序中的幾個問題不懂,求解釋

[復制鏈接]
跳轉到指定樓層
樓主
//stc12c5a60                        
#include<STC12C5A60S2.h>
#include<stdio.h>
#include<intrins.h>//頭文件

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

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

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

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

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

void main()
{
        ulint tempv,tempa;//存放電壓電流值
        AD_init();//ADC初始化
        timer_init();//定時器初始化
        LCD_init();//LCD初始化
        while(1)
        {
                tempv=filter(0x88);//設置ADC通道0、開始轉換
                tablex(tempv*3);//分解數據
                zhiling(0x80);//LCD地址
                LCD_data(table[h1]);//
                LCD_data(table[h2]);//
                LCD_data(table1[0]);//
                LCD_data(table[h3]);//
                LCD_data(table[h4]);//
                LCD_data(table1[1]);//顯示

                tempa=filter(0x8f);//設置ADC通道7、開始轉換
                if(tempa<=10)//防止數據成負數
                        tempa=10;
                mas=tempa*3-30;//計算容量取樣賦值
                tablex(tempa*3-30);//減去LM358失調的數值
                zhiling(0x88);//LCD地址
                LCD_data(table[h1]);
                LCD_data(table1[0]);
                LCD_data(table[h2]);
                LCD_data(table[h3]);
                LCD_data(table[h4]);
                LCD_data(table1[2]);

                tablex((tempv*3/10)*((tempa*3-30)/10)/10);//計算功率
                zhiling(0x80+0x40);
                LCD_data(table[h1]);
                LCD_data(table[h2]);
                LCD_data(table1[0]);
                LCD_data(table[h3]);
                LCD_data(table[h4]);
                LCD_data(table1[3]);

                tablex(maz/1000);//顯示MAH
                zhiling(0x88+0x40);
                LCD_data(table[h1]);
                LCD_data(table1[0]);
                LCD_data(table[h2]);
                LCD_data(table[h3]);
                LCD_data(table[h4]);
                LCD_data(table1[4]);

        }
}
//-------------------------------------------------------------
void delay(uint z)///////////////延時程序
{
   uint x,y;
   for(x=z;x>0;x--)
   for(y=19;y>0;y--);
}
void AD_init(void)/////////////////////初始化ADC
{
P1ASF=0xff;//P1口全部作為模擬功能AD使用
ADC_RES=0;//清零轉換結果寄存器高8位
ADC_RESL=0;//清零轉換結果寄存器低2位
ADC_CONTR=0x80;//開啟AD電源
delay(5);//等待1ms,讓AD電源穩定
}

uint AD_get(uchar haha )//ADC讀數
{
        uint rew;
        ADC_CONTR=haha;//開啟AD轉換
        _nop_(); _nop_(); _nop_(); _nop_();//要經過4個CPU時鐘的延時
        while(!(ADC_CONTR&0x10));//等待轉換完成
        ADC_CONTR&=0xe7;//關閉AD轉換,ADC_FLAG位由軟件清0
        rew=ADC_RES*4+ADC_RESL;//組合成10位
        delay(1);//等待
        return rew;//返回ADC值
}
void zhiling(uchar zhilin)//寫指令
{
        e=0;
        rs=0;
        rw=0;
        P0=zhilin;
        delay(20);
        e=1;
        delay(20);
        e=0;
}
void LCD_data(uchar shuju)//寫數據
{
        e=0;
        rs=1;
        rw=0;
        P0=shuju;
        delay(20);
        e=1;
        delay(20);
        e=0;
}
void LCD_init(void)//初始化LCD
{
delay(300);
zhiling(0x38);
delay(100);
zhiling(0x38);
delay(100);
zhiling(0x38);
delay(100);
zhiling(0x38);
zhiling(0x38);
zhiling(0x08);
zhiling(0x01);
zhiling(0x06);
zhiling(0x0c);
}
void tablex(uint tab1)//數據分解
{
        h1=tab1/1000;//1023//1
        h2=tab1%1000/100;//023//0
        h3=tab1%100/10;//23//2
        h4=tab1%10;//3
}
uint filter(uchar dat)//中位值濾波
{
   uint value_buf[N];
   uint count,i,j,temp;
   for(count=0;count<N;count++)
   {
                         AD_init();//初始化ADC
      value_buf[count] = AD_get(dat);//讀ADC數值
      delay(1);
   }
   for (j=0;j<N-1;j++)
   {
      for (i=0;i<N-j;i++)
      {
         if ( value_buf[ i]>value_buf[i+1] )
         {
            temp = value_buf[ i];
            value_buf[ i] = value_buf[i+1];
            value_buf[i+1] = temp;
         }
      }
   }
   return value_buf[(N-1)/2];
}
void timer_init(void)//定時器初始化
{
        TMOD=0x01;/////////設置工作方式1
        TH0=(65536-50000)/256;///////賦值
        TL0=(65536-50000)%256;
        EA=1;ET0=1;//開總中斷;開定時器中斷
        TR0=1;////////啟動計數器
}


程序如上,原貼連接:http://www.zg4o1577.cn/bbs/dpj-131969-1.html
看了很久其中幾句就是看不懂,哪位大神給講解下呀,謝謝
問題是下面幾句看不懂
tablex(tempv*3);//分解數據

if(tempa<=10)//防止數據成負數
                        tempa=10;
                mas=tempa*3-30;//計算容量取樣賦值
                tablex(tempa*3-30);//減去LM358失調的數值

tablex(maz/1000);//顯示MAH


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

使用道具 舉報

沙發
ID:213173 發表于 2019-8-7 09:34 | 只看該作者
軟件都是基于硬件條件編寫的,離開硬件電路圖,有些代碼是很難讀懂的。縱觀這程序,原作者的ADC電壓取樣電路可能是直接或通過分壓電阻取樣、電流取樣電路可能是毫歐級取樣電阻經運算放大器LM358放大取樣。經軟件濾波后獲取10位ADC數據,這些數據并不能直接顯示電壓和電流,需要經過運算和補償才能得到接近實際電壓和電流的值,并將此值通過LCD1602顯示出來。
回復

使用道具 舉報

板凳
ID:18488 發表于 2019-8-7 13:21 | 只看該作者

這個是電路圖能給幫忙講講嗎謝謝
回復

使用道具 舉報

地板
ID:213173 發表于 2019-8-8 06:34 | 只看該作者
maomaochong 發表于 2019-8-7 13:21
這個是電路圖能給幫忙講講嗎謝謝

樓主找的這個程序只能算是習作,有很多不成熟的地方。其運算ADC結果的方法也是粗淺的,以致樓主看不明白。
十位ADC結果換算成10進制(4舍5入):毫伏=(參考電壓*十位ADC結果*10000/1024+5)/10。
再將此值按前置電路的分壓比放大或運放放大倍數縮小,才能得到取樣點的實際值。
回復

使用道具 舉報

5#
ID:56665 發表于 2019-8-8 08:38 | 只看該作者
tablex(tempv*3);//分解數據, 就是10K電阻RP2調到了1.67K的位置。
回復

使用道具 舉報

6#
ID:18488 發表于 2019-8-9 10:10 | 只看該作者
maomaochong 發表于 2019-8-7 13:21
這個是電路圖能給幫忙講講嗎謝謝

非常感謝我研究研究
回復

使用道具 舉報

7#
ID:18488 發表于 2019-8-9 10:11 | 只看該作者
m182892 發表于 2019-8-8 08:38
tablex(tempv*3);//分解數據, 就是10K電阻RP2調到了1.67K的位置。

不理解
回復

使用道具 舉報

8#
ID:112138 發表于 2021-5-11 21:40 | 只看該作者

這個程序應該是不全的,不知道什么原因。tempv*3的意思是電壓取樣1/3,這是硬件決定的,所以結果要*3.
AD值讀出來不是電壓值,要和基準電壓AD換算轉成電壓值再分解顯示的,這個直接顯示肯定是錯的,這個程序是不能用的。還有MAZ是什么莫名其妙的突然就蹦出來顯示。搞不懂樓主轉過來看過沒有
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲 欧美 另类 综合 偷拍 | 欧美xxxx日本 | 日韩看片 | 久久成人午夜 | 亚洲免费精品一区 | 蜜桃精品视频在线 | 日韩精品色网 | 欧美男人天堂 | 久久综合久久久 | 久久久久久久久淑女av国产精品 | 国产精品国产成人国产三级 | 在线视频一区二区三区 | 久久久久国产 | 日本欧美在线 | 99精品欧美一区二区三区综合在线 | 一区欧美 | 精品日本中文字幕 | 成年人免费网站 | 欧美理论片在线观看 | 69av片| 一区二区在线不卡 | 中文字幕综合 | 欧美成人在线网站 | 亚洲一区二区三区视频免费观看 | 国产成人久久精品一区二区三区 | 性精品| 欧美 日韩 在线播放 | 亚洲欧美激情国产综合久久久 | 毛片网站在线观看视频 | 免费看黄色片 | 无码日韩精品一区二区免费 | 午夜国产 | 一区二区三区四区日韩 | 欧美久久久久久久久 | 国产精品一区二区视频 | 91av视频 | www.久草.com | 国产不卡一 | 成年人黄色一级片 | 国产精品久久久久aaaa九色 | 91一区二区三区在线观看 |