粗心也好,细心也罢。多不是关键。
程序修改ok,我用这个做了个量程为0-3.3的数字电压表。程序如下:
接下来我想用这个来做servo,想用pid来做,但是机床上用的是频率作为输入信号。
现在看来只能做fid了。
不知道有谁搞过pid算法,可以交流交流。
#include<pic.h>
__config(0x3b32);
#define uchar unsigned char
#define uint unsigned int
#define nop() asm("nop")
uint ad_val();
void init();
void delay(uint x);
const uchar table[]={0xd7,0x12,0xcb,0x5b,0x1e,0x5d,0xdd,0x13,0xdf,0x5f};
void dsp(uchar num1,uchar num2,uchar num3);
void sc();
void main()
{
init();
while(1)
{
uint lednum;
uchar bai,shi,ge;
lednum=ad_val();
bai=lednum/1000;
shi=lednum%1000/100;
ge=lednum%100/10;
dsp(bai,shi,ge);
}
}
void init()
{
trisa=0x01;
trisb=0;
trise=0;
trisd=0;
trisc=0xff;
porte=0;
portd=0;
portb=0;
porta=0;
porte=0x06;
delay(2);
porte=0;
cmcon=0x07;//关比较器
adcon0=0x81;//1/64,ch0,power on
adcon1=0xce;//数据右对齐an0为模拟输入。
}
uint ad_val()
{
uint val;
float valf;
adgo=1;
while(adgo);
val=adresh;
val=val<<8|adresl;
valf=val/1023.0*3.3;
val=valf*1000;
return (val);
}
void dsp(uchar num1,uchar num2,uchar num3)
{
portb=table[num1];//显示第一个数码管
portd=0x04;
sc();
delay(2);
portb=table[num2];//显示第二个数码管
portd=0x02;
sc();
delay(2);
portb=table[num3];//显示第三个数码管
portd=0x01;
sc();
delay(2);
}
void sc()
{
porte=0;
delay(2);
porte=0x06;
delay(2);
porte=0;
delay(2);
}
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}