要求:取电位器电压,经12C5A60S2单片机内部A/D转换0--5V 对数字量0--1024电压,通过旋转电位器利用每一个整电压之间来控制一个状态,现在程序很不稳定,帮我看看啊!急急急急、、、
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
sfr P1ASF=0x9d;
sfr ADC_CONTR =0xbc; //power speed1 speed0 flag st chs2 chs1 chs0
sfr ADC_RES=0xbd;
sfr ADC_RESL=0xbe;
sbit ser=P2^1; //LED显示 595数据输入
sbit srclk1=P2^2; //
sbit rclk1=P2^3; //
sbit BEEP=P3^2;
sbit led=P1^7;
uchar th0_f; //在中断中装载的T0的值高8位
uchar tl0_f; //在中断中装载的T0的值低8位
uchar idata LED[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xfe,0xbf};//共阳极段码表说明
uchar idata bb[]={0,0,10,0,11,11,11,11},cc[]={0,0,10,0,11,11,11,11};
uchar code freq[36*2]={ //T0的值,及输出频率对照表
0xa9,0xef,//00220HZ,1 //0
0x93,0xf0,//00233HZ,1#
0x73,0xf1,//00247HZ,2
0x49,0xf2,//00262HZ,2#
0x07,0xf3,//00277HZ,3
0xc8,0xf3,//00294HZ,4
0x73,0xf4,//00311HZ,4#
0x1e,0xf5,//00330HZ,5
0xb6,0xf5,//00349HZ,5#
0x4c,0xf6,//00370HZ,6
0xd7,0xf6,//00392HZ,6#
0x5a,0xf7,//00415HZ,7
0xd8,0xf7,//00440HZ 1 //12
0x4d,0xf8,//00466HZ 1# //13
0xbd,0xf8,//00494HZ 2 //14
0x24,0xf9,//00523HZ 2# //15
0x87,0xf9,//00554HZ 3 //16
0xe4,0xf9,//00587HZ 4 //17
0x3d,0xfa,//00622HZ 4# //18
0x90,0xfa,//00659HZ 5 //19
0xde,0xfa,//00698HZ 5# //20
0x29,0xfb,//00740HZ 6 //21
0x6f,0xfb,//00784HZ 6# //22
0xb1,0xfb,//00831HZ 7 //23
0xef,0xfb,//00880HZ '1
0x2a,0xfc,//00932HZ '1#
0x62,0xfc,//00988HZ '2
0x95,0xfc,//01046HZ '2#
0xc7,0xfc,//01109HZ '3
0xf6,0xfc,//01175HZ '4
0x22,0xfd,//01244HZ '4#
0x4b,0xfd,//01318HZ '5
0x73,0xfd,//01397HZ '5#
0x98,0xfd,//01480HZ '6
0xbb,0xfd,//01568HZ '6#
0xdc,0xfd,//01661HZ '7 //35
};
timer0() interrupt 1 //定时中断0,用于产生歌唱频率
{
TL0=tl0_f; //调入预定时值
TH0=th0_f;
BEEP=~BEEP; //取反音乐输出IO
P2=~P2;
}
void delayXms(uint n)
{
uint i,j;
for(i=0;i<n;i++)
for(j=0;j<125;j++);
}
void outbyte(uchar a,b)
{
uchar j;
for(j=0;j<8;j++) //位码移位串行输出
{ if(a&0x80) ser=1; else ser=0;
a=a<<1;
srclk1=0;
srclk1=1;
}
for(j=0;j<8;j++) //位码移位串行输出
{ if(b&0x80) ser=1; else ser=0;
b=b<<1;
srclk1=0;
srclk1=1;
}
rclk1=0; //595锁存脉冲
rclk1=1;
}
/*void AD_init() //ADC初始化
{
ADC_CONTR|=0x80; //开ADC电源
P1M0=0x01;
P1M1=0x00;
ADC_CONTR&=0xf8;
} */
//--------------------------------------------------------------------
uint GET_AD_Result()//启动AD转换并返回转换值
{
uchar temp;
uint data_temp;
data_temp=0;
ADC_RES=0;
ADC_RESL=0;
ADC_CONTR|=0x08;//启动AD
re: temp=0x10;
temp&=ADC_CONTR;//查询ADC_FLAG,忙标志,转换完否
if(temp==0)
goto re;
ADC_CONTR&=0xe0;//P1.0为AD输入口
data_temp=ADC_RES;
data_temp<<=2;
data_temp+=ADC_RESL;
return data_temp;
}
//--------------------------------------------------------------------
void main(void) using 0
{
uint result,temp,i,a,c,d,e,f;
uchar aa[3]={0,0,0};
P1ASF=0x01;
ADC_CONTR=0xe0; //P1.0为AD输入口
while(1)
{
ulong n;
uchar i;
uchar code jie8[8]={12,14,16,17,19,21,23,24};//1234567'1 八个音符在频率表中的位置
TMOD=0x00; //使用定时器0的13位工作模式 0x00效果更好
TR0=1;
ET0=1;
EA=1;
result=GET_AD_Result();
aa[2]=result*5/1024; //模拟量显示0-5v 数学转换
bb[0]=6;
bb[1]=0;
bb[2]=1;
bb[3]=1;
bb[4]=3;
bb[5]=1;
bb[6]=8;
bb[7]=0;
cc[0]=0;
cc[1]=8;
cc[2]=1;
cc[3]=3;
cc[4]=1;
cc[5]=1;
cc[6]=0;
cc[7]=6;
e=0xfe;
f=aa[2]%10;
if(f==0) //控制蜂鸣器
{
delayXms(1000);
if(f==0)
{
for(i=0;i<8;i++) //循环播放8个音符
{
tl0_f=freq[jie8[i]*2]; //置一个音符的值
th0_f=freq[jie8[i]*2+1];
for(n=0;n<50000;n++); //延时1秒左右
}
}
}
if(f==1)
{
delayXms(1000);
if(f==1)//显示学号
{
for(i=0;i<8;i++)
{
d=LED[cc[i]];
if(i==2) c=c&0x7f;
outbyte(e,d);
e=(e<<1)|0x01;
}
}
} ;
if(f==2) //学号显示
{ delayXms(1000);
if(f==2)
{
for(i=0;i<8;i++)
{
d=LED[bb[i]];
if(i==2) c=c&0x7f;
outbyte(e,d);
e=(e<<1)|0x01;
}
}
} ;
if(f==3)
{
delayXms(1000);
if(f==3)
{
for(i=0;i<8;i++)
{
d=LED[cc[i]];
if(i==2) c=c&0x7f;
outbyte(e,d);
e=(e<<1)|0x01;
}
}
} ;
}
} |