精华内容
下载资源
问答
  • STC15W408 108Mhz PWM

    2019-01-29 23:41:10
    STC15W408 108Mhz PWM p3.5口输出 12Mhz 时钟 测试过
  • 适用于STC15W408AS或STC15W404AS(对不起,没有STC15F204EA,内存/代码不足,没有硬件) 在这一点上非常实验性(需要对此进行完善) 请注意,此项目正在开发中,欢迎进行中的Pull请求。 待办事项 时间同步到WWVB...
  • stc15w408as程序

    2015-12-11 12:40:53
    stc15w408as程序,实现串口发送,以及触控I2C扩展功能。
  • stc15w408as串口通讯

    2018-03-20 16:55:31
    关于单片机stc15w408as串口通讯程序代码!!!!!!!!
  • STC15W408AS_STC(宏晶).pdf

    2021-05-19 07:58:35
    STC15W408AS_STC(宏晶).pdf
  • 测试STC15W408AS单片机串口收发,测试成功,串口将接收到的数据原封不动的发出去
  • STC15W408AS的485串口实现自发自收
  • STC15W408AS触摸面板原理图
  • STC15W408AS_串口程序

    2021-02-26 15:59:45
    测试单片机型号:STC15W408AS 注意事项 1.串口波特率使用的是定时器2作为波特率发生器 2.波特率为115200bps@MCU频率22.1184MHz 3.串口接收数据使用完后,需要加UartEmp();函数清零接收数组。 4.接收数据为字符串时,...
  • STC15W408AS开发源码,以及stc-isp下载工具,stc-usb驱动
  • STC15W408AS制作的红外遥控小夜灯.rar
  • 二、原理及电路设计有了需求后,我们就根据需求选择元件,单片机我们选择STC15w408AS,此单片机内部集成了高精度的RC振荡电路和高可靠的复位电路,直接外部晶振和复位电路都可以省去,芯片接通电源后就可以直接工作...
  • 基于STC15W408S单片机智能安全插座设计.pdf
  • STC单片机stc-isp-15xx v6.83下载工具,STC15W408AS的AD转换串口输出源码,附带有STC-USB CH340_CH341驱动及安装说明。 打开V6.79版(或者更新的版本)的STC-ISP下载软件,下载软件会自动将驱动文件复制到相关的...
  • 基于STC15W408AD单片机的车载新型智能窗设计.pdf
  • 基于STC15W408AS单片机的无线充电电动小车设计.pdf
  • 基于STC15W408AS单片机的新型室内通风换气装置.pdf
  • STC15W408AS单片机驱动0.96英寸OLED显示屏,显示时间,芯片DS3231,加上滑动按键。
  • 2.STC15W408AS单片机时钟

    2021-06-28 09:56:50
    STC15W408AS单片机有两个时钟源:内部高精度R/C时钟和外部时钟(外部输入时钟或外部晶体振荡器产生的时钟)。内部高精度R/C时钟(±0.3%),±1%温漂,常温下温漂±0.6%(-20℃~+65℃)。 一、内部时钟配置 内部时钟配置...

            STC15W408AS单片机有两个时钟源:内部高精度R/C时钟和外部时钟(外部输入时钟或外部晶体振荡器产生的时钟)。内部高精度R/C时钟(±0.3%),±1%温漂,常温下温漂±0.6%(-20℃~+65℃)。

    一、内部时钟配置

    内部时钟配置是通过STC提供的下载软件stc-isp实现的。用户可根据自己的需要选择。 图片         

    二、主时钟分频和分频寄存器

            如果希望降低系统功耗,可对时钟进行分频。利用时钟分频控制寄存器CLK_DIV(PCON2)

    可进行时钟分频,从而使单片机在较低频率下工作。

    时钟分频寄存器CLK_DIV (PCON2)各位的定义如下:

    图片

    相关控制位说明:

    图片图片         

    三、时钟结构

    图片        

            主时钟既可以是内部R/C时钟,也可以是外部输入的时钟或外部晶体振荡产生的时钟。但对于无外部时钟源的单片机(STC15F100W系列、STC15W201S系列、STC15W404S系列、STC15W1K16S系列)以及现供货的STC15F2K60S2系列C版单片机,其主时钟只能是内部R/C时钟。

            主时钟可在管脚MCLKO或MCLKO_2对外输出。其中,STC15系列8-pin单片机(如STC15F100W系列)在MCLKO/P3.4口对外输出时钟;STC15F2K60S2系列、STC15W201S系列及STC15F408AD系列单片机在

    MCLKO/P5.4口对外输出时钟;而STC15W404S系列及STC15W1K16S系列单片机除可在MCLKO/P5.4口对外输出时钟外,还可在MCLKO_2/P1.6口对外输出时钟。

            系统时钟是指对主时钟进行分频后供给CPU、定时器、串行口、SPI、CCP/PWM/PCA、A/D转换的实际工作时钟。

    MCLK是指主时钟频率,MCLKO是指系统时钟输出。SysClk是指系统时钟频率,SysClkO是指系统时钟输出。

    MCLKO_2:主时钟对外输出位置的选择位

         0:在MCLKO/P5.4口对外输出主时钟;

         1:在MCLKO_2/P1.6口对外输出主时钟;

    四、测试程序

    #include "stc15.h"
    // 对外输出分频控制
    #define MCKO_0  0x00  // 主时钟不对外输出时钟
    #define MCKO_1  0x40  // 主时钟对外输出时钟,但时钟频率不被分频,输出时钟频率 = MCLK / 1
    #define MCKO_2  0x80  // 主时钟对外输出时钟,但时钟频率被2分频,输出时钟频率 = MCLK / 2
    #define MCKO_4  0xC0  // 主时钟对外输出时钟,但时钟频率被4分频,输出时钟频率 = MCLK / 4
    // 主频时钟分频控制
    #define CLKS_1    0x00  // 主时钟频率/1,不分频
    #define CLKS_2    0x01  // 主时钟频率/2
    #define CLKS_4    0x02  // 主时钟频率/4
    #define CLKS_8    0x03  // 主时钟频率/8
    #define CLKS_16   0x04  // 主时钟频率/16
    #define CLKS_32   0x05  // 主时钟频率/32
    #define CLKS_64   0x06  // 主时钟频率/64
    #define CLKS_128  0x07  // 主时钟频率/128
    // 对外输出管脚控制
    #define MCLKO_2  0x00;  // 在MCLKO/P5.4口对外输出主时钟;
    void main()
    {
      CLK_DIV = MCKO_1 | CLKS_2; // 主频时钟对外输出2分频 在P5.4对外输出
      while (1);
    }

    五、实际效果图

           图片           

    可以看见输入的频率是5.54MHz基本是STC-ISP下载软件设置的11.0592MHz的一半。

    展开全文
  • 51飞行器电调 -STC15W408AS-电调原理图+C程序
  • stc15w408as点灯基础教学

    千次阅读 2020-10-09 17:15:04
    stc15w408as使用: 实物图:(这个是16脚直插的芯片) 引脚图: 性能: 编译环境:Keil uVision4 烧录环境:STC-ISP 编写程序: 打开Keil uVision4软件后先建立一个新工程。点击下图的蓝色选项 选择一个你想...

    stc15w408as使用:
    实物图:(这个是16脚直插的芯片)
    在这里插入图片描述

    引脚图:
    在这里插入图片描述

    性能:
    在这里插入图片描述

    编译环境:Keil uVision4

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

    烧录环境:STC-ISP
    在这里插入图片描述
    在这里插入图片描述

    编写程序:

    打开Keil uVision4软件后先建立一个新工程。点击下图的蓝色选项
    在这里插入图片描述

    选择一个你想存放文件的文件夹,写上你想要的文件名后点击保存。(文件名称最好的英文的,中文名称容易出错)
    在这里插入图片描述

    点击Atmel旁边的加号
    在这里插入图片描述
    点击AT89C52,然后点击OK(这里是选择单片机型号,C52单片机的文件15w408as也能用)
    在这里插入图片描述

    点击是
    在这里插入图片描述

    新建文件:点击蓝色选项建立一个新的文件
    在这里插入图片描述

    保存文件:在点击编写框后点击点击蓝色选项或Ctrl+s
    在这里插入图片描述

    文件保存在建立工程同一文件夹里面(一般默认就是与工程同一文件夹的位置),文件名后缀为.c(中文名容易出错误)。点击保存
    在这里插入图片描述

    加载文件进工程(告诉工程它能调用些什么文件):点击蓝色选项
    在这里插入图片描述

    点击刚刚建立的.c文件,然后点击Add。
    在这里插入图片描述

    此时新建的.c文件已经加载进工程了,可以在新建.c文件的编写框写代码了。
    在这里插入图片描述

    stc15w408as点灯程序:
    #include"reg52.h"

    sbit led=P1^1;

    void Delay_us(int n)
    {
    int x;

    while (n--)
    {
        x = 5000;
        while (x--);
    }
    

    }

    void main()
    {
    led=1;
    while(1)
    {
    led=~led;
    Delay_us(100);
    }
    }

    在编写框写上程序
    在这里插入图片描述

    点击箭头所指的蓝色框框

    在这里插入图片描述

    点击上方的Output,勾选上Create HEX File。让它可以生成烧录所需的.hex文件,按下ok
    在这里插入图片描述

    点击上方红色箭头所指的蓝色框框,点击后会生成下方红色划线的英文,代表已经生成.hex文件在“temp”文件夹里面。在这里插入图片描述
    电路连接:电路
    在这里插入图片描述

    我是在面包版上进行连接的,用其他的东西来连接都可以的,只要各个元器件线路是按电路图连接好的就行。
    在这里插入图片描述

    用串口通讯的方式给stc15w408as芯片烧写程序。下图的模块是一个usb转ttl模块。用这个模块作为电脑和芯片通讯的桥梁,同时用这个模块给408as芯片供电。这个模块的rx脚接芯片的tx脚,tx脚接芯片的rx脚。将这个模块插入电脑的usb插口。
    在这里插入图片描述

    程序烧录进芯片:
    打开烧录软件STC-ISP
    在这里插入图片描述
    在这里插入图片描述

    点击单片机型号,拉出选项,点开STC15W408AS系列,选着STC15W408AS.
    在这里插入图片描述

    点开串口号,选着你usb转ttl模块7插入电脑串口的串口号(一般会自动选着,如果没有插入其他东西的话)。
    在这里插入图片描述

    点击“打开程序文件”

    在这里插入图片描述

    找到之前的文件生成的.hex文件(一般在程序保存文件夹里面,就是上面教学让你们保存的地方),点击后点打开。

    在这里插入图片描述
    点击“下载/编程”

    在这里插入图片描述
    消息框提示“正在检测目标单片机”时,手动冷启动stc15w408as芯片。

    在这里插入图片描述
    冷启动:就是给芯片断电在上电
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    消息框显示成功后,stc15w408as就点灯成功了。
    在这里插入图片描述

    展开全文
  • 亲自测试好用的STC15W408AS驱动0.96英寸OLED显示屏程序,文件包括keil文件,驱动显示屏函数代码分析,和显示屏显示实际效果图片。 文件夹中包含两个代码文件,其中一个《显示图片》为和文件夹中手机显示图片一样,...
  • STC15W408AS只有一个串口,串口1,有4种工作方式,其中两种方式的波特率是可变的,另两种是固定的,以供不同应用场合选用。 一、串口1相关寄存器 下面只把接下来我需要的寄存器和寄存器的位说明一下。 1.1 控制...

            STC15W408AS只有一个串口,串口1,有4种工作方式,其中两种方式的波特率是可变的,另两种是固定的,以供不同应用场合选用。

    一、串口1相关寄存器

    下面只把接下来我需要的寄存器和寄存器的位说明一下。

    1.1 控制寄存器SCON

    其中SM0、SM1按下列组合确定串行口1的工作方式:

    REN:允许/禁止串行接收控制位。由软件置位REN,即REN=1为允许串行接收状态,可启动串行接收器RxD,开始接收信息。软件复位REN,即REN=0,则禁止接收。

    TI: 发送中断请求标志位。在方式0,当串行发送数据第8位结束时,由内部硬件自动置位,即TI=1,向主机请求中断,响应中断后TI必须用软件清零,即TI=0。在其他方式中,则在停止位开始发送时由内部硬件置位,即TI=1,响应中断后TI必须用软件清零。

    RI: 接收中断请求标志位。在方式0,当串行接收到第8位结束时由内部硬件自动置位RI=1,向主机请求中断,响应中断后RI必须用软件清零,即RI=0。在其他方式中,串行接收到停止位的中间时刻由内部硬件置位,即RI=1,向CPU发中断申请,响应中断后RI必须由软件清零。串行通信的中断请求:当一帧发送完成,内部硬件自动置位TI,即TI=1,请求中断处理;当接收完一帧信息时,内部硬件自动置位RI,即RI=1,请求中断处理。由于TI和RI以"或逻辑"关系向主机请求中断,所以主机响应中断时事先并不知道是TI还是RI请求的中断,必须在中断服务程序中查询TI和RI进行判别,然后分别处理。因此,两个中断请求标志位均不能由硬件自动置位,必须通过软件清0,否则将出现一次请求多次响应的错误。电源控制寄存器PCON中的SMOD/PCON.7用于设置方式1、方式2、方式3的波特率是否加倍。

    1.2 数据缓冲寄存器SBUF

            STC15系列单片机的串行口1缓冲寄存器(SBUF)的地址是99H,实际是2个缓冲器,写SBUF的操作完成待发送数据的加载,读SBUF的操作可获得已接收到的数据。两个操作分别对应两个不同的寄存器,1个是只写寄存器,1个是只读寄存器。串行通道内设有数据寄存器。在所有的串行通信方式中,在写入SBUF信号(MOV SBUF,A)的控制下,把数据装入相同的9位移位寄存器,前面8位为数据字节,其最低位为移位寄存器的输出位。根据不同的工作方式会自动将 1" TB8的值装入移位寄存器的第9位,并进行发送。串行通道的接收寄存器是一个输入移位寄存器。在方式0时它的字长为8位,其他方式时为9位。当一帧接收完毕,移位寄存器中的数据字节装入串行数据缓冲器SBUF中,其第9位则装入SCON寄存器中的RB8位。如果由于SM2使得已接收到的数据无效时,RB8和SBUF中内容不变。由于接收通道内设有输入移位寄存器和SBUF缓冲器,从而能使一帧接收完将数据由移位寄存器装入SBUF后,可立即开始接收下一帧信息,主机应在该帧接收结束前从SBUF缓冲器中将数据取走,否则前一帧数据将丢失。SBUF以并行方式送往内部数据总线。

    1.3 辅助寄存器AUXR

    T0x12: 定时器0速度控制位

            0, 定时器0是传统8051速度,12分频;

            1, 定时器0的速度是传统8051的12倍,不分频

    T1x12: 定时器1速度控制位

            0, 定时器1是传统8051速度,12分频;

            1, 定时器1的速度是传统8051的12倍,不分频

    如果UART1/串口1用T1作为波特率发生器,则由T1x12决定UART1/串口是12T还是1T

    UART_M0x6: 串口模式0的通信速度设置位

            0, 串口1模式0的速度是传统8051单片机串口的速度,12分频;

            1, 串口1模式0的速度是传统8051单片机串口速度的6倍,2分频

    T2R: 定时器2允许控制位

            0, 不允许定时器2运行;

            1, 允许定时器2运行

    T2_C/T: 控制定时器2用作定时器或计数器

            0, 用作定时器(对内部系统时钟进行计数);

            1, 用作计数器(对引脚T2/P3.1的外部脉冲进行计数)

    T2x12: 定时器2速度控制位

            0, 定时器2是传统8051速度,12分频;

            1, 定时器2的速度是传统8051的12倍,不分频

    如果串口1或串口2用T2作为波特率发生器,则由T2x12决定串口1或串口2是12T还是1T.

    EXTRAM: 内部/外部RAM存取控制位

            0, 允许使用逻辑上在片外、物理上在片内的扩展RAM;

            1, 禁止使用逻辑上在片外、物理上在片内的扩展RAM

    S1ST2: 串口1(UART1)选择定时器2作波特率发生器的控制位

            0, 选择定时器1作为串口1(UART1)的波特率发生器;

            1, 选择定时器2作为串口1(UART1)的波特率发生器,此时定时器1得到释放,可以作为独立定时器使用串口1可以选择定时器1做波特率发生器,也可以选择定时器2作为 波特率发生器当设置AUXR寄存器中的S1ST2位(串行口波特率选择位)为1时,串行口1选择定时器2作为波特率发生器,此时定时器1可以释放出来作为定时器/计数器/时钟输出使用。

            对于STC15系列单片机,串口2只能使用定时器2作为其波特率发生器,不能够选择其他定时器作为波特率发生器。而串口1默认选择定时器2作为其波特率发生器,也可以选择定时器1作为其波特率发生器;串口3默认选择定时器2作为其波特率发生器,也可以选择定时器3作为其波特率发生器;串口4默认选择定时器2作为其波特率发生器,也可以选择定时器4作为其波特率发生器。

    1.4 定时器2的寄存器T2H, T2L

    定时器2寄存器T2H(地址为D6H,复位值为00H)及寄存器T2L(地址为D7H,复位值为00H)用于保存重装时间常数。

    注意:对于STC15串口2只能使用定时器2作为其波特率发生器,不能够选择其他定时器作为波特率发生器;而串口1默认选择定时器2作为其波特率发生器,也可以选择定时器1作为其波特率发生器;串口3默认选择定时器2作为其波特率发生器,也可以选择定时器3作为其波特率发生器;串口4默认选择定时器2作为其波特率发生器,也可以选择定时器4作为其波特率发生器。

    1.5 与串行口1中断相关的寄存器位ES和PS

    串行口中断允许位ES位于中断允许寄存器IE中,中断允许寄存器的格式如下:

    IE : 中断允许寄存器 (可位寻址)

    EA : CPU的总中断允许控制位

            EA=1,CPU开放中断,

            EA=0,CPU屏蔽所有的中断申请。

    EA的作用是使中断允许形成多级控制。即各中断源首先受EA控制;其次还受各中断源自己的

    中断允许控制位控制。

    ES : 串行口中断允许位

            ES=1,允许串行口中断,

            ES=0,禁止串行口中断。

    IP : 中断优先级控制寄存器低 (可位寻址)

    PS: 串行口1中断优先级控制位。

    当PS=0时,串行口1中断为最低优先级中断(优先级0)

    当PS=1时,串行口1中断为最高优先级中断(优先级1)

    二、串口1工作模式1:8位UART,波特率可变

            当软件设置SCON的SM0、SM1为"01" 时,串口1则以模式1工作。此模式为8位UART格式,一帧信息为10位:1位起始位,8位数据位(低位在先)和1位停止位。波特率可变,即可根据需要进行设置。TxD/P3.1为发送信息,RxD/P3.0为接收端接收信息,串行口为全双工接受/发送串行口模式1的发送过程:串行通信模式发送时,数据由串行发送端TxD输出。当主机执行一条写 SBUF" 的指令就启动串行通信的发送,写"SBUF"信号还把"1"装入发送移位寄存器的第9位,并通知TX控制单元开始发送。发送各位的定时是由16分频计数器同步。移位寄存器将数据不断右移送TxD端口发送,在数据的左边不断移入"0"作补充。当数据的最高位移到移位寄存器的输出位置,紧跟其后的是第9位 1" ,在它的左边各位全为"0" ,这个条件,使TX控制单元作最后一次移位输出,然后使允许发送信号 SEND"失效,完成一帧信息的发送,并置位中断请求位TI,即TI=1,向主机请求中断处理。

            模式1的接收过程:当软件置位接收允许标志位REN,即REN=1时,接收器便以选定波特率的16分频的速率采样串行接收端口RxD,当检测到RxD端口从 "1"→"0"的负跳变时就启动接收器准备接收数据,并立即复位16分频计数器,将1FFH植装入移位寄存器。复位16分频计数器是使它与输入位时间同步。16分频计数器的16个状态是将1波特率(每位接收时间)均为16等份,在每位时间的7、8、9状态由检测器对RxD端口进行采样,所接收的值是这次采样直经"三中取二" 即3次采样至少2次相同的值,以此消除干扰影响,提高可靠性。在起始位,如果接收到的值不为"0"(低电平),则起始位无效,复位接收电路,并重新检测 1"→0" 的起始位有效,则将它输入移位寄存器,并接收本帧的其余信息。接收的数据从接收移位寄存器的右边移入,已装入的1FFH向左边移出,当起始位 0" 移位寄存器的最左边时,使RX控制器作最后一次移位,完成一帧的接收。若同时满足以下两个条件:

    ·RI=0;

    ·SM2=0或接收到的停止位为1。

    则接收到的数据有效,实现装载入SBUF,停止位进入RB8,置位RI,即RI=1,向主机请求中断,若上述两条件不能同时满足,则接收到的数据作废并丢失,无论条件满足与否,接收器重又检测RxD端口上的 "1"→"0"的跳变,继续下一帧的接收。接收有效,在响应中断后,必须由软件清0,即RI=0。通常情况下,串行通信工作于模式1时,SM2设置为"0"。

    三、串口1测试程序

    #include "stc15.h"
    
    typedef unsigned char BYTE;
    typedef unsigned int WORD;
    
    #define FOSC 11059200L          //系统频率
    #define BAUD 9600               //串口波特率
    
    void SendData(BYTE dat);
    void SendString(char *s);
    
    void main()
    {
    	SCON = 0x50;                //8位可变波特率 串口工作模式1
    	T2L = (65536 - (FOSC/4/BAUD));   //设置波特率重装值
    	T2H = (65536 - (FOSC/4/BAUD))>>8;
    	AUXR = 0x14;                //T2为1T模式, 并启动定时器2
    	AUXR |= 0x01;               //选择定时器2为串口1的波特率发生器
    	ES = 1;                     //使能串口1中断
    	EA = 1;
    	while(1);
    }
    // UART 中断服务程序
    void Uart() interrupt 4
    {	
    	// 接收中断标志位
    	if (RI)
    	{
    		RI = 0;                 //清除RI位
    		SendData(SBUF + 1);     // 把接收的数据+1 再发送出去
    	}
    	// 发送中断标志位
    	if (TI)
    	{
    		TI = 0;                 //清除TI位
    		SendString("发送完成!\r\n");
    	 }
    }
    // 发送串口数据
    void SendData(BYTE dat)
    {
      SBUF = dat;
    	while(TI == 0);
    	TI = 0;
    }
    // 发送字符串
    void SendString(char *s)
    {
        while (*s)                  //检测字符串结束标志
        {
            SendData(*s++);         //发送当前字符
        }
    }

    这个实验就是把接受到的数据+1,再发送出去。

     

    展开全文
  • 基于STC15W408AD单片机的智能高压气体灯单灯控制系统的设计.pdf
  • 10.STC15W408AS单片机A/D转换器 STC15系列单片机内部集成了8路10位高速A/D转换器。STC15系列单片机的A/D转换口在P1口(P1.7-P1.0),有8路10位高速A/D转换器,速度到300KHz(30万次/秒)。8路电压输入型A/D,可做温度...

            10.STC15W408AS单片机A/D转换器

            STC15系列单片机内部集成了8路10位高速A/D转换器。STC15系列单片机的A/D转换口在P1口(P1.7-P1.0),有8路10位高速A/D转换器,速度到300KHz(30万次/秒)。8路电压输入型A/D,可做温度检测、电池电压检测、按键扫描、频谱检测等。

     

    1.A/D转换器的结构

    STC15系列单片机ADC由多路选择开关、比较器、逐次比较寄存器、10位DAC、转换结果寄存器(ADC_RES和ADC_RESL)以及ADC_CONTR构成。

    STC15系列单片机的ADC是逐次比较型ADC。逐次比较型ADC由一个比较器和D/A转换器构成,通过逐次比较逻辑,从最高位(MSB)开始,顺序地对每一输入电压与内置D/A转换器输出进行比较,经过多次比较,使转换所得的数字量逐次逼近输入模拟量对应值。逐次比较型A/D转换器具有速度高,功耗低等优点。

    从上图可以看出,通过模拟多路开关,将通过ADC0~7的模拟量输入送给比较器。用数/模转换器(DAC)转换的模拟量与输入的模拟量通过比较器进行比较,将比较结果保存到逐次比较寄存器,并通过逐次比较寄存器输出转换结果。A/D转换结束后,最终的转换结果保存到ADC转换结果寄存器ADC_RES和ADC_RESL,同时,置位ADC控制寄存器ADC_CONTR中的A/D转换结束标志位ADC_FLAG,以供程序查询或发出中断申请。模拟通道的选择控制由ADC控制寄存器ADC_CONTR中的CHS2~CHS0确定。ADC的转换速度由ADC控制寄存器中的SPEED1和SPEED0确定。在使用ADC之前,应先给ADC上电,也就是置位ADC控制寄存器中的ADC_POWER位。

    当CLK_DIV.5(PCON2.5)/ADRJ = 0时,A/D转换结果寄存器格式如下:

    当ADRJ=0时,如果取10位结果,则按下面公式计算:

    当ADRJ=0时,如果取8位结果,按下面公式计算:

    当CLK_DIV.5(PCON2.5)/ADRJ = 1时,A/D转换结果寄存器格式如下:

    当ADRJ=1时,如果取10位结果,则按下面公式计算:

    式中,Vin为模拟输入通道输入电压,Vcc为单片机实际工作电压,用单片机工作电压作为

    模拟参考电压。

    2.与A/D转换相关的寄存器

    与STC15系列单片机A/D转换相关的寄存器列于下表所示。

    2.1 P1口模拟功能控制寄存器P1ASF

    STC15系列单片机的A/D转换口在P1口(P1.7-P1.0),有8路10位高速A/D转换器速度可达到到300KHz(30万次/秒)。8路电压输入型A/D,可做温度检测、电池电压检测、按键扫描、频谱检测等。上电复位后P1口为弱上拉型I/O口,用户可以通过软件设置将8路中的任何一路设置为A/D转换,不需作为A/D使用的P1口可继续作为I/O口使用(建议只作为输入)。需作为A/D使用的口需先将P1ASF特殊功能寄存器中的相应位置为‘1’,将相应的口设置为模拟功能。 P1ASF存器的格式如下:

    P1ASF : P1口模拟功能控制寄存器(该寄存器是只写寄存器,读无效)

    2.2 ADC控制寄存器ADC_CONTR

    ADC_CONTR寄存器的格式如下:

    ADC_CONTR : ADC控制寄存器

    对ADC_CONTR寄存器进行操作,建议直接用MOV赋值语句,不要用‘与’和‘或’语句。

    ADC_POWER: ADC 电源控制位。

    0:关闭ADC 电源;

    1:打开A/D转换器电源.

    建议进入空闲模式和掉电模式前,将ADC电源关闭,即ADC_POWER =0,可降低功耗。

    启动A/D转换前一定要确认A/D电源已打开,A/D转换结束后关闭A/D电源可降低功耗,也可

    不关闭。初次打开内部A/D转换模拟电源,需适当延时,等内部模拟电源稳定后,再启

    动A/D转换。

    建议启动A/D转换后,在A/D转换结束之前,不改变任何I/O口的状态,有利于高精度A/D转换,如能将定时器/串行口/中断系统关闭更好。

    SPEED1,SPEED0:模数转换器转换速度控制位

    ADC_FLAG: 模数转换器转换结束标志位,当A/D转换完成后,ADC_FLAG = 1,要由软件清0。

    不管是A/D 转换完成后由该位申请产生中断,还是由软件查询该标志位A/D转换是

    否结束,当A/D转换完成后,ADC_FLAG = 1,一定要软件清0。

    ADC_START:模数转换器(ADC)转换启动控制位,设置为“1”时,开始转换,转换结束后为0。

    CHS2/CHS1/CHS0:模拟输入通道选择,CHS2/CHS1/CHS0

    2.3 ADC转换结果调整寄存器位——ADRJ

    ADC转换结果调整寄存器位——ADRJ位于寄存器CLK_DIV/PCON中,用于控制ADC转换

    结果存放的位置。

    ADRJ:ADC转换结果调整

    0:ADC_RES[7:0]存放高8位ADC结果,ADC_RESL[1:0]存放低2位ADC结果

    1:ADC_RES[1:0]存放高2位ADC结果,ADC_RESL[7:0]存放低8位ADC结果

    2.4 A/D转换结果寄存器ADC_RES、ADC_RESL

    特殊功能寄存器ADC_RES和ADC_RESL寄存器用于保存A/D转换结果,其格式如下:

    CKKO_DIV寄存器的ADRJ位是A/D转换结果寄存器(ADC_RES,ADC_RESL)的数据格式调整控制位。

    当ADRJ=0时,10位是A/D转换结果的高8位存放在在ADC_RES中,低2位存放在ADC_RESL的低2位中。

    2.5 中断允许寄存器IE

    IE : 中断允许寄存器 (可位寻址)

    EA : CPU的中断开放标志

    EA=1,CPU开放中断,

    EA=0,CPU屏蔽所有的中断申请。

    EA的作用是使中断允许形成多级控制。即各中断源首先受EA控制;其次还受各中断源自己的

    中断允许控制位控制。

    EADC : A/D转换中断允许位

    EADC=1,允许A/D转换中断,

    EADC=0,禁止A/D转换中断。

    2.6 A/D转换典型应用线路

    3.测试程序

    3.1 中断方式

    #include "stc15.h"
    #include "intrins.h"
    #include "delay.h"
    
    #define uchar unsigned char
    #define uint unsigned int
    
    #define FOSC 11059200L          //系统频率
    #define BAUD 9600               //串口波特率
    
    void UatrInit();
    void SendData(uchar dat);
    void SendString(char *s);
    void AdInit();
    
    
    uchar num[10] = {'0','1','2','3','4','5','6','7','8','9'};
    uint adc_result = 0;
    
    void main()
    {
    	P1M0 = 0x02;
    	P1M1 = 0x00;
    	UatrInit();
    	AdInit();
    	EA = 1;    // CPU开放中断
    	while (1);
    }
    // 初始化串口
    void UatrInit()
    {
    	SCON = 0x50;                //8位可变波特率 串口工作模式1
    	T2L = (65536 - (FOSC/4/BAUD));   //设置波特率重装值
    	T2H = (65536 - (FOSC/4/BAUD))>>8;
    	AUXR = 0x14;                //T2为1T模式, 并启动定时器2
    	AUXR |= 0x01;               //选择定时器2为串口1的波特率发生器
    	ES = 1;                     //使能串口1中断
    }
    // 初始化ADC
    void AdInit()
    {
    	P1ASF = 0x01;  // P1.0作为模拟功能A/D使用
    	ADC_RES = 0;
    	ADC_RESL = 0;   // 结果寄存器清零
    	ADC_CONTR = 0x88;  // 打开ADC的电源  540个周期转换一次 选择P1.0作为A/D输入来用  
    	delayus(20);
    	EADC = 1;  // 允许A/D转换中断
    }
    // ADC中断服务函数
    void adc_isr() interrupt 5
    {
    	ADC_CONTR &= !0x10; // 清除ADC中断标志
    	adc_result = ADC_RES*4 + ADC_RESL;    // 获取ADC结果,高2位在前
    	SendData(num[adc_result/1000]);       // 千
    	SendData(num[adc_result%1000/100]);   // 百
    	SendData(num[adc_result%100/10]);     // 十
    	SendData(num[adc_result%10]);         // 个
    
    //	SendData(ADC_RES);
    //	SendData(ADC_RESL);
    
    	SendString("\r\n");  // 换行
    	ADC_CONTR = 0x88;    // 开始ADC 转换
    	delayms(2000);
    }
    // 发送串口数据
    void SendData(uchar dat)
    {
      SBUF = dat;
    	while(TI == 0);
    	TI = 0;
    }
    // 发送字符串
    void SendString(char *s)
    {
        while (*s)                  //检测字符串结束标志
        {
            SendData(*s++);         //发送当前字符
        }
    }
    // 串口中断
    void Uart() interrupt 4
    {	
    	// 接收中断标志位
    	if (RI)
    	{
    		RI = 0;                 //清除RI位
    		//  P0 = SBUF;              //P0显示串口数据
    		SendString("HELLO\r\n");
    	}
    	// 发送中断标志位
    	if (TI)
    	{
    		TI = 0;                 //清除TI位
    		SendString("发送完成!\r\n");
    	 }
    }
    

    3.2 查询方式

    #include "stc15.h"
    #include "intrins.h"
    #include "delay.h"
    
    #define uchar unsigned char
    #define uint unsigned int
    
    #define FOSC 11059200L          //系统频率
    #define BAUD 9600               //串口波特率
    
    void UatrInit();
    void SendData(uchar dat);
    void SendString(char *s);
    void AdInit();
    uint GetADCResult();
    
    uchar num[10] = {'0','1','2','3','4','5','6','7','8','9'};
    uint adc_result = 0;
    
    void main()
    {
    	P1M0 = 0x02;
    	P1M1 = 0x00;
    	UatrInit();
    	AdInit();
    	EA = 1;    // CPU开放中断
    	while (1)
    	{
    		adc_result = GetADCResult();
    		SendData(num[adc_result/1000]);
    		SendData(num[adc_result%1000/100]);
    		SendData(num[adc_result%100/10]);
    		SendData(num[adc_result%10]);
    		SendString("\r\n");
    		delayms(2000);
    	}
    }
    // 初始化串口
    void UatrInit()
    {
    	SCON = 0x50;                //8位可变波特率 串口工作模式1
    	T2L = (65536 - (FOSC/4/BAUD));   //设置波特率重装值
    	T2H = (65536 - (FOSC/4/BAUD))>>8;
    	AUXR = 0x14;                //T2为1T模式, 并启动定时器2
    	AUXR |= 0x01;               //选择定时器2为串口1的波特率发生器
    	ES = 1;                     //使能串口1中断
    }
    // 初始化ADC
    void AdInit()
    {
    	P1ASF = 0x01;  // P1.0作为模拟功能A/D使用
    	ADC_RES = 0;
    	ADC_RESL = 0;   // 结果寄存器清零
    	ADC_CONTR = 0x88;  // 打开ADC的电源  540个周期转换一次 选择P1.0作为A/D输入来用  
    	delayus(20);
    // 	EADC = 1;  // 允许A/D转换中断
    }
    // 读取ADC结果
    uint GetADCResult()
    {
    	ADC_CONTR = 0x88;
    	_nop_();                        //等待4个NOP
    	_nop_();
    	_nop_();
    	_nop_();
    	while (!(ADC_CONTR & 0x10));//等待ADC转换完成
    	ADC_CONTR &= ~0x10;         //Close ADC
    	return ADC_RES*4 + ADC_RESL;                //返回ADC结果
    
    }
    // 发送串口数据
    void SendData(uchar dat)
    {
      SBUF = dat;
    	while(TI == 0);
    	TI = 0;
    }
    // 发送字符串
    void SendString(char *s)
    {
    	while (*s)                  //检测字符串结束标志
    	{
    		SendData(*s++);         //发送当前字符
    	}
    }
    // 串门中断
    void Uart() interrupt 4
    {	
    	// 接收中断标志位
    	if (RI)
    	{
    		RI = 0;                 //清除RI位
    	}
    	// 发送中断标志位
    	if (TI)
    	{
    		TI = 0;                 //清除TI位
    	 }
    }
    

    四、利用新增的ADC第9通道测量内部参考电压的测试程序

    ADC的第9通道是用来测试内部BandGap参考电压的,由于内部BandGap参考电压很稳定,不会随芯片的工作电压的改变而变化,所以可以通过测量内部BandGap参考电压,然后通过ADC的值便可反推出VCC的电压,从而用户可以实现自己的低压检测功能。ADC的第9通道的测量方法:首先将P1ASF初始化为0,即关闭所有P1口的模拟功能然后通过正常的ADC转换的方法读取第0通道的值,即可通过ADC的第9通道读取当前内部BandGap参考电压值。用户实现自己的低压检测功能的实现方法:首先用户需要在VCC很精准的情况下(比如5.0V),测量出内部BandGap参考电压的ADC转换值(比如为BGV5),并将这个值保存到EEPROM中,然后在低压检测的代码中,在实际VCC变化后,测量出的内部BandGap参考电压的ADC转换值(比如为BGVx),最后通过计算公式: 实际VCC = 5.0V * BGV5 / BGVx,即可计算出实际的VCC电压值 ,需要注意的是,第一步的BGV5的基准测量一定要精确。

    测试程序:

    #include "stc15.h"
    #include "intrins.h"
    #include "delay.h"
    
    #define uchar unsigned char
    #define uint unsigned int
    
    #define FOSC 11059200L          //系统频率
    #define BAUD 9600               //串口波特率
    
    void UatrInit();
    void SendData(uchar dat);
    void SendString(char *s);
    void AdInit();
    uint GetADCResult();
    
    
    uchar num[] = {'0','1','2','3','4','5','6','7','8','9'};
    uint adc_result = 0;
    
    void main()
    {
    	P1M0 = 0x02;
    	P1M1 = 0x00;
    	UatrInit();
    	AdInit();
    	EA = 1;    // CPU开放中断
    	while (1)
    	{
    		adc_result = GetADCResult();
    		SendData(num[adc_result/1000]);       
    		SendData(num[adc_result%1000/100]);
    		SendData(num[adc_result%100/10]);
    		SendData(num[adc_result%10]);
            // 串口输出的是0259
            // 实际内部电压  259÷1024*5 = 1.264V
            // 这个假设电源电压是5V,和下载工具显示的内部电压1245mV很接近了
    		SendString("\r\n");
    		delayms(2000);
    	}
    }
    // 初始化串口
    void UatrInit()
    {
    	SCON = 0x50;                //8位可变波特率 串口工作模式1
    	T2L = (65536 - (FOSC/4/BAUD));   //设置波特率重装值
    	T2H = (65536 - (FOSC/4/BAUD))>>8;
    	AUXR = 0x14;                //T2为1T模式, 并启动定时器2
    	AUXR |= 0x01;               //选择定时器2为串口1的波特率发生器
    	ES = 1;                     //使能串口1中断
    }
    // 初始化ADC
    void AdInit()
    {
    	P1ASF = 0x00;  // P1不作为模拟功能A/D使用
    	ADC_RES = 0;
    	ADC_RESL = 0;   // 结果寄存器清零
    	ADC_CONTR = 0x88;  // 打开ADC的电源  540个周期转换一次 选择P1.0作为A/D输入来用  
    	delayus(20);
    // 	EADC = 1;  // 允许A/D转换中断
    }
    // 读取ADC结果
    uint GetADCResult()
    {
    	ADC_CONTR = 0x88;
    	_nop_();                        //等待4个NOP
    	_nop_();
    	_nop_();
    	_nop_();
    	while (!(ADC_CONTR & 0x10));  //等待ADC转换完成
    	ADC_CONTR &= ~0x10;           //Close ADC
    	return ADC_RES*4 + ADC_RESL;  //返回ADC结果
    }
    // 发送串口数据
    void SendData(uchar dat)
    {
      SBUF = dat;
    	while(TI == 0);
    	TI = 0;
    }
    // 发送字符串
    void SendString(char *s)
    {
    	while (*s)                  //检测字符串结束标志
    	{
    		SendData(*s++);         //发送当前字符
    	}
    }
    // 串口中断服务函数
    void Uart() interrupt 4
    {	
    	// 接收中断标志位
    	if (RI)
    	{
    		RI = 0;                 //清除RI位
    		//  P0 = SBUF;              //P0显示串口数据
    		SendString("HELLO\r\n");
    	}
    	// 发送中断标志位
    	if (TI)
    	{
    		TI = 0;                 //清除TI位
    //		SendString("发送完成!\r\n");
    	 }
    }
    

    五、利用BandGap推算出电源电压

    在上面的例子中,我们通过A/D转换的第九通道得到了电源电压的AD值。由于内部BandGap参考电压很稳定,不会随芯片的工作电压的改变而变化,所以可以通过两次测量和一次计算便可得到外部的精确电压。

    计算公式:

    电源电压 = BandGap(电压mV)÷BandGap(AD转换值)×1024

    获取内部BandGap电压的程序

    #include "stc15.h"
    #include "intrins.h"
    #include "delay.h"
    
    #define uchar unsigned char
    #define uint unsigned int
    
    #define FOSC 11059200L          //系统频率
    #define BAUD 9600               //串口波特率
    
    #define ID_ADDR_RAM 0xef        //对于只有256字节RAM的MCU存放地址为0EFH
    
    //注意:需要在下载代码时选择"在ID号前添加重要测试参数"选项,才可在程序中获取此参数
    #define ID_ADDR_ROM 0x1ff7      //8K程序空间的MCU
    
    void UatrInit();
    void SendData(uchar dat);
    void SendString(char *s);
    void AdInit();
    uint GetADCResult();
    
    uchar num[] = {'0','1','2','3','4','5','6','7','8','9'};
    uint adc_result = 0;
    uint BandGap = 0;
    uint Vcc = 0;
    
    void main()
    {
    	uchar idata *iptr;
    	uchar code *cptr;
    	UatrInit();
    	AdInit();
    	EA = 1;    // CPU开放中断
    
    	while (1)
    	{	
    		iptr = ID_ADDR_RAM;         //从RAM区读取BandGap电压值(单位:毫伏mV)  实际结果和STC-ISP软件读取的一样  1245mV
    		BandGap =  *iptr++ * 256 + *iptr++;  // 1245mV
    		adc_result = GetADCResult();         // 结果为  259
    		Vcc = (double)BandGap/adc_result * 1024; // 得到电源电压 4.92V  实际使用万用表测试的也是这个数值
    		SendData(num[Vcc/1000]);
    		SendData(num[Vcc%1000/100]);
    		SendData(num[Vcc%100/10]);
    		SendData(num[Vcc%10]);
    		SendString("\r\n");		delayms(2000);
    	}
    }
    // 初始化串口
    void UatrInit()
    {
    	SCON = 0x50;                //8位可变波特率 串口工作模式1
    	T2L = (65536 - (FOSC/4/BAUD));   //设置波特率重装值
    	T2H = (65536 - (FOSC/4/BAUD))>>8;
    	AUXR = 0x14;                //T2为1T模式, 并启动定时器2
    	AUXR |= 0x01;               //选择定时器2为串口1的波特率发生器
    	ES = 1;                     //使能串口1中断
    }
    // 初始化ADC
    void AdInit()
    {
    	P1ASF = 0x00;  // P1不作为模拟功能A/D使用
    	ADC_RES = 0;
    	ADC_RESL = 0;   // 结果寄存器清零
    	ADC_CONTR = 0x88;  // 打开ADC的电源  540个周期转换一次 选择P1.0作为A/D输入来用  
    	delayus(20);
    // 	EADC = 1;  // 允许A/D转换中断
    }
    // 读取ADC结果 获取内部BandGap电压的AD转换值
    uint GetADCResult()
    {
    	ADC_CONTR = 0x88;
    	_nop_();                        //等待4个NOP
    	_nop_();
    	_nop_();
    	_nop_();
    	while (!(ADC_CONTR & 0x10));  //等待ADC转换完成
    	ADC_CONTR &= ~0x10;           //Close ADC
    	return ADC_RES*4 + ADC_RESL;  //返回ADC结果
    }
    // 发送串口数据
    void SendData(uchar dat)
    {
        SBUF = dat;
    	while(TI == 0);
    	TI = 0;
    }
    // 发送字符串
    void SendString(char *s)
    {
    	while (*s)                  //检测字符串结束标志
    	{
    		SendData(*s++);         //发送当前字符
    	}
    }
    // 串口服务函数
    void Uart() interrupt 4
    {	
    	// 接收中断标志位
    	if (RI)
    	{
    		RI = 0;                 //清除RI位
    	}
    	// 发送中断标志位
    	if (TI)
    	{
    		TI = 0;                 //清除TI位
    	 }
    }
    

    展开全文
  • STC15W408AS只有定时器0和定时器2,工作工作位定时器或者计数器模式。定时器/计数器的核心部件是一个加法计数器,其本质是对脉冲进行计数。只是计数脉冲来源不同:如果计数脉冲来自系统时钟,则为定时方式,此时...
  • 基于 STC15W408AS电流表设计LCD1602 显示(包含源程序原理图PCB)
  • STC15W408AS单片机有4个外部中断,它们分别是:外部中断0(INT0)、外部中断1(INT1)、外部中断2(INT2)、外部中断3(INT3)。 外部中断0(INT0)和外部中断1(INT1)触发有两种触发方式,上升沿或下降沿均可触发方式 和仅...
  • STC15W408S 最小系统板

    2021-05-27 17:50:39
    ③、板载主控STC15W408S。 ④、板载4个按键,1颗LED灯连接主控,用于调试。 ⑤、板载上电指示灯和USB自动下载电路,通过USB线就可实现下载,无需外接烧录器。 PCB文件下载连接 添加链接描述 ...
  • STC15W4K.H、STC15W408AS.h

    2019-02-14 21:05:58
    STC15W4K系列的两个头文件

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,921
精华内容 1,568
关键字:

stc15w408