今天下午把STC12C5A60S2的ADC转换函数写了,查询法只要检查ADC_FLAG是否为1,再进行相关程序就行了。下面这个是用中断法。这是STC技术手册上提供的中断号,直接在PDF上复制过来的,显示顺序乱了,自己可以在中断寄存器 那一节可以看到
?void Int0_Routine(void) interrupt 0;
void LVD_Routine(void) interrupt 6;
void ADC_Routine(void) interrupt 5;
void PCA_Routine(void) interrupt 7;
void Timer0_Routine(void) interrupt 1;
void Int1_Routine(void) interrupt 2;
void Timer1_Routine(void) interrupt 3;
void UART_Routine(void) interrupt 4;
void UART2_Routine(void) interrupt 8;
void SPI_Routine(void) interrupt 9;
STC12C5A60AD/S2系列带A/D转换的单片机的A/D转换口在P1口(P1.7-P1.0),有8路10位高速A/D转
换器,速度可达到250KHz(25 万次/ 秒)。8 路电压输入型A/D,可做温度检测、电池电压检测、按键扫描、
频谱检测等。上电复位后P1 口为弱上拉型I/O 口,用户可以通过软件设置将8 路中的任何一路设置为A/D
转换,不需作为A/D 使用的口可继续作为I/O 口使用。
具体寄存器设置见STC的datasheet.
注:此函数只是读取寄存器中的值,没有进行电压的转换
#include <reg52.h>
#include <lcm12864.h>
#include <intrins.h>
sfr P1ASF = 0x9D;
sfr ADC_CONTR = 0xbc;
sfr ADC_RES = 0xbd;
sfr ADC_RESL = 0xbe;
sfr AUXR1 = 0xa2;
sbit EADC = IE^5;
#define ADC_Power_On_Speed_Channel_0 0x88
unsigned int val;
void ADC_Routine() interrupt 5 //ADC中断函数
{
ADC_CONTR &= 0xef;//清楚转换结束标志位
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
val = ADC_RES*256 + ADC_RESL; //读取转换数据
}
void main()
{
Init_12864Word();
LCM12864_wr_String(1,1,"ADC 测试 ");
EA = 1; //开总中断
EADC = 1; //开ADC中断
while(1)
{
P1ASF = 0x01; //设置P1.0口位模拟功能
//设置控制寄存器,10001000B,开ADC电源,转换速度控制00,模拟通道选择000(P1.0),开始转换
ADC_CONTR = ADC_Power_On_Speed_Channel_0;
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
AUXR1 = 0x04; //数据格式设置
LCM12864_wr_Cmd(0x88); //液晶显示
LCM12864_wr_Byte(val/10000+0x30);
LCM12864_wr_Byte(val%10000/1000+0x30);
LCM12864_wr_Byte(val%1000/100+0x30);
LCM12864_wr_Byte(val%100/10+0x30);
LCM12864_wr_Byte(val%10+0x30);
}
}
用户377235 2013-5-2 00:28
写得很好,谢谢版主的分享。也无意中解决了困扰我很久的一个难题,在此感谢。