PIC16F15323单片机 (ADC)--汇编+C语言

最新更新时间:2022-02-19来源: eefocus关键字:单片机  ADC  汇编  C语言 手机看文章 扫描二维码
随时随地手机看文章

1 基本原理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

1.1 寄存器介绍

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

1.2 寄存器汇总

在这里插入图片描述

1.3 ADC采集实现框图

在这里插入图片描述

2 实现代码


/*---------------------------------函数功能:-------------------------------------

 RA0(AN0)作为外部模拟电压的模拟输入口,并且用RC0口(LED)来判断电压采集是否完成,

 如果AD采集完成,则AD对应的标志位ADIF=1,如果使能有效,则会产生一个中断,此时LED灯亮。

 

 编程思路:参考手册的P131  To do an A/D Conversion, follow these steps

----------------------------------------------------------------------------*/



// PIC16F15323 Configuration Bit Settings


// 'C' source line config statements


// CONFIG1

#pragma config FEXTOSC = ECH    // External Oscillator mode selection bits (EC above 8MHz; PFM set to high power)

#pragma config RSTOSC = EXT1X   // Power-up default value for COSC bits (EXTOSC operating per FEXTOSC bits)

#pragma config CLKOUTEN = OFF   // Clock Out Enable bit (CLKOUT function is disabled; i/o or oscillator function on OSC2)

#pragma config CSWEN = ON       // Clock Switch Enable bit (Writing to NOSC and NDIV is allowed)

#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enable bit (FSCM timer enabled)


// CONFIG2

#pragma config MCLRE = ON       // Master Clear Enable bit (MCLR pin is Master Clear function)

#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)

#pragma config LPBOREN = OFF    // Low-Power BOR enable bit (ULPBOR disabled)

#pragma config BOREN = ON       // Brown-out reset enable bits (Brown-out Reset Enabled, SBOREN bit is ignored)

#pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (VBOR) set to 1.9V on LF, and 2.45V on F Devices)

#pragma config ZCD = OFF        // Zero-cross detect disable (Zero-cross detect circuit is disabled at POR.)

#pragma config PPS1WAY = ON     // Peripheral Pin Select one-way control (The PPSLOCK bit can be cleared and set only once in software)

#pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable bit (Stack Overflow or Underflow will cause a reset)


// CONFIG3

#pragma config WDTCPS = WDTCPS_31// WDT Period Select bits (Divider ratio 1:65536; software control of WDTPS)

#pragma config WDTE = ON        // WDT operating mode (WDT enabled regardless of sleep; SWDTEN ignored)

#pragma config WDTCWS = WDTCWS_7// WDT Window Select bits (window always open (100%); software control; keyed access not required)

#pragma config WDTCCS = SC      // WDT input clock selector (Software Control)


// CONFIG4

#pragma config BBSIZE = BB512   // Boot Block Size Selection bits (512 words boot block size)

#pragma config BBEN = OFF       // Boot Block Enable bit (Boot Block disabled)

#pragma config SAFEN = OFF      // SAF Enable bit (SAF disabled)

#pragma config WRTAPP = OFF     // Application Block Write Protection bit (Application Block not write protected)

#pragma config WRTB = OFF       // Boot Block Write Protection bit (Boot Block not write protected)

#pragma config WRTC = OFF       // Configuration Register Write Protection bit (Configuration Register not write protected)

#pragma config WRTSAF = OFF     // Storage Area Flash Write Protection bit (SAF not write protected)

#pragma config LVP = ON         // Low Voltage Programming Enable bit (Low Voltage programming enabled. MCLR/Vpp pin function is MCLR.)


// CONFIG5

#pragma config CP = OFF         // UserNVM Program memory code protection bit (UserNVM code protection disabled)


// #pragma config statements should precede project file includes.

// Use project enums instead of #define for ON and OFF.


#include // 调用PIC16f15323单片机的头文件

//#include"delay.h"//调用延时子函数的头文件





/*-----------宏定义--------------*/

#define  uint  unsigned int

#define  uchar unsigned char


uint  ADbuf=0; // 缓存AD转换结果



/*-----------子函数声明--------------*/




/*-----------主函数--------------*/

void main()

{

    //-------------------1、Configure Port:---------------------//

// The corresponding data direction register is TRISA. 

// Setting  a TRISA bit (= 1) will make the corresponding PORTA pi an input. 

// Clearing a TRISA bit (= 0) will make the corresponding PORTA pin an output.


// 解释为什么需要TRISA0=1? After the A/D module has been configured as desired, 

// the selected channel must be acquired before the conversion is started. 

// The analog input channels must have their corresponding TRIS bits selected as inputs. 

TRISA0=1; // RA0口为输入口,电压输入口

    TRISC0=0; // AD响应中断对应的LED灯的数据方向为输出

// 1 = Port pin is > VIH,即高电平  ;  0 = Port pin is < VIL,即低电平

RA0=0; // 要不要这行语句没有影响,因为该端口是输入端口

RC0=0; // LED灯的初值为灭

    //The ANSELA register (Register 14-4) is used to configure the Input mode of an I/O pin to analog.

    // Setting the appropriate ANSE     如果ANSEL=1,IO口为模拟输入,如果ANSEL=0,数字IO口。

    ANSA0=1;                    // Set RA0 to analog  ANSELA0,为什么见头文件


    

while(1) // 死循环,单片机初始化后,就一直运行这个死循环

{

        //-------------------2、Configure the ADC module:---------------------//

        //(1)寄存器ADCON1: ADFM ADCS<2:0> - - ADPREF<1:0>

    

        // 10-BIT ADC CONVERSION RESULT FORMAT 

        ADFM=1; //  AD Result Format Select bit.  0 = Left justified.  1 = Right justified

                

        //The source of the conversion clock is software selectable via the ADCS<2:0> bits 

        ADCS2=0;ADCS1=0;ADCS0=0; // Select ADC conversion clock    FOSC/2

           

         // The ADPREF<1:0> bits of the ADCON1 register provides control of the positive voltage reference

        ADPREF1=0;ADPREF0=0;            // Select voltage reference  00 =VREF+ is connected to VDD

        

        

        //(2)寄存器ADCON0:  CHS<5:0> GO/DONE ADON

               

        //The CHS<5:0> bits of the ADCON0 register determine which channel is connected to the sample and hold circuit.

        //CHS5=1;CHS4=1;CHS3=1;CHS2=1;CHS1=0;CHS0=0;   // Select ADC input channel  Temperature sensor  选择温度传感器作为模拟输入

        CHS5=0;CHS4=0;CHS3=0;CHS2=0;CHS1=0;CHS0=0;   //   Select ADC input channel   选择RA0(AN0)作为模拟输入

        

             

        //ADC Conversion Status bit. 1 = ADC conversion cycle in progress. Setting this bit starts an ADC conversion cycle.

        // This bit is automatically cleared by hardware when the ADC conversion has completed.

        // 0 = ADC conversion completed/not in progress

        GOnDONE=0; // AD Conversion Status bit。为什么叫用GO_DONE看一下xc.h头文件

               

        //To enable the ADC module, the ADON bit of the ADCON0 register must be set to a ‘1’. 

        ADON=1; //Turn on ADC module    模数转换器使能位。 1 = A/D converter module is powered up  

        

        

        

//--------------------3、Configure ADC interrupt (optional):---------------------//

//ADIE=0; //禁止AD中断

//AD中断使能

ADIE=1;

ADIF=0; // Clear ADIF bit 

        INTEDG=1;               // Interrupt Edge Select bit   1 = Interrupt on rising edge of INT pin

PEIE=1; // 允许外设中断       

GIE=1; // 总中断允许

      

        

        

        //----------ADC BLOCK DIAGRAM框图有下面两个寄存器,但是AD采集程序没有用到?--------------//

        // AUTO CONVERSION TRIGGER    

        // TRIGSEL<3:0>;

        

        

        //The Auto-conversion Trigger source is selected with the ADACT<4:0> bits of the ADACT register.

        ADACT4=0;ADACT3=0;ADACT2=0;ADACT1=0;ADACT0=0;//Auto-Conversion Trigger Selection bits

        

        

        

        //--------------------4、 Wait the required acquisition time:---------------------//

      asm("NOP"); //延时,让模拟电压稳定

asm("NOP");

asm("NOP");

asm("NOP");

asm("NOP");  

        

        

        

        //---------------5、Start conversion by setting the GO/DONE bit.:---------------------//

        // When ADON = 1时,GO_DONE=1: AD conversion in progress set this bit(GO_DONE=1), starts the AD conversion. 

// it is automatically cleared by hardware when the AD conversion is complete

GOnDONE=1; //开始进行AD转换   GO/DONE: A/D Conversion Status bit  ADGO=1;

         

         

        

        //---------6、Wait for ADC conversion to complete by one ofthe following:(1)Polling the GO/DONE bit。(2)Waiting for the ADC interrupt------//

[1] [2]
关键字:单片机  ADC  汇编  C语言 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic560114.html

上一篇:PIC16F15323单片机 (ADC+温度传感器)--汇编+C语言
下一篇:PIC16F877A单片机 (ADC)

推荐阅读

新唐N76E003+GPRS 单片机复位故障排除手记
应用场景GPRS模块采用AIR202/AIR208,电源方案是JW5033;单片机采用新唐N76E003,双串口,18K flash,电源与GPRS的DCDC 即JW5033共用一个5V输入电源。问题描述GPRS联网时或联网成功后收发数据的数据,新唐单片机复位重启。故障排除1、单片机电源前增加电容初步怀疑是供电不足,使用示波器观察后排除此原因,如果真的是供电不足,GPRS模块也应该会同时重启,实际上单片机模块重启时GPRS模块一直正常工作。2、设置单片机P2.0引脚为输入模式而非复位模式将P2.0引脚由复位引脚更改为输入引脚后,故障排除。我的理解是更改为输入引脚后,射频干扰不足以引起单片机复位了,深层次的原因不详。
发表于 2022-08-10
新唐N76E003+GPRS <font color='red'>单片机</font>复位故障排除手记
关于51单片机的地址空间溢出以及解决方法的个人看法(proteus无法仿真)
在51单片机程序编写中,当变量过多而且数据类型过大的话,容易在编译的时候出现以下的问题,具体表现为: *** ERROR L107: ADDRESS SPACE OVERFLOWSPACE: DATA SEGMENT: _DATA_GROUP_LENGTH: 0019HProgram Size: data=130.0 xdata=7 code=3267Target not created.这样子也就是所谓的编译失败,不能生成HEX文件,更加无法烧写到程序中去,那么如何解决这个问题呢,我在网上找到了解法,网上的具体步骤如下:1.先点击这个图标2.在其中的memory model 将small改成compact选项,那么即可编译通过。3
发表于 2022-08-10
关于51<font color='red'>单片机</font>的地址空间溢出以及解决方法的个人看法(proteus无法仿真)
51单片机脉冲信号的计数和LCD显示
设计目标和思路在个人剂量仪开发的过程中,从探头输出的核脉冲信号经过后期放大,成形,滤波以及甄别之后,成为一系列脉冲信号输出,这种脉冲信号由于衰变的随机性,并不是固定频率的脉冲信号。我们本次设计就是针对这种脉冲进形脉冲信号的计数以及在LCD1602显示屏上面的显示。这是C语言的代码部分#include"reg51.h" #include <stdio.h>#include <math.h>#include <string.h>#include <intrins.h>#define uint8_t unsigned char //0-255#define uint16
发表于 2022-08-10
51<font color='red'>单片机</font>脉冲信号的计数和LCD显示
51单片机之74HC138译码器控制数码管进行100s计数
/** I use a timer in my code to control the time I use 138decoder int the hardware**/#include<reg51.h>#define uint unsigned int#define uchar unsigned charsbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;uchar code tab_1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};uchar tab_2[2];uchar counter=0,time=0,counter_T
发表于 2022-08-10
51单片机制作脉冲发生器
要求1.在Keil IDE(u Vision2)中完成应用程序设计,并编译2.在ISIS 7 Professional 中完成电路设计、调试与仿真/** I use a timer in my code to control the time**/#include<reg51.h>#define uint unsigned int#define uchar unsigned charuchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchar second=0,counter=0,second_1=0,second_0=0,time=
发表于 2022-08-10
51<font color='red'>单片机</font>制作脉冲发生器
51单片机定时器2捕获模式测脉冲频率
常规方法测量脉冲的频率,利用51单片机的两个定时器来测量,一个定时器来定时,一个定时器作为计数方式;能不能有一个更好的方法,不使用这么多硬件,只使用一个定时器就可以满足需求? 当然可以的,定时器2有输入捕获功能,P1.1接外部脉冲,当来一个脉冲,定时2就进入中断服务程序中断一次,同时也有定时功能。下面是主要的程序:#include<reg52.h>#define uint unsigned int#define uchar unsigned char#define ulong unsigned longuint timer2_count;uint cap_count;uchar code dispbit[]={0x01,
发表于 2022-08-10

推荐帖子

总线通讯接口NeoviFire与CANoe CAN卡硬件对比
汽车厂和零部件厂商使用最多的两种软件:德国Vector公司的CANoe和美国英特佩斯公司的Vehiclespy, 本文介绍两种软件对应硬件的区别。以下分别针对美国英特佩斯公司的neoVIfire、NeoVIRED、Value CAN3与德国Vector公司的CANoeCAN卡做详细对比:硬件NeoviFire对比CANOECAN卡功能NeoviFireCANOECAN卡SD卡离线行驶记录仪功能有,2-16G容量,可按网络,消息,触发等多方式过滤记录无离线功能Standal
movingtek 汽车电子
STM32-CC1101无线(收发已调通),欢迎来踩!
1.小伙伴们,附件是基于STM32-CC1101无线程序(收发已调通)。如果你们其中遇到什么问题,可以加我的Q2190957825,和我一起探讨。 2.HW3000、CC1101、SI4432无线模块是主流的433MHz无线模块,HW3000模块以价格与性能的优势取代了CC1101、SI4432无线模块。如果想要了解更多关于HW3000模块、CC1101、SI4432的资料,欢迎小伙伴们来骚扰,哈哈! STM32-CC1101无线(收发已调通),欢迎来踩!
keng123 RF/无线
大四学生请教嵌入式WINCE系统驱动入门问题
我是大四的一名学生,我想毕业可从事嵌入式系统这方面的工作,现在我想学习驱动编程,我只在书上看了一些WINCE的基本驱动的结构, 我想深入了解, 1)应该从那一方面入手呢,或者说先从那一个模块开始深入了解呢? 2)我需要什么专业知识吗?我只有C语言和单片机的基础. 3)大家有好的资料或书可以介绍一下吗? 希望大家能帮助一下我,感觉就业压力好大,快毕业了,自己没有什么实际的项目经验,公司都不要,前途很迷忙啊,麻烦大家帮帮忙大四学生请教嵌入式WINCE系统驱动入门问题
似曾相识 WindowsCE
上、下拉电阻
为什么动不动就要上拉或下拉一个电阻?究竟有什么好处?更重要的是为什么会有这样的好处?谢谢上、下拉电阻
ckx提问 模拟电子
求助:SD卡读写程序 初始化进入复位循环就出不来了,一直不返回0x01。。。
//SD卡初始化charSD_init(void){inti;inttime=5;unsignedcharresponse1=0xff,response2=0xff;P5SEL|=0X0e;//初始化430UART引脚 P5DIR|=0X0B; SPI_init();CS_1;do{if(!time)return(failed);time--;for(i=0;i<10;i++)Sendbyte(0xff);//延时80个CLKCS_0;Se
nothingo 微控制器 MCU
二极管的非线性导致会产生一些新的波形,它的底层形成原理是什么,哪位能给讲解
二极管的非线性导致会产生一些新的波形,它的底层形成原理是什么,哪位能给讲解 二极管的非线性导致会产生一些新的波形,它的底层形成原理是什么,哪位能给讲解
一沙一世 stm32/stm8
小广播
实战 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved