想用STC12C5A60AD的P1口及其內(nèi)部的AD進(jìn)行電壓采集,看了關(guān)于STC12C5A60AD的AD轉(zhuǎn)換的資料,寫(xiě)了下面這樣的程序,調(diào)了兩三天,可是在液晶上顯示就是零,不知是怎么回事,各位幫忙指點(diǎn)一下,謝謝!
![]()
STC12c5a60ad.rar(3.46 KB, 下載次數(shù): 20)2011-12-12 10:49 上傳點(diǎn)擊文件名下載附件
#include
#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---基本指令動(dòng)作*/
? ?? ???wr_lcd (comm,0x01);? ?? ???/*清屏,地址指針指向00H*/
? ?? ???wr_lcd (comm,0x06);? ?? ???/*光標(biāo)的移動(dòng)方向*/
? ?? ???wr_lcd (comm,0x0c);? ?? ?? ?/*開(kāi)顯示,關(guān)游標(biāo)*/
}
void wr_lcd (uchar dat_comm,uchar content)? ?? ?//液晶時(shí)序
{
? ?? ?? ?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)? ?? ?? ???//寫(xiě)液晶
{
? ?? ?? ?? ???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個(gè)人認(rèn)為為右對(duì)齊。
? ?? ?? ?? ?P1ASF=0x07;? ?? ?? ?? ?? ? //取P1口前三個(gè)口為模擬輸入端
? ?? ?? ?? ?ADC_CONTR=0x80;? ?? ???//此寄存器后需加四個(gè)CPU時(shí)鐘延時(shí)才能保證電源被打開(kāi)
? ?? ?? ?? ?delay(30);
? ?? ?? ?? ?EA=1;
? ?? ?? ?? ?EADC=1;
? ?? ?? ?? ?init_lcd ();
? ?? ?? ???a=0;
? ?? ?? ???b=0;
? ?? ?? ???bai=0;
? ?? ?? ???shi=0;
? ?? ?? ???ge=0;
? ?? ?
? ?? ?? ???ADC_CONTR=0x88;? ?? ?? ?? ???//啟動(dòng)AD轉(zhuǎn)換
? ?? ?? ???delay(1);
}
void main()
{
? ?? ?? ???init();
? ?? ?? ? while(1);
}
void adc() interrupt 5
{
? ?? ???DPH=ADC_RES;
? ?? ???DPL=ADC_RESL;? ?? ?? ?? ???//將ADC轉(zhuǎn)換的結(jié)果送給DPTR
? ?? ???v=DPTR;
? ?? ?? ?v=v/1024;
? ?? ?? ?v=v*5;? ?? ?? ?//轉(zhuǎn)換成十進(jìn)制數(shù)
? ?? ?? ?bai=v/100;
? ?? ?? ?shi=v%100/10;
? ?? ?? ?ge=v%10;
? ?? ?? ?ADC_CONTR=0x80;? ?? ?? ???///此處要加AD中斷標(biāo)志清零
? ?? ???delay(30);
? ?? ?? ?wrs(0x83,bai,shi,ge);? ?? ?? ???//將數(shù)據(jù)送到液晶顯示
? ?? ?? ?delay(10);
? ?? ?? ?ADC_CONTR=0x88;? ?? ?? ???//此寄存器后需加四個(gè)CPU時(shí)鐘延時(shí)才能保證參數(shù)被寫(xiě)入
? ?? ?? ?delay(1);
}