求量程自动切换电压表的C程序翻译

核心提示unsigned char code dispbitcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};数码管显示的段码:打括弧内的数值分别对应0、1、2、3、4、5、6、7

unsigned char code dispbitcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

数码管显示的段码:打括弧内的数值分别对应0、1、2、3、4、5、6、7、8、9

例如:0x3f,表示低6位为1,第7位为0,七段数码管中,只有一段(中间段)不亮,显示“0”,倒数第二个0x7f表示7位全部为1,七段码全亮,显示“8”。

unsigned char dispbuf[4];定义显示缓冲区,4字节,分别表示4个数码管。

unsigned int i;临时变量,一般用作循环计数

unsigned int j;临时变量,一般用作循环计数

unsigned int getdata;

unsigned int temp;

unsigned int temp1;

unsigned char count;

unsigned char d;

sbit ST=P2^4; 位定义,P2.4定义为ST

sbit OE=P2^5;

sbit EOC=P2^6;

sbit CLK=P2^7;

sbit ADD_A=P3^4; //选择AD的输入端

sbit ADD_B=P3^5;

sbit ADD_C=P3^6;

sbit D0=P2^0; //数码管的位控制端

sbit D1=P2^1;

sbit D2=P2^2;

sbit D3=P2^3;

sbit P17=P1^7; //确定小数点的位置

sbit s1=P3^2;

sbit s2=P3^3;

#define _v0_5 {s1=1;s2=0;}

#define _v10 {s1=0;s2=1;}

unsigned char m;

void TimeInitial();

void Delay(unsigned int i);

void TimeInitial() 定时器初始化

{ TMOD=0x10; 定时器模式设置,T1工作在模式1,16为定时器,循环计数。

TH1=(65536-200)/256;

TL1=(65536-200)%256;定时器赋初始值,分别为65536-200的高字节和低字节,定时器幅值后,计数200次溢出。假设时钟周期为1uS,定时器200uS溢出一次

EA=1; 开中断

ET1=1; 允许外部中断1

TR1=1; 定时器1启动

}

void Delay(unsigned int i) 延时子程序

{

unsigned int j;

for(;i>0;i--)

{

for(j=0;j<125;j++) ;循环125*i次,

{;}

}

}

void Display() ;显示子程序

{

P1=dispbitcode[dispbuf[3]]; 将显示缓冲区的第三个数送至P1口

D0=0;

D1=1;

D2=1;

D3=1; D0(P2.0)输出低电平,左侧起第一个数码管选通,P1口的数据显示在最高位

Delay(10); ;延时10(具体时间可仿真测试)

P1=0x00; 熄灭数码管

P1=dispbitcode[dispbuf[2]];将显示缓冲区的第二个数送至P1口

if(m==2)

{

P17=1;

} ;如果m=2,点亮最高位的小数点

D0=1;

D1=0;

D2=1;

D3=1; D0(P2.0)输出低电平,左侧起第二个数码管选通,P1口的数据显示在次高位

Delay(10);

P1=0x00;

P1=dispbitcode[dispbuf[1]];

if(m==10)

{

P17=1;

}

D0=1;

D1=1;

D2=0;

D3=1;

Delay(10);

P1=0x00;

P1=dispbitcode[dispbuf[0]];

D0=1;

D1=1;

D2=1;

D3=0;

Delay(10);

P1=0x00;

}

void main()

{

TimeInitial(); 初始化定时器

ADD_A=0;

ADD_B=0;

ADD_C=0; 选择通道0信号至AD

_v10; 选择大量程

m=2; 定位小数点

while(1)

{

ST=0;

OE=0; 禁止AD读数

ST=1;

ST=0; 启动AD

while(EOC==0);

OE=1;

getdata=P0; EOC==0时,读取AD转换结果

OE=0;

if ((s1==0) && (s2==1) && (getdata<6)) 如果是大量程,且读数小于6

{

ADD_A=1;

_v0_5; 转换为小量程

m=10; 重新设置小数点位置

}

else if ((s1==1)&&(s2==0) && (getdata>254)) 如果是小量程,且读数大于254

{

ADD_A=0;

_v10; 转换为大量程

m=2; 重新设置小数点位置

}

temp=(getdata*1.0/255)*500*m; 根据小数点位置(量程)转换AD读取数据

dispbuf[0]=temp%10; 取10余数,相当于取temp个位

dispbuf[1]=temp/10%10;除以10之后取10余数,相当于取temp十位

dispbuf[2]=temp/100%10;除以100之后取10余数,相当于取temp百位

dispbuf[3]=temp/1000;除以1000,相当于取temp千位

Display();

}

}

void t1(void) interrupt 3 using 0

{

TH1=(65536-200)/256;

TL1=(65536-200)%256;

CLK=~CLK; 定时器中断,重新幅值,时钟取反。若系统时钟1uS,定时周期为200*2=400uS。

}

temp=getdata*235;

temp=temp/128;

应该是修正数值所用的, x = x*235/128 = x * 1.8359375;

如果AD的参考电压为 1.089V (2V/(235/128))的话,

那乘上的因子可以使得

x 电压值

0 -- 0V

255 -- 2V

dispbuf[0]=10;等内容对应的是显示缓存数据的初始化,相应的值必须结合硬件连接电路图才可以确定是初始化为什么样的显示字形...

 
友情链接
鄂ICP备19019357号-22