51单片机使用一个IO口做RC充放电来模拟ADC

发布者:runaway2000最新更新时间:2015-08-26 来源: eefocus关键字:51单片机  IO口  RC充放电  模拟ADC 手机看文章 扫描二维码
随时随地手机看文章
AUXR      DATA    08EH       ;Auxiliary register
P1M1      DATA    091H       ;P1M1.N,P1M0.N     =00--->Standard,    01--->push-pull
P1M0      DATA    092H       ;                  =10--->pure input,  11--->open drain
 
P_RC      BIT     P1.0       ;RC port
 
DLY_H     DATA    30H        ;Delay high byte
DLY_M     DATA    31H        ;delay mid byte
DLY_L     DATA    32H        ;delay low byte
SEND_CNT  DATA    33H        ;send counter
 
 
;//////////////////////////////////////////////////////////
 
        ORG     0000H
        LJMP    RESET
        ORG     0100H
RESET:
        LCALL   INIT_UART ;initial UART
        LCALL   INIT_IO    ;initial io
MOV     SP,#40H
MOV     SEND_CNT,#10    ;10 results per line
MAIN:
 
        MOV     DLY_H,#25
DLY1:
        MOV     DLY_M,#HIGH 10000
        MOV     DLY_L,#LOW 10000
DLY2:
        DJNZ    DLY_L,DLY3
        DEC     DLY_M
DLY3:
        MOV     A,DLY_M
        ORL     A,DLY_L
JNZ     DLY2
        DJNZ    DLY_H,DLY1
 
        LCALL   RC
        DJNZ    SEND_CNT,MAIN
MOV     SEND_CNT,#10    ;10 results per line
 
        MOV     A,#0DH        ;send CR
        LCALL   SEND_UART     ;send to PC from the UART
        MOV     A,#0AH        ;send chage line
        LCALL   SEND_UART     ;send to PC from the UART
 
        SJMP    MAIN
 
;//////////////////////////////////////////////////////////
 
INIT_UART:
        MOV     SCON,#5AH ;set UART mode as 8-bit variable baudrate
        MOV     TMOD,#20H ;timer1 as 8-bit auto reload mode
        MOV     AUXR,#40H ;timer1 work at 1T mode
        MOV     TL1,#0FBH       ;115200 bps(256 - 18432000 / 32 / 115200)
        MOV     TH1,#0FBH
        SETB    TR1
        RET
 
;//////////////////////////////////////////////////////////
 
Init_IO:
    ORL   P1M1, #0x01        ;P1.0 config as Open-Drain 
    ORL   P1M0, #0x01
    CLR   P_RC               ;Clear P1.0 to 0
    ORL   TMOD, #0x01        ;T0 as 16 bits timer
    RET
 
;//////////////////////////////////////////////////////////
 
SEND_UART:
        CLR     TI ;clear TI flag
        MOV     SBUF,A ;send current data
        JNB     TI,$ ;wait data sent
        RET
 
;//////////////////////////////////////////////////////////
 
RC:
    MOV     TH0, #0       ;clear Timer 0
    MOV     TL0, #0
    SETB    P_RC          ;RC charge
    SETB    TR0           ;enable Timer 0
    JNB     P_RC,$        ;wait charge finish
    CLR     TR0           ;deable Timer 0
    CLR     P_RC          ;decharge
 
    MOV     R3,TH0;       ;read the RC time
    MOV     R4,TL0;
    LCALL   F_HEX2_DEC
 
    MOV     A,R5
    ADD     A,#30H        ;Charge to ASCII code
    LCALL   SEND_UART     ;send to PC from the UART
 
    MOV     A,R6
    SWAP    A
    ANL     A,#0FH
    ADD     A,#30H        ;Charge to ASCII code
    LCALL   SEND_UART     ;send to PC from the UART
 
    MOV     A,R6
    ANL     A,#0FH
    ADD     A,#30H        ;Charge to ASCII code
    LCALL   SEND_UART     ;send to PC from the UART
 
    MOV     A,R7
    SWAP    A
    ANL     A,#0FH
    ADD     A,#30H        ;Charge to ASCII code
    LCALL   SEND_UART     ;send to PC from the UART
 
    MOV     A,R7
    ANL     A,#0FH
    ADD     A,#30H        ;Charge to ASCII code
    LCALL   SEND_UART     ;send to PC from the UART
 
    MOV     A,#20H
    LCALL   SEND_UART     ;send to PC from the UART
    MOV     A,#20H
    LCALL   SEND_UART     ;send to PC from the UART
    RET
 
 
 
;//////////////////////////////////////////////////////////
 
F_HEX2_DEC:         ;(R3---R4) HEX Change to DEC ---> (R5---R7), use (R2~R7), 344T
    MOV   R2,#16
    MOV   R5,#0
    MOV   R6,#0
    MOV   R7,#0
 
L_HEX2_DEC:
    CLR   C
    MOV   A,R4
    RLC   A
    MOV   R4,A
    MOV   A,R3
    RLC   A
    MOV   R3,A
 
    MOV   A,R7
    ADDC  A,R7
    DA    A
    MOV   R7,A
 
    MOV   A,R6
    ADDC  A,R6
    DA    A
    MOV   R6,A
 
    MOV   A,R5
    ADDC  A,R5
    DA    A
    MOV   R5,A
 
    DJNZ  R2,L_HEX2_DEC
    RET
 
    END
关键字:51单片机  IO口  RC充放电  模拟ADC 引用地址:51单片机使用一个IO口做RC充放电来模拟ADC

上一篇:51 单片机综合学习系统之 1602字符型液晶显示篇
下一篇:51单片机的LCD1602液晶屏密码锁汇编程序

推荐阅读最新更新时间:2024-03-16 14:30

51单片机RS232串口通信代码分析
一、串口初始化 void usart_init() { SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1 TMOD = 0x20; //定时器工作方式2 PCON = 0x00; TH1 = 0xFD; //波特率9600、数据位8、停止位1。效验位无 (11.0592M) TL1 = 0xFD; ES = 1; //开串口中断 EA = 1; //开总中断 TR1 = 1; //启动定时器 } SCON寄存器 1.SM0、SM1:串行口工作方式控制位 2.SM2:多机通信控制位 3.REN:允许接收位 4.TB8:发送接收数据位8 5.RB8:接收数据位8 6.TI:发送中断标志位 TI=1表
[单片机]
<font color='red'>51单片机</font>RS232串口通信代码分析
C51单片机学习笔记之数码管
简介 数码管分为共阴数码管和共阳数码管。简单说就是所有阴极共用一个引脚或所有阳极共用一个引脚。 用共阴数码管举例:A,B,C,D,E,F,G对应数码管的段。1,2,3,4对应数码管的位。共阴数码管高电平时段有效,低电平时位有效。共阳数码管反之,低电平段有效,高电平位有效。 数码管对应的字符 共阴 0x3F, // 0 0x06, // 1 0x5B, // 2 0x4F, // 3 0x66, // 4 0x6D, // 5 0x7D, // 6 0x07, // 7 0x7F, // 8 0x6F, // 9 0x77, // A 0x7C,
[单片机]
C<font color='red'>51单片机</font>学习笔记之数码管
51单片机(三)——定时器/计数器
一、定时器/计数器 1.1 定时器/计数器概述 51单片机有两个内置定时器/计数器。 当记数脉冲来自于外部输入时,为计算器。而来自于系统时钟时,为定时器。 定时器0有四种模式。定时器1支持三种模式,可以被用来产生波特率。 PCON寄存器里的SMOD0位表示每12时钟或者每6时钟产生一次计数脉冲。 1.2 TCON寄存器 bit B7 B6 B5 B4 B3 B2 B1 B0 name TF1 TR1 TR0 TF0 TR0 IE1 IT1 IE0 TF0和TF1为定时器溢出位、TR0和TR1为运行控制位、其他位用于外部中断。 TR0和TR1: 分别控制定时器0和1的运行,该位置1时才允许定时器计数,清0时
[单片机]
51单片机蜂鸣器之《东西》
#include reg51.h #define uint unsigned int #define uchar unsigned char sbit voice=P1^5; uchar code sound ={0xff, 0x26,0x20,0x2b,0x20,0x26,0x20,0x2b,0x20,0x26,0x20,0x2b,0x20,0x26,0x20, 0x2b,0x20,0x26,0x20,0x26,0x20,0x2b,0x20,0xff,0x20,0x2b,0x20,0x30,0x20, 0x2b,0x20,0x30,0x20,0x2b,0x20,0x3
[单片机]
51单片机串口波特率计算
对于11.0592M晶振 bot=256-(11059200/9600/32) 此处波特率为9600 11.0592M晶振可以支持基本波特率 对于12M晶振有所不同 bot=256-(1200000/4800/32) 此处波特率为4800 12M这里波特率设置不能超过4800,因为超过后,时钟误差过大,在通讯的时候某些数据就会乱码。
[单片机]
基于51单片机的温度采集系统(Labview做上位机)
做该设计的初衷是为自己的毕设打基础,因为我的毕设要做一个探测机器人,需要对某一地区的各种环境参数进行检测,然后通过WIFI返回到上位机。所以为了搞懂温度传感器以及练习上位机的设计,花了几天时间做了一个很简单的采集系统。今天把它拿出来跟各位小伙伴们分享,希望对各位有所帮助,同时也希望大佬们指出不足,起到一个相互学习,相互促进的作用。该系统原理是:51单片机把ds18b20传感器将采集到的温度值(十六进制)通过串口发送到labview,labview对单片机发来的数据做简单的处理然后显示。 上位机界面 上位机(接受程序) 简单的硬件连接 数据纪录 串口部分: void main() {
[单片机]
基于<font color='red'>51单片机</font>的温度采集系统(Labview做上位机)
基于51单片机智能热水器控制系统设计
一.硬件方案 本设计主要实现的功能是可以对水位进行设置并加水,先设置好需要加水的水位段数,单片机会根据这个数判断是否需要加水,同时还可以测量并显示水温、设置水温范围,若水温超过或低于所设置的水温范围,则会报警。 主要由51单片机+LCD1602显示屏+按键+继电器+DS18B20温度传感器+蜂鸣器+指示灯+遥控电路灯等组成;如图: 二.设计功能 (1)采用LCD1602液晶显示、DS18B20防水型温度传感器测温,液晶显示当前的温度、温度上下限值和预约时间(单片机内部定时器)。 (2)产品自带单片机上电复位电路、手动复位电路(复位按键)、晶振电路(给单片机提供时钟周期)。数红外遥控和手动按键双输入设置参数,更加方便快捷实用
[单片机]
基于<font color='red'>51单片机</font>智能热水器控制系统设计
MCS-51单片机与CPLD/FPGA接口逻辑设计
在功能上,单片机与大规模CPLD有很强的互补性。单片机具有性能价格比高、功能灵活、易于人机对话、良好的数据处理能力潍点;CPLD/FPGA则具有高速、高可靠以及开发便捷、规范等优点。以此两类器件相结合的电路结构在许多高性能仪器仪表和电子产品中仍将被广泛应用。本文就单片机与CPLD/FPGA的接口方式作一简单介绍,希望对从事单片机和CPLD/FPGA研发的朋友能有所启发。 单片机与CPLD/FPGA的接口方式一般有两种,即总线方式与独立方式,分别说明如下: 一、总线方式 单片机以总线方式与CPLD/FPGA进行数据与控制信息通信有许多优点。 (1)速度快。如图一所示,其通信工作时序是纯硬件行为,对于MCS-51单片机,只需一条单字节
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

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