一、stc15ADC模块使用
和ADC转换有关的寄存器
一)P1ASF //设置P1口做普通IO口还是ADC输入口,0--普通IO口,1--ADC入。二)P1M0、P1M1、这两个寄存器的相同位状态决定P1口的输入状态,共00 01 10 11,四种状态,其中:
00是传统准双向I/O口(弱上拉,灌电流20mA,拉电流为230uA)
01推挽输出(强上拉输出,电流可达20mA,需加限流电阻,建议尽量少用)
10高阻输入(电流既不能流入也不能流出,在I/O做AD转换时可用此模式)
11开漏,此模式也可做为ADC转换常采用的状态
三)ADC_CONTR不能位寻址,最好赋值 D7是开关ADC电源开关,0关,1开;D6D5为转换速度,00最慢,11最快,D4转换标志位,当转换完成后自动为1,未完成就为0,D3为转换开始位,1开始,0等待,D2D1D0为输入选择,由于是8路可转换,选择那一路有着三位确定。000---111分别P10---P17。
四)CLK_DIV,这个寄存器主要是分频用,但是它的D5位用来设置转换结果的存储方式,0时CLK_DIV的D5位为0,转换结果高8位存ADC_RES,低2位存ADC_RESL的低两位,1时转换结果低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,对于的P1脚位ADC输入模式,为0是普通IO模式
CLK_DIV | = 0x20; //CLK_DIV的D5位为0,转换结果高8位存ADC_RES,低2位存ADC_RESL的低两位;
//CLK_DIV的D5位为1,转换结果低8位存ADC_RESL,高2位存ADC_RES的低两位;
ADC_CONTR |=0x80; //开AD转换电源 1000 0000
delay(80);
P1M0=0x04; //0000 0100
P1M1=0x04; //0000 0100 //设置P1.3为AD转换输入模式
}
uint ADC()
{
unsigned char DATA_H,DATA_L;
ADC_DATA =0; //清除转换结果
ADC_CONTR =0xE0; //保持电源开,设置转换速度 1110 0000
_nop_();
_nop_();
_nop_();
_nop_();
ADC_CONTR =0xE3; /保持电源开,保持转换速度,并选择P1.3输入 1110 0011
delay(10);
ADC_CONTR =0xEB; // 开转换开关 ,开始转换 1110 1011
while(ADC_CONTR & 0x10==0);//查询转换是否结束,结束后读取结果
ADC_CONTR &=0xE7;/清除转换结果标志位,关闭转换
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); //返回转化结果
}
void main(void)
{
ADC_init();
while(1)
{
ADC();
}
}
二、DS1302芯片的使用

SPI通信时序图




#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);
}
}