#include "reg51.h"
#include"STC.H"
#include "intrins.h"
#define FOSC 11059200 //系统时钟频率
#define BAUD 19200 //定义Baud率
#define Count 256 //定义计数频率
typedef unsigned char uchar;
typedef unsigned int uint;
typedef bit BT;
sfr ADC_CONTR = 0xBC; //ADC控制寄存器
sfr ADC_RES = 0xBD; //ADC高八位寄存器
sfr P1ASF = 0x9D; //P1 secondary function control register
sfr AUXR = 0x8e; //辅助函数寄存器
sbit Flag1 = P0^0; //时钟clk
sbit Flag2 = P0^1; //reset信号
#define ADC_POWER 0x80 //ADC电源控制位
#define ADC_FLAG 0x10 //ADC完成标志位
#define ADC_START 0x08 //ADC开始控制位
#define ADC_SPEEDH 0x40 //180个时钟周期
uint count1 = 0; //计数ADC采样数
uint count2 = 0; //计算RESET信号的占空比
uint count3 = 0; //为AD-trig计数
BT AD_Sp = 0; //AD-sp信号
void InitUart(); //初始化Uart函数
void InitADC (); //初始化ADC函数
void SendData(uchar dat); //发送数据到PC机
uchar GetADCResult(uchar ch); //读取ADC接口的数据
void Delay(uint n); //延时函数
void ShowResult(uchar ch);
void main()
{
AD_Sp = 0; //初始化Sp
EA = 1; //全局中断打开
AUXR |= 0x80; //辅助寄存器
TMOD|= 0x01;
TL0 = 0XC0; //初始化
TH0 = 0XFf;
IT0 = 1; //IT0中断打开
EX0 = 1;
TR0 = 0; //定时器0打开
ET0 = 0;
IT1 = 1; //IT1中断打开
EX1 = 1;
count2 = 0;
Flag2=0;
InitUart(); //初始化Uart
InitADC(); //初始化ADC特殊寄存器
//Start A/D conversion
while (1)
{
ShowResult(0); //在PC机上显示
}
}
/*----------------------------
在电脑上显示采集的数据
----------------------------*/
void ShowResult(uchar ch)
{
SendData(GetADCResult(ch));
}
/*----------------------------
采集Video的数据
----------------------------*/
uchar GetADCResult(uchar ch)
{
ADC_CONTR = ADC_POWER|ADC_SPEEDH|ch|ADC_START;
_nop_();
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG));
ADC_CONTR &= ~ADC_FLAG;
return ADC_RES;
}
/*----------------------------
初始化ADC寄存器
----------------------------*/
void InitADC()
{
P1ASF = 0x01; //设置P1.0口为ADC转换口
ADC_RES = 0; //清除上一个数据
ADC_CONTR = ADC_POWER|ADC_SPEEDH;
Delay(10); //延时一段时间,开始ad转换
}
/*----------------------------
初始化UART寄存器
----------------------------*/
void InitUart()
{
SCON = 0x5a;
TMOD |= 0x20;
TH1 = TL1 = -(FOSC/12/32/BAUD);
TR1 = 1;
}
/*----------------------------
UART发送数据函数
----------------------------*/
void SendData(uchar dat)
{
while (!TI); //等待先前的数据发送
TI = 0; //清除 TI 标志位
if(AD_Sp)
{
SBUF = dat; //发送最近的数据
}
}
/*----------------------------
软件延时函数
----------------------------*/
void Delay(uint n)
{
uint x;
while (n--)
{
x = 100;
while (x--);
}
}
/*---------------------------
配置CLK信号和Reset信号
---------------------------*/
void Time0()interrupt 1
{
TL0=0XC3;
TH0=0XFF;
Flag1=~Flag1; //为解调仪模块提供CLK时钟
if(count2--==0) //为解调仪模块提供RESET信号,其中积分时间为30个CLK周期。
{
if(Flag2==1)
{
count2=550;
Flag2 =~Flag2;
}
else
{
count2=60;
Flag2 =~Flag2;
}
}
}
/*-----------------------
接受AD-sp信号
------------------------*/
void exint0() interrupt 0 //接受AD—sp的信号P3.2
{
Flag1=~Flag1;
AD_Sp = 1;
}
/*--------------------------------------
采集AD-trig信号并且记录其个数
---------------------------------------*/
void exint1() interrupt 2 //接受AD-trig的信号P3.3
{
if(AD_Sp)
{
Flag2=~Flag2;
if(count1 == Count)
{
count1=0; //接受trig信号的个数
AD_Sp=0;
}
else
count1++;
}
}