一、stc15ADC模塊使用
和ADC轉(zhuǎn)換有關(guān)的寄存器
一)P1ASF //設(shè)置P1口做普通IO口還是ADC輸入口,0--普通IO口,1--ADC入。二)P1M0、P1M1、這兩個(gè)寄存器的相同位狀態(tài)決定P1口的輸入狀態(tài),共00 01 10 11,四種狀態(tài),其中:
00是傳統(tǒng)準(zhǔn)雙向I/O口(弱上拉,灌電流20mA,拉電流為230uA)
01推挽輸出(強(qiáng)上拉輸出,電流可達(dá)20mA,需加限流電阻,建議盡量少用)
10高阻輸入(電流既不能流入也不能流出,在I/O做AD轉(zhuǎn)換時(shí)可用此模式)
11開漏,此模式也可做為ADC轉(zhuǎn)換常采用的狀態(tài)
三)ADC_CONTR不能位尋址,最好賦值 D7是開關(guān)ADC電源開關(guān),0關(guān),1開;D6D5為轉(zhuǎn)換速度,00最慢,11最快,D4轉(zhuǎn)換標(biāo)志位,當(dāng)轉(zhuǎn)換完成后自動(dòng)為1,未完成就為0,D3為轉(zhuǎn)換開始位,1開始,0等待,D2D1D0為輸入選擇,由于是8路可轉(zhuǎn)換,選擇那一路有著三位確定。000---111分別P10---P17。
四)CLK_DIV,這個(gè)寄存器主要是分頻用,但是它的D5位用來設(shè)置轉(zhuǎn)換結(jié)果的存儲(chǔ)方式,0時(shí)CLK_DIV的D5位為0,轉(zhuǎn)換結(jié)果高8位存ADC_RES,低2位存ADC_RESL的低兩位,1時(shí)轉(zhuǎn)換結(jié)果低8位存ADC_RESL,高2位存ADC_RES的低兩位;
#include"stc15.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
uint ADC_DATA;
void delay(uchar ms)
{
uchar i;
while(ms--)
for(i=0;i<120;i++);
}
void ADC_init(void)
{
P1=0xff;
P1ASF=0x08; //P1ASF的哪一位為1,對(duì)于的P1腳位ADC輸入模式,為0是普通IO模式
CLK_DIV | = 0x20; //CLK_DIV的D5位為0,轉(zhuǎn)換結(jié)果高8位存ADC_RES,低2位存ADC_RESL的低兩位;
//CLK_DIV的D5位為1,轉(zhuǎn)換結(jié)果低8位存ADC_RESL,高2位存ADC_RES的低兩位;
ADC_CONTR |=0x80; //開AD轉(zhuǎn)換電源 1000 0000
delay(80);
P1M0=0x04; //0000 0100
P1M1=0x04; //0000 0100 //設(shè)置P1.3為AD轉(zhuǎn)換輸入模式
}
uint ADC()
{
unsigned char DATA_H,DATA_L;
ADC_DATA =0; //清除轉(zhuǎn)換結(jié)果
ADC_CONTR =0xE0; //保持電源開,設(shè)置轉(zhuǎn)換速度 1110 0000
_nop_();
_nop_();
_nop_();
_nop_();
ADC_CONTR =0xE3; /保持電源開,保持轉(zhuǎn)換速度,并選擇P1.3輸入 1110 0011
delay(10);
ADC_CONTR =0xEB; // 開轉(zhuǎn)換開關(guān) ,開始轉(zhuǎn)換 1110 1011
while(ADC_CONTR & 0x10==0);//查詢轉(zhuǎn)換是否結(jié)束,結(jié)束后讀取結(jié)果
ADC_CONTR &=0xE7;/清除轉(zhuǎn)換結(jié)果標(biāo)志位,關(guān)閉轉(zhuǎn)換
DATA_H=ADC_RES;
DATA_L=ADC_RESL;
ADC_DATA=DATA_H;
ADC_DATA=ADC_DATA<<2;
ADC_DATA |=ADC_RESL;
ADC_CONTR=0x00;
return(ADC_DATA); //返回轉(zhuǎn)化結(jié)果
}
void main(void)
{
ADC_init();
while(1)
{
ADC();
}
}
二、DS1302芯片的使用

SPI通信時(shí)序圖




#include"reg52.h"
#include"intrins.h"
#define uchar unsigned char
sbit rs=P2^0;
sbit rw=P2^1;
sbit en=P2^2;
sbit rst =P2^3;
sbit sclk=P2^4;
sbit DI =P2^5;
sbit A7=ACC^7;
sbit A0=ACC^0;
sbit B0=B^0;
uchar tt0[]="Time:";
uchar tt1[]="Data:";
void delay(uchar us)
{
while(us--);
}
void w1602(uchar dat,bit r)
{
rs=r;
rw=0;
P3=dat;
en=0;
delay(2);
en=1;
delay(4);
en=0;
}
void init1602()
{
w1602(0x38,0);
w1602(0x06,0);
w1602(0x0c,0);
w1602(0x01,0);
}
uchar r1302(uchar addr)
{
uchar n;
rst=0;
sclk=0;
_nop_();
rst=1;
B=addr;
for(n=0;n<8;n++)
{
sclk=0;
DI=B0;
sclk=1;
B=B>>1;
}
for(n=0;n<8;n++)
{
A7=DI;
sclk=1;
ACC=ACC>>1;
sclk=0;
}
rst=0;
return(ACC);
}
void main()
{
uchar i;
init1602();
while(1)
{
w1602(0x80,0);
for(i=0;i<5;i++)
w1602(tt0[i],1);
w1602(0x30+(r1302(0x85)>>4 & 0x0f),1);
w1602(0x30+(r1302(0x85) & 0x0f),1);
w1602(0x2d,1);
w1602(0x30+(r1302(0x83)>>4 & 0x0f),1);
w1602(0x30+(r1302(0x83) & 0x0f),1);
w1602(0x2d,1);
w1602(0x30+(r1302(0x81)>>4 & 0x0f),1);
w1602(0x30+(r1302(0x81) & 0x0f),1);
w1602(0xc0,0);
for(i=0;i<5;i++)
w1602(tt1[i],1);
w1602(0x30+(r1302(0x87)>>4 & 0x0f),1);
w1602(0x30+(r1302(0x87) & 0x0f),1);
w1602(0x2d,1);
w1602(0x30+(r1302(0x89)>>4 & 0x0f),1);
w1602(0x30+(r1302(0x89) & 0x0f),1);
w1602(0x2d,1);
w1602(0x30+(r1302(0x8d)>>4 & 0x0f),1);
w1602(0x30+(r1302(0x8d) & 0x0f),1);
}
}