公告:

stc12c5a通过串口查看ADC数据

作者:智凡单片机 / 时间:3个月前 (12/22) / 分类:51单片机 / 阅读:681 / 评论:0
STC12C5A ,默认使用p1口来进行ADC输入,以下是示例: 原文的串口初始化有问题,已修改

stc12c5a通过串口查看ADC数据 stc12c5a通过串口查看ADC数据 51单片机
//* --- STC MCU Limited -------------------------------------------
//* --- STC12C5Axx Series MCU A/D Conversion Demo ----------------
//#include "reg51.h"
#include "stc12c5a60s2.h"
#include "intrins.h"typedef unsigned char BYTE;typedef unsigned int WORD;//sfr ADC_CONTR   =   0xBC;           //ADC control register//sfr ADC_RES     =   0xBD;           //ADC high 8-bit result register//sfr ADC_LOW2    =   0xBE;           //ADC low 2-bit result register//sfr P1ASF       =   0x9D;           //P1 secondary function control register#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 clocksvoid InitUart();void InitADC();void SendData(BYTE dat);BYTE GetADCResult(BYTE ch);void Delay(WORD n);void ShowResult(BYTE ch);void main(){    InitUart();                     //Init UART, use to show ADC result    InitADC();                      //Init ADC sfr    while (1)    {        ShowResult(0);              //Show Channel0        ShowResult(1);              //Show Channel1        ShowResult(2);              //Show Channel2        ShowResult(3);              //Show Channel3        ShowResult(4);              //Show Channel4        ShowResult(5);              //Show Channel5        ShowResult(6);              //Show Channel6        ShowResult(7);              //Show Channel7    }}void ShowResult(BYTE ch){    SendData(ch);                   //Show Channel NO.    SendData(GetADCResult(ch));     //Show ADC high 8-bit result//if you want show 10-bit result, uncomment next line//    SendData(ADC_LOW2);             //Show ADC low 2-bit result}BYTE GetADCResult(BYTE ch){    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;    _nop_();                        //Must wait before inquiry    _nop_();    _nop_();    _nop_();    while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag    ADC_CONTR &= ~ADC_FLAG;         //Close ADC    return ADC_RES;                 //Return ADC result}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
       AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE;
    TMOD=0x20;//即0010 0000,定时器/计数器1,工作方式2 (8位自动重装)
    TH1=0xfd;//设置波特率为9600 
    TL1=0xfd; 
    TR1=1;//启动定时器/计数器1        
    SCON=0x50; //0101 0000.串口工作方式1(p3.0/p3.1),以定时器1为波特率发生器
    PCON=0x00;//设置SMOD=0 
   
    IE=0x90; //CPU允许中断,串行允许中断 , 定时器1不中断   
   TI=1;    //要输出,先置1,否则没有输出
}void InitADC(){    P1ASF = 0xff;                   //Open 8 channels ADC function    ADC_RES = 0;                    //Clear previous result    ADC_CONTR = ADC_POWER | ADC_SPEEDLL;    Delay(2);                       //ADC power-on and delay}void SendData(BYTE dat){    while (!TI);                    //Wait for the previous data is sent    TI = 0;                         //Clear TI flag    SBUF = dat;                     //Send current data}void Delay(WORD n){    WORD x;    while (n--)    {        x = 5000;        while (x--);    }}

没有评论,留下你的印记,证明你来过。


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。