黄金会员 
 
主题
回帖0
积分5587
阅读权限40
注册时间2009-11-23
最后登录1970-1-1
在线时间 小时
 
 
 
 
 | 
 
想做个电流表,在网上搜索了2天没进展,只知道要显示电流的话,需要把电流转换成电压,然后看到最简单的方法是用电阻,然后测量电阻端的电压,但是没有具体的例子,下面是在阿莫那找到的电压表,有那位高手能告诉我怎么改成电流表不 
 
 
 
 
C代码如下: 
//-----------------------------------------------------------------  
#include <intrins.H>                  //头文件  
#include "STC_NEW_8051.H"             //STC自己的头文件  
#define uint unsigned int             //宏定义  
#define uchar unsigned char  
uint abc,tongd0,tongd7;               //定义uint型变量  
uchar tt0;                            //定义uchar型变量  
sbit gewei=P2^0;                      //个十百千位的位声明  
sbit shiwei=P2^1;  
sbit baiwei=P2^2;  
sbit qianwei=P2^3;  
sbit dian=P0^7;                       //小数点的声明  
uchar code led[]=  
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};  //定义0-9数字的编码  
void delay(uint z)                    //延时函数  
{  
     uint x,y;  
     for(x=z;x>0;x--)  
     for(y=100;y>0;y--);  
}  
void display()                        //显示函数  
{  
     qianwei=0;                       //显示千位  
     P0=led[abc/1000];  
     dian=0;  
     delay(50);  
     qianwei=1;  
 
     baiwei=0;                        //显示百位  
     P0=led[abc%1000/100];  
     delay(50);  
     baiwei=1;  
 
     shiwei=0;                        //显示十位  
     P0=led[abc%100/10];  
     delay(50);  
     shiwei=1;  
 
     gewei=0;                         //显示个位  
     P0=led[abc%10];  
     delay(50);  
     gewei=1;  
}  
 
//以下直接引用自STC的网站数模转换的例子-------------------------------------  
//以下选择 ADC 转换速率,只能选择其中一种  
//SPEED1 SPEED0  A/D转换所需时间  
#define AD_SPEED   0x60 //  0110,0000   1      1   70 个时钟周期转换一次,   
//CPU工作频率21MHz时 A/D转换速度约 300KHz  
//#define AD_SPEED   0x40 //0100,0000   1      0     140 个时钟周期转换一次  
//#define AD_SPEED   0x20 //0010,0000   0      1     280 个时钟周期转换一次  
//#define AD_SPEED   0x00 //0000,0000   0      0     420 个时钟周期转换一次  
 
uint get_AD_result(uchar channel)                   //模数转换程序  
{  
     uchar AD_finished=0;                           //存储 A/D 转换标志  
     ADC_RES = 0;  
     ADC_RESL = 0;  
     channel &= 0x07;                               //0000,0111 清0高5位  
     ADC_CONTR = AD_SPEED;  
     _nop_();  
     ADC_CONTR |= channel;                          //选择 A/D 当前通道  
     _nop_();  
     ADC_CONTR |= 0x80;                             //启动 A/D 电源  
     delay(1);                                                //使输入电压达到稳定  
     ADC_CONTR |= 0x08;                             //0000,1000 令 ADCS = 1, 启动A/D转换,   
     AD_finished = 0;   
     while (AD_finished ==0 )                       //等待A/D转换结束  
     {  
           AD_finished = (ADC_CONTR & 0x10);        //0001,0000 测试A/D转换结束否  
     }  
     ADC_CONTR &= 0xE7;                             //1111,0111 清 ADC_FLAG 位, 关闭A/D转换,   
     return (ADC_RES*4+ADC_RESL);                   //返回 A/D 高8位+低2位转换结果  
}  
 
//------下面是主函数--------  
void main()                                         //主程序  
{                                                   //进入主程序后先对定时器初始化  
 
      TMOD=0x01;                                    //设定定时器0工作方式    
      TH0=(65536-10000)/256;                        //定时器0高8位装初值  12M晶振定时10毫秒  
      TL0=(65536-10000)%256;                        //定时器0低8位装初值    
      ET0=1;                                        //开定时器0中断  
      TR0=1;                                        //启动定时器0  
      EA=1;                                         //开总中断  
 
      P1ASF = 0x81;                                 //1000,0001, 将 P1.0 P1.7 置成模拟口  
//    ADRJ = AUXR1^2:  
//    0: 10 位A/D 转换结果的高8 位放在ADC_RES 寄存器, 低2 位放在ADC_RESL 寄存器  
//    1: 10 位A/D 转换结果的最高2 位放在ADC_RES 寄存器的低2 位, 低8 位放在ADC_RESL 寄存器  
      AUXR1 &= ~0x04;                               //0000,0100, 令 ADRJ=0  
//    AUXR1 |= 0x04;                                //0000,0100, 令 ADRJ=1  
      ADC_CONTR |= 0x80;                            //1000,0000 打开 A/D 转换电源  
 
      while(1)  
     {  
           abc=(tongd0*1.0/tongd7)*2500;            //让abc等于通道0和通道7转换后的运算结果  
           display();                               //显示具体数字  
     }  
}  
 
void timer0() interrupt 1                           //定时器0服务程序  
{  
      TH0=(65536-10000)/256;                        //再装一次初值  
      TL0=(65536-10000)%256;  
      tt0++;  
      if(tt0==20)                                   //200ms转换一次  
     {   
           tt0=0;  
           tongd0=get_AD_result(0);                 //转换P0.0通道  
           tongd7=get_AD_result(7);                 //转换P0.7通道  
     }  
} |   
 
 
 
 |