[通用8051核FLASH系列]

HC89S001P IO

[复制链接]
543|9
手机看帖
扫描二维码
随时随地手机跟帖
gaoke231|  楼主 | 2020-2-25 19:40 | 显示全部楼层 |阅读模式
IO, HC, TE, PWM, RAM
本帖最后由 芯圣电子官方QQ 于 2023-7-24 14:42 编辑

HC89S001P 是一颗采用高速低功耗 CMOS 工艺设计开发的增强型 8 位单片机,内部有 12K Bytes
FLASH 程序存储器, 256 Bytes IRAM 和 256 Bytes XRAM, 6 个双向 I/O 口, 1 个外设功能引脚全映射
模块 PTM, 5 个 16 位定时器/计数器, 3 组 12 位带死区控制互补 PWM, 1 个 8 位 PWM, 2 个 UART,
1 个 SPI, 6 个外部中断, 6+2 路 12 位 ADC,四种系统工作模式(正常、 低频、掉电和空闲)和 16 个中
断源  

使用特权

评论回复
gaoke231|  楼主 | 2020-2-25 19:41 | 显示全部楼层
系统框图
527655e5507e5df979.png

使用特权

评论回复
gaoke231|  楼主 | 2020-2-25 19:41 | 显示全部楼层
SOP8 引脚配置图
43775e55080111826.png

使用特权

评论回复
gaoke231|  楼主 | 2020-2-25 19:58 | 显示全部楼层
HC89S001P 所有 I/O 口均可由软件配置成多种工作类型之一, 具体为: 输入、带上拉输入、带下拉
输入、模拟输入、强推挽输出、开漏输出和开漏带上拉输出,并且输入可以配置为施密特输入。
HC89S001P 上电复位后,所有 IO 口都默认为模拟输入

使用特权

评论回复
gaoke231|  楼主 | 2020-2-25 19:58 | 显示全部楼层
HC89S001P在输入模式时(不包含模拟输入) ,任何读操作,数据来源都来自引脚电平。 而在输
出模式时,通过指令来区分读数据来源,采用“读-修改-写”指令时,为读寄存器值,其它指令为读引
脚电平

使用特权

评论回复
gaoke231|  楼主 | 2020-2-25 19:58 | 显示全部楼层
HC89S001P首先将需要修改的寄存器的内容读回ALU,对相应位进行修改,然后再整个写回原来
的寄存器地址,完成该功能的指令就叫做“读-修改-写”指令。
“读-修改-写”指令是单片机内部自己执行的,它发生在写IO口的时候,当写IO口的时候它先把
IO的当前状态读回来,根据要写的数据修改读回来的数据,再写到IO口;读引脚是直接读引脚的当前
状态,当前引脚是高电平,读回来的就是高电平,低电平时读回来的就是低电平。

使用特权

评论回复
gaoke231|  楼主 | 2020-2-25 19:59 | 显示全部楼层
I/O 功能框图
125935e550c1c90561.png

使用特权

评论回复
gaoke231|  楼主 | 2020-2-25 20:12 | 显示全部楼层
设置各个IO口的工作状态
void main()
{
/************************************系统初始化****************************************/
        WDTCCR = 0x00;                                                //关闭看门狗
                                                //本例程为方便测试关闭看门狗,实际使用中,建议客户打开看门狗,详见WDT复位例程
        CLKSWR = 0x51;                                                //选择内部高频RC为系统时钟,内部高频RC 2分频,Fosc=16MHz
        CLKDIV = 0x01;                                                //Fosc 1分频得到Fcpu,Fcpu=16MHz
/***********************************设置IO口模式***************************************/
        P0M1 = P0M1&0xF0|0x00;                                //P02设置为输入(非施密特)
        P0M1 = P0M1&0xF0|0x01;                                //P02设置为带下拉输入(非施密特)       
        P0M1 = P0M1&0xF0|0x03;                                //P02设置为带上拉输入(非施密特)       
        P0M1 = P0M1&0xF0|0x04;                                //P02设置为带模拟输入
        P0M1 = P0M1&0xF0|0x05;                                //P02设置为带下拉输入(施密特)
        P0M1 = P0M1&0xF0|0x06;                                //P02设置为带上拉输入(施密特)
        P0M1 = P0M1&0xF0|0x08;                                //P02设置为推挽输出
        P0M1 = P0M1&0xF0|0x09;                                //P02设置为开漏输出
        P0M1 = P0M1&0xF0|0x0A;                                //P02设置为带上拉开漏输出       
       
        while(1);
}




使用特权

评论回复
gaoke231|  楼主 | 2020-2-25 20:13 | 显示全部楼层
对P00端口的消抖时间进行设置,251.9375us<消抖时间<255.9375us
void main()
{
/************************************系统初始化****************************************/
        WDTCCR = 0x00;                                                //关闭看门狗
                                        //本例程为方便测试关闭看门狗,实际使用中,建议客户打开看门狗,详见WDT复位例程
        CLKSWR = 0x51;                                                //选择内部高频RC为系统时钟,内部高频RC 2分频,Fosc=16MHz
        CLKDIV = 0x01;                                                //Fosc 1分频得到Fcpu,Fcpu=16MHz
/**********************************端口消抖初始化**************************************/
  P0M0 = P0M0&0xF0|0x01;    //P00设置为上拉输入
        P00DBC = 0xFF;                                                //设置消抖时间
        //消抖时间计算
        //分频系数*Tosc*P0xDBCT[5:0]-Tosc<消抖时间<分频系数*Tosc*(P0xDBCT[5:0]+1)-Tosc
        //                  64*0.0625us*63-0.0625us<消抖时间<64*0.0625us*(63+1)-0.0625us
        //                                           251.9375us<消抖时间<255.9375us

        while(1);
}


使用特权

评论回复
gaoke231|  楼主 | 2020-2-25 20:14 | 显示全部楼层
将P02端口的上拉电阻设置为100K
void main()
{
/************************************系统初始化****************************************/
        WDTCCR = 0x00;                                                //关闭看门狗
                                        //本例程为方便测试关闭看门狗,实际使用中,建议客户打开看门狗,详见WDT复位例程
        CLKSWR = 0x51;                                                //选择内部高频RC为系统时钟,内部高频RC 2分频,Fosc=16MHz
        CLKDIV = 0x01;                                                //Fosc 1分频得到Fcpu,Fcpu=16MHz
/***********************************设置上拉电阻***************************************/
        P0M1 = P0M1&0xF0|0x02;                            //将P02端口设置为带上拉输入
        P0LPU |= 0x10;                                                //将P02端口上拉电阻设置为100K
        while(1);
}


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

54

主题

1310

帖子

5

粉丝