不知道程序出什么问题?大家帮帮忙,先谢过各位了
#include<reg51.h>
#include<intrins.h>
typedef unsigned int uint;
typedef unsigned char uchar;
#define ADC_POWER 0x80 //ADC转换
电源控制位
#define ADC_FLAG 0x10 //模数转换结束标志位
#define ADC_START 0x08 //模数转换启动控制启动位
#define SPEEDLL 0x00 //模数转换器控制位 540个时钟周期转化一次
#define SPEEDL 0x20 //360个时钟周期转化一次
#define SPEEDH 0x40 //180个时钟周期转化一次
#define SPEEDHH 0x60 //90个时钟周期转化一次
sfr ADC_CONTR=0xBC; //AD转换控制寄存器
sfr ADC_RES=0xBD; //AD转换寄存器高二位
sfr ADC_RESL=0xBE; //AD转换寄存器低八位
sfr P1ASF=0x9d; //AD转换通道
sbit D1=P2^0;
sbit D2=P2^1;
sbit D3=P2^2;
sbit D4=P2^3;
uchar stm[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void delay(uint z)
{uint a,b;
for(a=z;a>0;a--)
for(b=600;b>0;b--) ;
}
void display(int m)
{D1=1;
P0=~stm[m/1000];
delay(5);
D1=0;
D2=1;
P0=~stm[m/100%10];
delay(5);
D2=0;
D3=1;
P0=~stm[m/10%10];
delay(5);
D3=0;
D4=1;
P0=~stm[m%10];
delay(5);
D4=0;
}
uint AD_get(uchar ch)
{ADC_CONTR=0x88|ch;//开启AD转换,1000 1000,
_nop_(); //经过四个CPU时钟延时,转换值才进入ADC_CONTR
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR&0x10)) ;//等待转换结束
ADC_CONTR&=~ADC_FLAG; //Close ADC_CONTR
return (ADC_RES*4+ADC_RESL);//返回AD转换的十位值
}
float AD_work(uchar ch)
{float AD_val;
uchar i;
for(i=0;i<100;i++)
AD_val=AD_val+AD_get(ch);//利用AD_get()函数计算出转换的值
AD_val=AD_val/100;
AD_val=(AD_val*5)/256; //AD转换计算数值
return AD_val;//计算出模拟值
}
void seriat_init()
{SCON=0X50; //串口方式一,允许接收
TMOD=0x20; //T1自动装填八位数据
TH1=0xfd; //设置波特率 9600
TL1=0xfd;
TR1=1; //打开T1
}
void AD_init()
{P1ASF=0x04;//打开P1^2通道
ADC_RES=0;
ADC_RESL=0;
ADC_CONTR=ADC_POWER|SPEEDLL;
delay(2);
}
void main()
{int m;
float n;
uchar i;
AD_init();
seriat_init();
while(1)
{for(i=0;i<8;i++)
{
ti=1;
n+=AD_work(i);
TI=0;
delay(1000);
}
n=n/8;
m=(int)(n);
display(m);
}
}
一周热门 更多>