切换到宽版
  • 6366阅读
  • 21回复

[C51]使用TFT彩色液晶屏制作电压电流表(程序) [复制链接]

上一主题 下一主题
离线twelveboy
 

发帖
358
M币
1080
专家
14
粉丝
48
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2018-07-29
做了一个电压电流表,制作过程见:http://bbs.mydigit.cn/read.php?tid=2487981
对于程序我水平比较差,到处抄,然后自己乱改。现在将程序贴上希望高人给看看。


这是主程序:


#include <STC15F.h>
#include <intrins.h>
#include <sys\sys.h>
#include <lcd\lcd.h>
#include <font\font.h>

unsigned int VREF,VA,VB,VC,UA,UB,UC; //VREF  p1.0口测量值(参考电压),VA p1.1测量值,VB p1.2测量值    VC p1.3测量值  UA,UB,UC计算值

//............AD采集子程序.................//
void ADCINT()
{

   P1ASF=0xff;//设置 P1.0~P1.7全为AD口,根据实际设置。
   ADC_RES=0;//ad清0
   ADC_RESL=0;
  
   AUXR1=0x00;//设置数据方式,高8位+低2位方式,易于运算。
}

unsigned int ADCwrite(unsigned ch)
{ //由于所检测的电压不用快,所以采用查询或延时法,没用中断法。 ch通道值从0-7,对应为P1.0-P1.7
    unsigned int x;
    ADC_CONTR=0xc8+ch;//设置启动 11001000 ,power=1,speed=10,ADC_FLAG=0,ADC_START=1,CHS=0

  _nop_(); _nop_(); _nop_(); _nop_();//要经过4个CPU时钟的延时

    while ( !(ADC_CONTR & 0x10) );//等待A/D转换结束(ADC_FLAG==0)
    ADC_CONTR &= 0xE7;             //11100111,置ADC_FLAG=0清除结束标记, 置ADC_START=0关闭A/D 转换    
                        
      x=(ADC_RES*4+ADC_RESL);         //ADC_RES*4相当于前移两位
  delayms(1);
  return x;
}


//..........以下是采集过程,电压采集10次,全相加存入存贮...........
void ADvolcaiji()
{  
unsigned char x;
    unsigned long y;
  VREF=0;VA=0;VB=0;VC=0;    //先清空电压存贮。

     for(x=0;x<10;x++)//采集10次。

  {
      VREF=ADCwrite(0)+VREF;   //电压基准     p1.0接的TL431电压基准
        delayms(1);
      
        VA=ADCwrite(1)+VA;    //测量电流    p1.1口
        delayms(1);

      VB=ADCwrite(2)+VB;    //测量的电压    p1.2口
        delayms(1);
    
          VC=ADCwrite(3)+VC;    //测量的电压    p1.3口
        delayms(1);

        
  }  
//以下为计算
/******************************************************************
显示函数转换函数:
VV=模拟量采样值,UREF=基准电压源采样值(需要实测为2.503V),UV=模拟量输入值(待显示值)

UREF=1024*TL431REF/Vcc;变形后得Vcc=1024*TL431REF/UREF; 代入VV=1024*UV/Vcc;得到VV=UV*UREF/TL431REF;

变形后得UV=(VV*TL431REF/UREF)/分压比 。
******************************************************************/
  

    y=(long)(VA-*2.507*1000/VREF)*0.5;  //电流0.01欧的取样电阻,运放放大倍数50,为了计算方便乘以1000(三位小数)
    UA=y;

       y=(long)((VB+5)*2.507*1000/VREF)*0.5;//    电流的值变动较大,各位高人怎样处理?
    UB=y;

    y=(long)VC*3.05*100*2.507/VREF; //6.1是分压比,2.507为TL431基准电压,100是为了方便计算(电压取两位小数),
        UC=y;                        // 结果显示出来不知道为什么大了一倍,改成3.05就对了    ,好奇怪


}



/**************************************************
  文件名称:                  main.c
**************************************************/
main()
{

P1M1=0xff;
P1M0=0x00;
    Lcd_Init();   //tft初始化
    LCD_Clear(BLACK); //清屏

    BACK_COLOR=BLACK;
      POINT_COLOR=BLUE;
    // 横坐标,纵坐标,第几个字从0个字开始计算
   showchar816(0,0,13);
    showchar816(8,0,13);
   showchar816(16,0,13);
   showchar816(24,0,13);
   showchar816(32,0,13);
   showchar816(48,0,11); //V
   showchar816(56,0,6);     //o
   showchar816(64,0,4);     //l
   showchar816(72,0,8);    // t
   showchar816(80,0,0);    //a
   showchar816(88,0,3); //g
   showchar816(96,0,2);    //e
    showchar816(112,0,13);
    showchar816(120,0,13);
   showchar816(128,0,13);
   showchar816(136,0,13);
   showchar816(144,0,13);
  showchar816(152,0,13);

       POINT_COLOR=RED;
       showchar1632(32,16,0);  //0
    showchar1632(48,16,0);  //0
    showchar1632(64,16,10);  //.
    showchar1632(80,16,0);  //0
    showchar1632(96,16,0);  //0
    showchar1632(128,16,12);  //V
    
    POINT_COLOR=BLUE;
  showchar816(0,48,13);
    showchar816(8,48,13);
   showchar816(16,48,13);
   showchar816(24,48,13);
   showchar816(32,48,13);
   showchar816(48,48,10); //C
   showchar816(56,48,12);     //u
   showchar816(64,48,7);     //r
   showchar816(72,48,7);    // r
   showchar816(80,48,2);    //e
   showchar816(88,48,5); //n
   showchar816(96,48,8);    //t
    showchar816(112,48,13);
    showchar816(120,48,13);
   showchar816(128,48,13);
   showchar816(136,48,13);
   showchar816(144,48,13);
  showchar816(152,48,13);

  
      POINT_COLOR=BRRED;    
  showchar1632(0,64,13);
  showchar1632(16,64,15);
  showchar1632(32,64,16);
      POINT_COLOR=CYAN;
   showchar1632(64,64,0);  //0
    showchar1632(80,64,10);  //0
    showchar1632(96,64,0);  //.
    showchar1632(112,64,0);  //0
    showchar1632(128,64,0);  //0
    showchar1632(144,64,11);  //A
  POINT_COLOR=BRRED;
  showchar1632(0,96,17);
  showchar1632(16,96,14);
  showchar1632(32,96,16);
      POINT_COLOR=CYAN;
  showchar1632(64,96,0);  //0
    showchar1632(80,96,10);  //0
    showchar1632(96,96,0);  //.
    showchar1632(112,96,0);  //0
    showchar1632(128,96,0);  //0
    showchar1632(144,96,11);  //A


    while(1)
    {
        ADvolcaiji();        //数据采集
    
        //显示电压V
         if(UC<1000)    //如果电压小于
        {
        POINT_COLOR=RED;
      showchar1632(32,16,18);           //显示“空格”
      showchar1632(48,16,UC/100);      //个位
      showchar1632(64,16,10);          // 小数点
      showchar1632(80,16,UC%100/10);  //十分位
      showchar1632(96,16,UC%10);      //百分位
         }
     else
        {
        POINT_COLOR=RED;
       showchar1632(32,16,UC/1000);
      showchar1632(48,16,UC%1000/100);
      showchar1632(64,16,10);
      showchar1632(80,16,UC%100/10);
      showchar1632(96,16,UC%10);
         }
  
  
    //显示电流A    设置值
        if(UA>9999)    //如果电流大于
        {
        POINT_COLOR=CYAN;
      showchar1632(64,64,11);         //显示A表示超量程
      showchar1632(80,64,18);         //显示空格
      showchar1632(96,64,18);     //显示空格
      showchar1632(112,64,18);     //显示空格
      showchar1632(128,64,18);       //显示空格
        }
        else
        {
            if(UA>1)
               {
               POINT_COLOR=CYAN;
            showchar1632(64,64,UA/1000);    //0.000三位小数电流值显示
            showchar1632(80,64,10);
            showchar1632(96,64,UA%1000/100);
            showchar1632(112,64,UA%100/10);
            showchar1632(128,64,UA%10);
               }
            else
               {
               POINT_COLOR=CYAN;
                showchar1632(64,64,0);      //显示0
                showchar1632(80,64,10);      //显示.
                showchar1632(96,64,0);      //显示0
                   showchar1632(112,64,0);      //显示0
                showchar1632(128,64,0);      //显示0
                
               }
          }


    //显示电流A    实测值
        if(UB>9999)    //如果电流大于
        {
        POINT_COLOR=CYAN;
      showchar1632(64,96,11);         //显示A表示超量程
      showchar1632(80,96,18);         //显示空格
      showchar1632(96,96,18);     //显示空格
      showchar1632(112,96,18);     //显示空格
      showchar1632(128,96,18);       //显示空格
       }
        else
        {
            if(UB>1)
            {
            POINT_COLOR=CYAN;
            showchar1632(64,96,UB/1000);    //0.000三位小数电流值显示
            showchar1632(80,96,10);
            showchar1632(96,96,UB%1000/100);
            showchar1632(112,96,UB%100/10);
            showchar1632(128,96,UB%10);
            }
            else
               {
               POINT_COLOR=CYAN;
                showchar1632(64,96,0);      //显示0
                showchar1632(80,96,10);      //显示.
                showchar1632(96,96,0);      //显示0
                   showchar1632(112,96,0);      //显示0
                showchar1632(128,96,0);      //显示0
                
                }    
         }
        
        delayms(200);
    

}

}
本帖最近打赏记录:共3条打赏 ,M币+17 ,专家+1
zhkrid M币 +8 666 2018-07-30
温力口 专家 +1 谢谢分享。。。。收藏备用。。。。 2018-07-29
温力口 M币 +9 谢谢分享。。。。收藏备用。。。。 2018-07-29
离线twelveboy

发帖
358
M币
1080
专家
14
粉丝
48
只看该作者 1楼 发表于: 2018-07-29
请登录后查看
离线twelveboy

发帖
358
M币
1080
专家
14
粉丝
48
只看该作者 2楼 发表于: 2018-07-29
请登录后查看
离线twelveboy

发帖
358
M币
1080
专家
14
粉丝
48
只看该作者 3楼 发表于: 2018-07-29
请登录后查看
本帖最近打赏记录:共1条打赏 ,M币+8
qiang7260 M币 +8 優秀文章 2018-08-01
离线twelveboy

发帖
358
M币
1080
专家
14
粉丝
48
只看该作者 4楼 发表于: 2018-07-29
请登录后查看
本帖最近打赏记录:共1条打赏 ,M币+20
数码家园 M币 +20 收藏起来先 2018-07-30
离线live517
发帖
6
M币
-9
专家
0
粉丝
0
只看该作者 5楼 发表于: 2018-07-29
请登录后查看
离线bxak

发帖
800
M币
325
专家
11
粉丝
91
只看该作者 6楼 发表于: 2018-07-29
请登录后查看
离线la45088d1

发帖
1006
M币
635
专家
10
粉丝
34
只看该作者 7楼 发表于: 2018-07-29
请登录后查看
离线twelveboy

发帖
358
M币
1080
专家
14
粉丝
48
只看该作者 8楼 发表于: 2018-07-29
请登录后查看
离线温力口

发帖
60313
M币
51283
专家
569
粉丝
909
只看该作者 9楼 发表于: 2018-07-29
请登录后查看
快速回复
限80 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
上一个 下一个