本帖最后由 guofan1943 于 2011-12-12 11:04 编辑
想用STC12C5A60AD的P1口及其内部的AD进行电压采集,看了关于STC12C5A60AD的AD转换的资料,写了下面这样的程序,调了两三天,可是在液晶上显示就是零,不知是怎么回事,各位帮忙指点一下,谢谢!
STC12c5a60ad.rar
(3.46 KB)
#include<stcdycj.h>
#define uchar unsigned char
#define uint unsigned int
#define comm 0
#define dat 1
sfr16 DPTR=0x82;
sbit a=P1^3;
sbit b=P1^4;
sbit rs=P2^7;
sbit rw=P2^6;
sbit e=P2^5;
long v;
uchar bai,shi,ge;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void wr_lcd (uchar dat_comm,uchar content);
void init_lcd (void)
{
wr_lcd (comm,0x30); /*30---基本指令动作*/
wr_lcd (comm,0x01); /*清屏,地址指针指向00H*/
wr_lcd (comm,0x06); /*光标的移动方向*/
wr_lcd (comm,0x0c); /*开显示,关游标*/
}
void wr_lcd (uchar dat_comm,uchar content) //液晶时序
{
if(dat_comm)
{
rs=1; //data
rw=0; //write
}
else
{
rs=0; //command
rw=0; //write
}
P0=content; //output data or comm
e=1;
delay(10);
e=0;
}
void wrs(uchar p,uchar ba,uchar sh,uchar gee) //写液晶
{
wr_lcd(comm,0x30);
delay(10);
wr_lcd(comm,p);
delay(10);
wr_lcd(dat,0x30+ba);
delay(10);
wr_lcd(dat,0x30+sh);
delay(10);
wr_lcd(dat,0x30+gee);
}
void init()
{
/*ADC初始化*/
AUXR1=0x04; //十位ADC个人认为为右对齐。
P1ASF=0x07; //取P1口前三个口为模拟输入端
ADC_CONTR=0x80; //此寄存器后需加四个CPU时钟延时才能保证电源被打开
delay(30);
EA=1;
EADC=1;
init_lcd ();
a=0;
b=0;
bai=0;
shi=0;
ge=0;
ADC_CONTR=0x88; //启动AD转换
delay(1);
}
void main()
{
init();
while(1);
}
void adc() interrupt 5
{
DPH=ADC_RES;
DPL=ADC_RESL; //将ADC转换的结果送给DPTR
v=DPTR;
v=v/1024;
v=v*5; //转换成十进制数
bai=v/100;
shi=v%100/10;
ge=v%10;
ADC_CONTR=0x80; ///此处要加AD中断标志清零
delay(30);
wrs(0x83,bai,shi,ge); //将数据送到液晶显示
delay(10);
ADC_CONTR=0x88; //此寄存器后需加四个CPU时钟延时才能保证参数被写入
delay(1);
} |