登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 内部AD使用

[复制链接]
发表于 2021-2-23 22:17:34 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 单片机
学习安排: 使用单片机内部的AD进行模数转换
开始时间: 2021-02-22
结束时间: 2021-02-22
A/D是模拟量到数字量的转换,生活中如温度,长度,压力等都是模拟量,这些模拟量可以通过传感器变成与之相对应的电压,电流等电模拟量,然后单片机是一个典型的数字系统,而我们的单片机有着自己内部的ADC转换器,它可以把模拟量和数字量进行转化。
屏幕截图 2021-02-20 161603.png 屏幕截图 2021-02-20 162316.png 屏幕截图 2021-02-20 162333.png 屏幕截图 2021-02-20 162432.png

读数据手册可以知道,关键就是配置好ADC_CONTR寄存器,以及通道的选择P1ASF,和获取转化结果ADC_RES,我们的板子在P10口接了AD,还有个变压器可供我们观察电压的变化

#include <STC12C5A60S2.H>
#include "intrins.h"


//sfr ADC_CONTR = 0xBC;
//sfr ADC_RES   = 0xBD;
//sfr ADC_LOW2  = 0xBE;
//sfr P1ASF     = 0x9D;

#define ADC_POWER    0x80;
#define ADC_FLAG     0x10;
#define ADC_START    0x08;
#define ADC_SPEEDLL  0x00;
#define ADC_SPEEDL   0x20;
#define ADC_SPEEDH   0x40;
#define ADC_SPEEDHH  0x60;

extern void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str);
extern void InitLcd1602();

void InitADC();

double Data,c;
unsigned char a[5];
unsigned char dal;
void InitADC()
{
   P1ASF = 0x01;                                          //设置P1^0口为输入
   ADC_RES = 0x00;                                          //清除高八位缓冲数据

   ADC_CONTR = 0xF0;                                  //AD转换控制寄存器,选择P1^0口
   _nop_();
   _nop_();
   _nop_();
   _nop_();                                                      //要适当延时,才能正确读到ADC_CONTR寄存器的值
   ADC_CONTR = 0xE8;                                  //清零ADC_FLAG,置位ADC_START,并选择P1^0作为AD输入

}
void timer0() interrupt 1
{
   TH0 = 0xEA;
   TL0 = 0xAB;
}
void adc_isr() interrupt 5                         //ADC_FLAG标志位置位后,即转换完成,触发中断
{
   EA = 0;
   dal = ADC_RES;                                //获取转换结果
   ADC_CONTR&=0x7F;                                        //关闭ADC_POWER,即打开AD,这打开关闭两步可以不用
   Data = ((double)dal/256)*5;        //取8位计算基准电压
   c = Data;
   ADC_CONTR|=0x80;                                //打开ADC_POWER,即打开AD
   a[0] = ((int)c%10+0x30);                        //个位,0x30对应的ASCAL码为“0”
   a[1] = 0x2E;                                                //小数点
   a[2] = ((int)(c*10)%10+0x30);        //十位
   a[3] = ((int)(c*100)%10+0x30);        //百位
   a[4] = '\0';                                                //结束符

   LcdShowStr(0,0,a);                                //进行LCD显示
   ADC_CONTR&=0xEF;                                        //ADC_FLAG标志位清零
   ADC_CONTR|=0x80;                                //打开ADC_POWER,即打开AD
   EA = 1;
}
void main()
{
           InitLcd1602();
        InitADC();
        TMOD = 0x01;
    TH0 = 0xEA;
        TL0 = 0xAB;
        EA = 1;
        ET0 = 1;
        EADC = 1;
        TR0 = 1;
        while(1);
}

好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表