//STC15W408AS AD转换并用共阳极3461四位数码管显示
#include<reg52.h>
#include<intrins.h>
//----------定义特殊寄存器-------------
P1ASF=0x9d;
ADC_CONTR=0xbc;
ADC_RES=0xbd;
ADC_RESL=0xbe;
CLK_DIV=0x97;
//------全局变量申明-----------
unsigned char code weima[]={0xfe,0xfd,0xfb,0xf7}; //四位显示
unsigned char code duanma[]={0x05,0x7d,0x46,0x54,0x3c,0x94,0x84,0x5d,0x04,0x14};//段码以P30对应G,P31=C,P32=DP,P33=D,P34=E,P35=A,P36=F,P37=B
// 0 , 1, 2, 3, 4, 5, 6, 7, 8, 9
char wm; //位码权
unsigned int ch;
//---------------函数原型-------------------
void yanshi100ms(void); //延时函数原型
void yanshi500ms(void); //延时函数原型
void shuju(unsigned int chat); //ADC转换完成后数据处理函数原型
void xianshi(unsigned char duan); //显示程序原型
//----------------ADC转换-------------------
int main(void)
{
ADC_RES=0x00;
ADC_RESL=0x00;
P1ASF=0x01; //以P1.0为模拟信号输入口
ADC_CONTR=0x80; //开启ADC控制电源
yanshi100ms(); //调用延时函数
ADC_CONTR =0x88; //开启ADC转换,AD转换速度540个时钟周期转换一次;以P1.0作为A/D输入来用.
IE=0xa0; //开启ADC中断。
while(1)
{
shuju(ch); //调用显示程序
}
}
//--------延时----------------
void yanshi100ms(void)
{
unsigned int i;
for(i=0;i<100;i++)
_nop_();
}
//--------ADC中断--------------
void aea1_zhongduan(void) interrupt 5
{
ADC_CONTR &=0xef; //清零中断标志位
ADC_CONTR |=0x04; //ADC转换开始位置1
ch=(ADC_RES*4+ADC_RESL); //将转换好的数据传给ch
}
//------------ADC数据处理-------
void shuju(unsigned int chat)
{
int qianwei; //千位
int baiwei; //百位
int shiwei; //十位
int gewei; //个位
qianwei=baiwei=shiwei=gewei=0;
qianwei=chat/1000;
chat=chat%1000; //取模数
baiwei=chat/100;
chat=chat%100; //取模数
shiwei=chat/10;
gewei=chat%10;
xianshi(duanma[qianwei]); //显示千位
yanshi500ms();
xianshi(duanma[baiwei]); //显示百位
yanshi500ms();
xianshi(duanma[shiwei]); //显示十位
yanshi500ms();
xianshi(duanma[gewei]); //显示个位
yanshi500ms();
}
//---------------显示延时程序-------------
void yanshi500ms(void)
{
unsigned int yan;
for(yan=0;yan<500;yan++)
_nop_();
}
//---------------显示程序--------------------
void xianshi(unsigned char duan)
{
P2=weima[wm++];
P3=duan;
if(wm>=4)
wm=0;
}
以上问题是不管我怎么调接P1.0口输入电压,四位数码管时钟显示0000,请大侠帮忙分析。谢谢! |