标题:
STC12C5204AD单片机AD转换,改变检测电压后只有重新上电再更新串口数据?
[打印本页]
作者:
qyljzjxl
时间:
2019-8-15 19:56
标题:
STC12C5204AD单片机AD转换,改变检测电压后只有重新上电再更新串口数据?
#include<STC12C5A60S2.h>
unsigned int a;
unsigned int res;
//定义延时函数
void delay(a){
while(--a!=0){
unsigned int i;
for(i=0;i<600;i++);
}
}
//串口初始化函数
void UART_INT(void){
PCON=0X80;
TMOD=0X20;
SCON=0X50;
TH1=0XF3;
TL1=0XF3;
EA=1;
ES=1;
TR1=1;
}
//AD转换函数初始化
void ADC_INT()
{
P1ASF=0X01;//选择P1.0口作AD转换输入口;
ADC_RES=0;//转换结果寄存器清零
ADC_CONTR=ADC_CONTR|0x80; // 让第七位ADC_POWER置1,打开电源
EADC=1; //打开AD转换开关
delay(2); //延时等待电源稳定
ADC_CONTR=ADC_CONTR|0x08; //让第3位ADC_START置1,开始转换
}
//AD中断函数
ADC_ISR() interrupt 5 using 1
{
while((ADC_CONTR&0x10)==0); // 等待转换完成,第四位ADC_FLAG标志位为0时等待
res=ADC_RES;//转换完成后,将值赋给串口数据寄存器
SBUF=res;
ADC_CONTR|=0x08;//重新启动ADC转换
}
//
void main(void)
{
UART_INT();
ADC_INT();
while(1){
while(!TI);
SBUF=res;
TI=0;
}
}
//
作者:
wulin
时间:
2019-8-16 06:28
无标题.jpg
(224.34 KB, 下载次数: 56)
下载附件
2019-8-16 06:27 上传
/*------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------------------------------------*/
/* --- STC12C5Axx Series MCU A/D Conversion Demo -------------------*/
/* --- Mobile: (86)13922805190 -------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ---------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966----------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------*/
/* --- Web: www.GXWMCU.com -----------------------------------------*/
/* If you want to use the program or the program referenced in the */
/* article, please specify in which data and procedures from STC */
/*------------------------------------------------------------------*/
#include "reg51.h"
#include "intrins.h"
#define FOSC 11059200L
#define BAUD 9600
typedef unsigned char BYTE;
typedef unsigned int WORD;
/*Declare SFR associated with the ADC */
sfr ADC_CONTR = 0xBC; //ADC control register
sfr ADC_RES = 0xBD; //ADC hight 8-bit result register
sfr ADC_LOW2 = 0xBE; //ADC low 2-bit result register
sfr P1ASF = 0x9D; //P1 secondary function control register
/*Define ADC operation const for ADC_CONTR*/
#define ADC_POWER 0x80 //ADC power control bit
#define ADC_FLAG 0x10 //ADC complete flag
#define ADC_START 0x08 //ADC start control bit
#define ADC_SPEEDLL 0x00 //420 clocks
#define ADC_SPEEDL 0x20 //280 clocks
#define ADC_SPEEDH 0x40 //140 clocks
#define ADC_SPEEDHH 0x60 //70 clocks
void InitUart();
void SendData(BYTE dat);
void Delay(WORD n);
void InitADC();
BYTE ch = 0; //ADC channel NO.
void main()
{
InitUart(); //Init UART, use to show ADC result
InitADC(); //Init ADC sfr
IE = 0xa0; //Enable ADC interrupt and Open master interrupt switch
//Start A/D conversion
while (1);
}
/*----------------------------
ADC interrupt service routine
----------------------------*/
void adc_isr() interrupt 5
{
ADC_CONTR &= !ADC_FLAG; //Clear ADC interrupt flag
SendData(ch); //Show Channel NO.
SendData(ADC_RES); //Get ADC high 8-bit result and Send to UART
//if you want show 10-bit result, uncomment next line
// SendData(ADC_LOW2); //Show ADC low 2-bit result
if (++ch > 7) ch = 0; //switch to next channel
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
}
/*----------------------------
Initial ADC sfr
----------------------------*/
void InitADC()
{
P1ASF = 0xff; //Set all P1 as analog input port
ADC_RES = 0; //Clear previous result
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
Delay(2); //ADC power-on delay and Start A/D conversion
}
/*----------------------------
Initial UART
----------------------------*/
void InitUart()
{
SCON = 0x5a; //8 bit data ,no parity bit
TMOD = 0x20; //T1 as 8-bit auto reload
TH1 = TL1 = -(FOSC/12/32/BAUD); //Set Uart baudrate
TR1 = 1; //T1 start running
}
/*----------------------------
Send one byte data to PC
Input: dat (UART data)
Output:-
----------------------------*/
void SendData(BYTE dat)
{
while (!TI); //Wait for the previous data is sent
TI = 0; //Clear TI flag
SBUF = dat; //Send current data
}
/*----------------------------
Software delay function
----------------------------*/
void Delay(WORD n)
{
WORD x;
while (n--)
{
x = 5000;
while (x--);
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1