帮忙解读一下这个C程序,用单片机做电压表的

帮忙解读一下这个C程序,用单片机做电压表的,第1张

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等内容对应的是显示缓存数据的初始化,相应的值必须结合硬件连接电路图才可以确定是初始化为什么样的显示字形...

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=1s2=0}

#define _v10 {s1=0s2=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>0i--)

{

for(j=0j<125j++) ;循环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。

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7973725.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-12
下一篇 2023-04-12

发表评论

登录后才能评论

评论列表(0条)

保存