|
最好用有內(nèi)置ADC的芯片,例如15WS404AS。非得用STC15W204S那只能模擬ADC功能,把下面程序的串口發(fā)送部分改成LED顯示即可。
/*------------------------------------------------------------------*/
/* --- STC MCU International Limited -------------------------------*/
/* --- STC 1T Series MCU RC Demo -----------------------------------*/
/* --- Mobile: (86)13922805190 -------------------------------------*/
/* --- Fax: 86-755-82944243 ----------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------*/
/* If you want to use the program or the program referenced in the */
/* article, please specify in which data and procedures from STC */
/*------------------------------------------------------------------*/
/*
功能描述: 使用STC15F系列C版本做的RC測(cè)量電壓的例子.
*/
#include "reg51.h"
/********宏定義*******/
#define MAIN_Fosc 22118400L //定義主時(shí)鐘
#define uchar unsigned char
#define uint unsigned int
/********特殊功能寄存器*******/
sfr AUXR = 0x8e; //Auxiliary register
sfr P3M1 = 0xB1; //P3M1.N,P3M0.N =00--->Standard, 01--->push-pull
sfr P3M0 = 0xB2; // =10--->pure input, 11--->open drain
/********端口定義*******/
sbit P_TXD1 = P3^1; //定義模擬串口發(fā)送腳,打印信息用
sbit P_RC = P3^2; //RC 檢測(cè)端口
/********變量與子程序聲明*******/
uchar SampleCnt; //發(fā)送結(jié)果的采樣間隔計(jì)數(shù)
uchar LineCnt; //每行顯示結(jié)果計(jì)數(shù)
bit B_Over; //超量程標(biāo)志
bit B_ADC_OK; //檢測(cè)完成標(biāo)志
uint adc; //RC做的ADC值
void RC_start(void); //RC檢測(cè)開始
void Tx1Send(uchar dat); //發(fā)送數(shù)據(jù)
void InitTimer(void); //初始化定時(shí)器
void delay_ms(uchar ms); //延時(shí)
///////////////////////////////////////////////////////////
void main(void)
{
InitTimer(); //初始化定時(shí)器
P3M1 |= 1 << 2; //P3.2 開漏模式
P3M0 |= 1 << 2;
P_RC = 0; //RC 檢測(cè)端口
while (1)
{
delay_ms(5); //放電時(shí)間
B_ADC_OK = 0; //清除ADC結(jié)束標(biāo)志
B_Over = 0; //清除超量程標(biāo)志
RC_start(); //RC 檢測(cè)開始
while(!B_ADC_OK && !B_Over); //等待ADC結(jié)束或超量程
if(B_ADC_OK) //檢測(cè)完成標(biāo)志為1
{
if(++SampleCnt >= 100) //1秒鐘發(fā)一個(gè)結(jié)果給串口
{
SampleCnt = 0;
Tx1Send(adc / 10000 + '0'); //send to PC from the UART
Tx1Send(adc % 10000 / 1000 + '0');
Tx1Send(adc % 1000 / 100 + '0');
Tx1Send(adc % 100 / 10 + '0');
Tx1Send(adc % 10 + '0');
Tx1Send(' ');
Tx1Send(' ');
if(++LineCnt >= 10) //10個(gè)結(jié)果后換行
{
LineCnt = 0;
Tx1Send(0x0d); //send CR
Tx1Send(0x0a);
}
}
}
}
}
/***************延時(shí)函數(shù)*****************/
void delay_ms(uchar ms)
{
uint i;
do
{
i = MAIN_Fosc / 14000L; //1T
while(--i) ; //13T per loop
}while(--ms);
}
/**************** Timer初始化函數(shù) ************/
void InitTimer(void)
{
TMOD = 0; //16位自動(dòng)重裝
TH0 = 0; //
TL0 = 0; //
TR0 = 0; //關(guān)定時(shí)器0
ET0 = 1; //開定時(shí)器0中斷
EA = 1; //開總中斷
}
/********************* INT0外部中斷函數(shù) *************************/
void INT0_int () interrupt 0 //
{
if(INT0 && !B_Over) //上升沿中斷,無(wú)超時(shí)
{
TR0 = 0; //關(guān)定時(shí)器0
P_RC = 0; //RC 檢測(cè)端口置0
adc = TH0; //讀定時(shí)寄存器高8位數(shù)據(jù)
adc =(adc<<8)+TL0; //高8位數(shù)據(jù)+低8位數(shù)據(jù)
B_ADC_OK = 1; //標(biāo)志ADC結(jié)束
}
}
/********************** Timer0中斷函數(shù)************************/
void timer0 (void) interrupt 1
{
TR0 = 0; //超量程關(guān)閉
B_Over = 1; //標(biāo)志超量程
}
/**************** RC啟動(dòng)函數(shù) ******************************/
void RC_start()
{ //使用定時(shí)器0計(jì)時(shí)
TH0 = 0; //計(jì)數(shù)寄存器清0
TL0 = 0;
B_Over = 0; //超時(shí)標(biāo)志清0
P_RC = 1; //RC 檢測(cè)端口置1
TR0 = 1; //開啟定時(shí)器
IE0 = 0; //外部中斷0請(qǐng)求標(biāo)志清0
EX0 = 1; //INT0 開外中斷
IT0 = 0; //INT0 上升/下降沿均可觸發(fā)中斷
}
/********************** 模擬串口相關(guān)函數(shù)************************/
void BitTime(void) //位時(shí)間函數(shù)
{
uint i;
i = ((MAIN_Fosc / 100) * 104) / 130000L - 1; //根據(jù)主時(shí)鐘來(lái)計(jì)算位時(shí)間
while(--i);
}
//模擬串口發(fā)送
void Tx1Send(uchar dat) //9600,N,8,1 發(fā)送一個(gè)字節(jié)
{
uchar i;
EA = 0;
P_TXD1 = 0;
BitTime();
for(i=0; i<8; i++)
{
if(dat & 1)
P_TXD1 = 1;
else
P_TXD1 = 0;
dat >>= 1;
BitTime();
}
P_TXD1 = 1;
EA = 1;
BitTime();
BitTime();
}
|
|