CH254X 8051芯片手册介绍

1 8051CPU

8051是一种8位元的单芯片微控制器,属于MCS-51单芯片的一种,由英特尔(Intel)公司于1981年制造。Intel公司将MCS51的核心技术授权给了很多其它公司,所以有很多公司在做以8051为核心的单片机,如Atmel、飞利浦、深联华等公司,相继开发了功能更多、更强大的兼容产品。

总体架构 

CPU主要由以下几个部分组成:
(1)运算器: 运算器由算术/逻辑运算单元ALU、累加器ACC、寄存器B、暂存寄存器、程序状态字寄存器PSW组成。
(2)控制器: 控制器由指令寄存器IR、指令译码及控制逻辑电路组成。
(3)其他寄存器: 程序计数器PC、数据指针DPTR、堆栈指针SP、工作寄存器R0~R7

 

内存映射

SRAM映射到地址范围为0x0000到(SRAMSIZE-1) 

XREG区域映射到1KB地址范围(0x6000-0x63FF)中。这些寄存器是附加寄存器,有效地扩展了SFR寄存器空间。一些外围寄存器和大多数无线电控制和数据寄存器都映射在这里。

SFR寄存器映射到地址范围(0x7080-0x70FF)闪存信息页(2KB)陕射到地址范围(0x7800-0x7FFF)中。这是一个只读区域,包含有关设备的各种信息。

SFR寄存器地址总览

2 基础实验

2.1 流水灯

实验目的 

1) 通过实验掌握 CC2540 芯片 GPIO 的配置方法
2) 掌握 Led 驱动电路及开关 Led 的原理
3) 操作 IO 口控制 3 LED 灯的全亮和全灭、闪烁、流水灯

 相关寄存器

下面我们以 P1.0 控制的 LED1 为例,操作 P1.0 时我们需要掌握相关寄存器的作用和配置方法。

下面我们以 P1.0 控制的 LED1 为例,操作 P1.0 时我们需要掌握相关寄存 器的作用和配置方法。

/****************************************************************************
* 文 件 名: main.c
* 作    者: 
* 网    站: 
* 修    订: 
* 版    本: 1.0
* 描    述: 操作IO口控制4盏LED灯的全亮和全灭、闪烁、流水灯
****************************************************************************/
#include <ioCC2541.h>

#define uchar unsigned char 
#define uint unsigned int 

#define LED1 P1_0       //定义P1.0口为LED1控制端
#define LED2 P1_1       //定义P1.1口为LED2控制端
#define LED3 P0_4       //定义P0.4口为LED3控制端


/****************************************************************************
* 名    称: Delay_ms()
* 功    能: 以毫秒为单位延时,系统时钟不配置时默认为16M(用示波器测量相当精确)
* 入口参数: msec 延时参数,值越大,延时越久
* 出口参数: 无
****************************************************************************/
void DelayMs(uint len)
{ 
    while(len--)
        for (int i=0; i<535; i++);
}

/****************************************************************************
* 名    称: LedOnOrOff()
* 功    能: 点亮或熄灭所有LED灯    
* 入口参数: mode为1时LED灯亮  mode为0时LED灯灭, 共阴极
* 出口参数: 无
****************************************************************************/
void LedOnOff(uchar mode)
{
    LED1 = mode;
    LED2 = mode;
    LED3 = mode;
}

/****************************************************************************
* 名    称: InitLed()
* 功    能: 设置LED灯相应的IO口
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitLed(void)
{
    P1DIR |= 0x03;      //P1.0、P1.1定义为输出
    P0DIR |= 0x10;      //P0.4定义为输出
    LedOnOff(0);      //使所有LED灯默认为熄灭状态
}

/****************************************************************************
* 程序入口函数
****************************************************************************/
void main(void)
{
    uchar i;
    
    InitLed();               //设置LED灯相关IO口
    
    while(1)                 //死循环
    {  
        LED1 = !LED1;         //流水灯,初始化时LED为熄灭执行后则点亮
        DelayMs(200);         
        LED2 = !LED2;         
        DelayMs(200);            
        LED3 = !LED3;        
        DelayMs(200);         
        
        for (i=0; i<2; i++)   //所有灯闪烁2次
        {
           LedOnOff(0);    //关闭所有LED灯
           DelayMs(200);
           LedOnOff(1);    //打开所有LED灯
           DelayMs(200);
           
        }
        LedOnOff(0);    //使所有LED灯熄灭状态
        DelayMs(200);
        LedOnOff(1);       
        DelayMs(500);
        LedOnOff(0);    //使所有LED灯熄灭状态
        DelayMs(200);
    }
}

 2.2 按键控制 LED 跑马灯

实验目的
1) 通过实验掌握 CC2540 芯片 GPIO 的配置方法
2) 掌握 Led 驱动电路及开关 Led 的原理
3) 操作 IO 口控制 4 LED 灯的全亮和全灭、闪烁、流水灯
原理图同上
/****************************************************************************
* 文 件 名: main.c
* 作    者:
* 网    站: 
* 修    订: 
* 版    本: 1.0
* 描    述: 按下按键S1控制LED1.LED2.LED3实现跑马灯效果
****************************************************************************/
#include <ioCC2540.h>

#define uchar unsigned char 
#define uint unsigned int 

#define LED1 P1_0        // 定义P1.0口为LED1控制端
#define LED2 P1_1        // 定义P1.1口为LED2控制端
#define LED3 P0_4        // 定义P0.4口为LED3控制端
#define KEY1 P0_1        // 定义P0.1口为S1控制端
#define ON      1
#define OFF     0

/****************************************************************************
* 名    称: DelayMS()
* 功    能: 以毫秒为单位延时,系统时钟不配置时默认为16M(用示波器测量相当精确)
* 入口参数: msec 延时参数,值越大,延时越久
* 出口参数: 无
****************************************************************************/
void DelayMS(uint len)
{ 
    while(len--)
        for (int i=0; i<535; i++);
}

/****************************************************************************
* 名    称: LedOnOrOff()
* 功    能: 点亮或熄灭所有LED灯    
* 入口参数: mode为1时LED灯亮  mode为0时LED灯灭
* 出口参数: 无
****************************************************************************/
void LedOnOrOff(uchar mode)
{
    LED1 = mode;
    LED2 = mode;
    LED3 = mode; 
}

/****************************************************************************
* 名    称: InitLed()
* 功    能: 设置LED相应的IO口
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitLed(void)
{
    P1DIR |= 0x03;  // P1.0、P1.1定义为输出
    P0DIR |= 0x10;  // P0.4定义为输出
    LedOnOrOff(0);  // 使所有LED灯默认为熄灭状态  
}

/****************************************************************************
* 名    称: InitKey()
* 功    能: 设置按键相应的IO口
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitKey(void)
{
    P0SEL &= ~0x02;     //设置P0.1为普通IO口  
    P0DIR &= ~0x02;     //按键接在P0.1口上,设P0.1为输入模式 
    P0INP &= ~0x02;     //打开P0.1上拉电阻
}

/****************************************************************************
* 名    称: KeyScan()
* 功    能: 读取按键状态
* 入口参数: 无
* 出口参数: 0为抬起   1为按键按下
****************************************************************************/
uchar KeyScan(void)
{
    if (KEY1 == 0)
    {
        DelayMS(10);      //延时10MS去抖
        if (KEY1 == 0)
        {
            while(!KEY1); //松手检测
            return 1;     //有按键按下
        }
    }
    return 0;             //无按键按下
}

/****************************************************************************
* 程序入口函数
****************************************************************************/
void main(void)
{
    InitLed();		      //设置LED灯相应的IO口
    InitKey();            //设置按键S1相应的IO口
    
    while(1)
    {
        DelayMS(2);
        if (KeyScan())    //扫描按键当前状态,按下按钮 松开 后执行
        {
            LED1 = ON;    //点亮LED1      
            DelayMS(200); 
            LED1 = OFF;   //熄灭LED1 
            LED2 = ON;                
            DelayMS(200); 
            LED2 = OFF;            
            LED3 = ON;           
            DelayMS(200); 
            LED3 = OFF; 
        }
    }
}

2.3 外部中断

实验目的
1) 通过实验掌握 CC2540 芯片 GPIO 的配置方法
2) 掌握 Led 驱动电路及开关 Led 的原理
3) 通过按键 S1 产生外部中断改变 LED1 状态

原理同上

 

/****************************************************************************
* 文 件 名: main.c
* 描    述: 通过按键S1产生外部中断改变LED1状态
****************************************************************************/
#include <ioCC2541.h>

#define uchar unsigned char 
#define uint unsigned int

#define LED1 P1_0       // P1.0口控制LED1
#define KEY1 P0_1       // P0.1口控制S1

/****************************************************************************
* 名    称: DelayMS()
* 功    能: 以毫秒为单位延时,系统时钟不配置时默认为16M(用示波器测量相当精确)
* 入口参数: msec 延时参数,值越大,延时越久
* 出口参数: 无
****************************************************************************/
void DelayMS(uint len)
{ 
    while(len--)
        for (int i=0; i<535; i++);
}


/****************************************************************************
* 名    称: InitLed()
* 功    能: 设置LED灯相应的IO口
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitLed(void)
{
    P1DIR |= 0x01;   //P1.0定义为输出口
    LED1 = 0;        //LED1灯灭 
}

/****************************************************************************
* 名    称: InitKey()
* 功    能: 设置KEY相应的IO口,采用中断方式 
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitKey()
{
    P0IEN |= 0x02;    // P0.1 设置为中断方式 1:中断使能
    PICTL |= 0x02;    //下降沿触发   
    IEN1 |= 0x20;    //允许P0口中断; 
    P0IFG = 0x00;    //初始化中断标志位
    EA = 1;          //打开总中断
}

/****************************************************************************
* 名    称: P0_ISR(void) 中断处理函数 
* 描    述: #pragma vector = 中断向量,紧接着是中断处理程序
****************************************************************************/
#pragma vector = P0INT_VECTOR    
__interrupt void P0_ISR(void) 
{ 
    DelayMS(10);     //延时去抖
    LED1 = ~LED1;    //改变LED1状态
    P0IFG = 0;       //清中断标志 
    P0IF = 0;        //清中断标志 
} 

/****************************************************************************
* 程序入口函数
****************************************************************************/
void main(void)
{
    InitLed();   //设置LED灯相应的IO口
    InitKey();   //设置S1相应的IO口
    while(1)
    {
    }
}

2.4 定时器 T1-查询方式

1) 通过实验掌握 CC2540 芯片
GPIO 的配置方法
2) 掌握 Led 驱动电路及开关 Led 的原理
3) 通过按键 S1 产生外部中断改变 LED1 状态

定时器T1的时钟频率为32MHz / 128 = 250kHz。

在这个配置下,当T1计数器溢出时,中断标志位IRCON会被置位。通过查询IRCON的值是否大于0,代码检测是否发生了定时器T1的中断。

在每次中断发生时,count会自增,并且当count累积到一定值时,LED1会翻转状态,实现LED的周期性闪烁。在这段代码中,count达到1时LED状态翻转,因此要实现约1秒的周期性闪烁,需要count累积到1。

 

/****************************************************************************
* 文 件 名: main.c
* 描    述: 定时器T1通过查询方式控制LED1周期性闪烁
****************************************************************************/
#include <ioCC2541.h>

#define uchar unsigned char 
#define uint unsigned int

#define LED1 P1_0       // P1.0口控制LED1

/****************************************************************************
* 名    称: InitLed()
* 功    能: 设置LED灯相应的IO口
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitLed(void)
{
    P1DIR |= 0x01;      //P1.0定义为输出
    LED1 = 0;           //使LED1灯下电默认为熄灭     
}

/****************************************************************************
* 名    称: InitT1()
* 功    能: 定时器初始化,系统不配置工作时钟时默认是2分频,即16MHz
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitT1()
{
    T1CTL = 0x0d;       //128分频,自动重装 0x0000-0xFFFF 
    T1STAT= 0x21;       //通道0,中断有效   
}

/****************************************************************************
* 程序入口函数
****************************************************************************/
void main(void)
{
    uchar count=0;
    
    InitLed();		     //调用初始化函数
    InitT1();
    
    while(1)
    {
        if(IRCON > 0)
        { 
            IRCON=0;
            if(count++ >= 1) //约1s周期性闪烁,示波器测大约为1025MS
            {
              count=0;
              LED1 = !LED1;  //LED1闪烁        
            }
        } 
    }
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/541364.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ARMv8-A架构下的外部debug模型之外部调试事件(external debug events)概述

外部调试器与处理器之间的握手与external debug events 一&#xff0c;External Debug的使能二&#xff0c;外部调试器和CPU之间的握手三&#xff0c;外部调试事件 External debug events1. External debug request event2. Halt instruction debug event3. Halting step debug…

是的,本科毕业八年,我考研了

今天&#xff0c;是一篇纯分享文。 是的&#xff0c;本科毕业八年&#xff0c;我考研了。 停更10个月&#xff0c;历时296天&#xff0c;我考研上岸了。 小伙伴们&#xff0c;好久不见。 一 发今年第一篇文章的时候刚处理完后续事宜&#xff0c;就简单说了句&#xff0c;后台…

Vue3 ts环境下的PropType

简介 在Typscript中&#xff0c;我们可以使用PropType进行类型的推断与验证。在日常的开发中我们常常会遇到下面这样的场景&#xff1a; 我们通过request请求从服务端获取了一条数据&#xff0c;数据是个Array的格式&#xff0c;Array中的每个元素又是一个对象&#xff0c;像下…

【神经网络与深度学习】循环神经网络基础

tokenization tokenization&#xff1a;分词 每一个词语都是token 分词方法&#xff1a;转为单个词、转为多个词语 N-gram表示法 准备词语特征的方法 &#xff08;把连续的N个词作为特征&#xff09; 如 ”我爱你“——>[我&#xff0c;爱&#xff0c;你] 2-gram——[[我…

java项目之校园兼职系统(ssm框架+mysql数据库+文档)

项目简介 校园兼职系统的主要使用者分为&#xff1a;管理员&#xff1a;首页、个人中心、专业管理、商家管理、热门兼职管理、学生管理、兼职接单管理、学生咨询管理、兼职任务管理、完成评价管理、管理员管理、系统管理等模块信息的查看及相应操作&#xff1b;学生&#xff1…

在vue中配置样式 max-width:100px时,发现和width:100px一样没有对应的递增到最大宽度的效果?怎么回事?怎么解决?

原因&#xff1a; 可能时vue的样式大部分和display相关&#xff0c;有很多的联系&#xff0c;导致不生效 解决&#xff1a; 对设置max-width样式的元素设置display:inline-block;属性&#xff0c;即可生效&#xff0c;实现随着子元素的扩展而扩展并增加固定到最大的宽度

使用 ASE 拼接分子

在部分应用场景下&#xff0c;我们需要对两个分子片段进行拼接&#xff0c;例如锂电电解液数据库 LiBE 然而&#xff0c;当前并没有合适的拼接方法。下面是一些已有方法的调研结果&#xff1a; 在 LiBE 论文的附录里&#xff0c;作者使用 pymatgen 进行分子拼接。 其思路是&…

分享2024高校专业建设思路及建设效果

广东泰迪智能科技股份有限公司成立于2013年&#xff0c;是一家专业从事大数据、人工智能等数据智能技术研发、咨询和培训的高科技企业&#xff0c;公司基于十余年的数据智能产业实践经验&#xff0c;构建“产、岗、课、赛、证、文”融通的特色应用型人才培养模式&#xff0c;助…

MQ:延迟队列

6.1场景&#xff1a; 1.定时发布文章 2.秒杀之后&#xff0c;给30分钟时间进行支付&#xff0c;如果30分钟后&#xff0c;没有支付&#xff0c;订单取消。 3.预约餐厅&#xff0c;提前半个小时发短信通知用户。 A -> 13:00 17:00 16:30 延迟时间&#xff1a; 7*30 * 60 *…

微信营销快捷回复和微信多开-微信UI自动化(.Net)

整理 | 小耕家的喵大仙 出品 | CSDN&#xff08;ID&#xff1a;lichao19897314&#xff09; Q Q | 978124155 关于项目背景和本软件的介绍 因为本人前期基于微信自动化这块编写了一些文章&#xff0c;所以最近想着将文章内容点合并后开发一款真正能帮助别人的软件&#xff0…

AI赋能档案开放审核:实战

关注我们 - 数字罗塞塔计划 - 为进一步推进档案开放审核工作提质增效&#xff0c;结合近几年的业务探索、研究及项目实践&#xff0c;形成了一套较为成熟、高效的AI辅助档案开放审核解决方案&#xff0c;即以“AI人工”的人机协同模式引领档案开放审机制创新&#xff0c;在档…

07.QT信号和槽-2

一、自定义信号和槽 在Qt中&#xff0c;允许⾃定义信号的发送⽅以及接收⽅&#xff0c;即可以⾃定义信号函数和槽函数。但是对于⾃定义的信号函数和槽函数有⼀定的书写规范。 1.基本语法 1.1 自定义信号 &#xff08;1&#xff09;⾃定义信号函数必须写到"signals"…

Windows不常见问题集

● 解决CACLS 禁止修改计算机名 管理员权限运行cmd&#xff1a;cacls %SystemRoot%\System32\netid.dll /grant administrators:f ● Excel 2010 AltTab組合鍵設置 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer&#xff0c;在該路徑建32字元DWO…

YOLOv8使用设备摄像头实时监测

代码如下&#xff1a; from ultralytics import YOLO import cv2 from cv2 import getTickCount, getTickFrequency yoloYOLO(./yolov8n.pt)#摄像头实时检测cap cv2.VideoCapture(0) while cap.isOpened():loop_start getTickCount() #记录循环开始的时间&#xff0c;用于计…

Cesium.js--》探秘Cesium背后的3D模型魔力—加载纽约模型

今天简单实现一个Cesium.js的小Demo&#xff0c;加强自己对Cesium知识的掌握与学习&#xff0c;先简单对这个开源库进行一个简单的介绍吧&#xff01; Cesium 是一个开源的地理空间可视化引擎&#xff0c;用于创建基于 Web 的三维地球应用程序。它允许开发人员在网页上呈现高度…

暴雨孙辉:做好服务器,但更要辟出技术落地之道

稳扎稳打一直是暴雨的风格&#xff0c;这在被访者孙辉的身上尽显。作为暴雨&#xff08;武汉暴雨信息发展有限公司&#xff09;中国区销售及市场副总裁&#xff0c;在谈及公司的技术发展与市场推广走势之时&#xff0c;孙辉沉稳、敏锐且逻辑清晰。 因在服务器领域起步很早&…

C#创建圆形窗体的方法:创建特殊窗体

目录 一、涉及到的知识点 1.OnPaint方法 2.将窗体设置为透明 &#xff08;1&#xff09;Form1的BackColor SystemColors.Control &#xff08;2&#xff09; Form1的背景色是某种颜色&#xff0c;比如BackColor SystemColors.White &#xff08;3&#xff09;加载资源…

TensorRT中的INT 8 优化

INT8 中的稀疏性&#xff1a;加速的训练工作流程和NVIDIA TensorRT 最佳实践 文章目录 INT8 中的稀疏性&#xff1a;加速的训练工作流程和NVIDIA TensorRT 最佳实践结构稀疏量化在 TensorRT 中部署稀疏量化模型的工作流程案例研究&#xff1a;ResNet-34要求第 1 步&#xff1a;…

简单工厂模式大解析:让代码创造更高效、更智能!

个人主页: danci_ &#x1f525;系列专栏&#xff1a;《设计模式》《MYSQL应用》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 &#x1f680; 转载自热榜文章&#xff1a;探索设计模式的魅力&#xff1a;简单工厂模式 简单工厂模式&#x…

传输层协议——UDP/TCP协议

目录 端口号 端口号范围 pidof UDP协议 UDP协议格式 UDP特点 UDP缓冲区 UDP的注意事项 基于UDP的应用层协议 TCP协议 TCP协议格式 序号与确认序号 窗口大小 6个标记位 紧急指针 确认应答机制 连接管理机制 三次握手 四次挥手 超时重传机制 流量控制 滑动…