九齐单片机 NY8A051D点亮LED

写在前面

这段时间接触九齐的051D,记录一下怎么快速入门这款单片机

定时器

跟普通的8051单片机使用方法类似,直接上代码:

#include <ny8.h>
#include "ny8_constant.h"
#define UPDATE_REG(x)	__asm__("MOVR _" #x ",F")

#define  u16  unsigned int
#define  u8   unsigned char

void delay_ms(int);


#define  key    PORTBbits.PB0

#define  led1    PORTBbits.PB1

#define  led2    PORTBbits.PB3


unsigned char key_state=0;

void delay_us(int count)  //@16M  2T   2.5us
{
	for(;count>0;count--);

}


void delay_ms(int count) //@8m  4T  1ms
{
	int i;for(;count>0;count--){for(i=0;i<=100;i++);}
}





void sys_init(void)
{
	PCON &= ~(1<<3);  //关闭LVR  需要在IC_CONFIG里面设置寄存器配置
}



void io_init(void)
{

	IOSTB|=(1<<0);	    //PB0输入
	IOSTB|=(1<<2);	    //PB2输入
	
	IOSTB&=~(1<<1);     //PB1输出
	
	IOSTB&=~(1<<3);     //PB3输出 
	
	BPHCON=0;   		//开启B0口上拉电阻
	INTE|=(1<<1);   	//开启B口电平中断
	
	PORTB=0XFF;
	led1=1; led2=1; key=1;
}


//==T0时间计算================================================
//    时间        T        2T模式    2分频   计数空间
//              1/16M   *    2     *   2     255-TMR0 +2
//    50us  =   1/16M   *    2     *   2       200   
//1M 1.76MS
void time0_init(void)
{
	T0MD  &=~((1<<5)|(1<<3)|(1<<2)|(1<<1)|(1<<0));  //FINST预分频给T0且为2分频
	TMR0 = 50;
	INTE  |= (1<<0);                                //开启T0中断
	PCON1 |= (1<<0);         				        //开启T0
}


void time1_init(void);




void main(void)
{
	io_init();
	delay_ms(80);
	INTF = 0;         //清除所有中断标志
	DISI();     	  //关闭总中断
	ENI();	    	  //开启总中断
	
    while(1)
    {
    	if(key==1) 
    	{
			if(key_state == 1)
			{
				led1 = ~led1;
				led2 = ~led2;
				key_state = 0;
			}
    		SLEEP();
    	}
    }
}



//! interrupt service routine
void isr(void) __interrupt(0)
{
	if(INTFbits.INTIF)     //INT中断
	{	
		INTFbits.INTIF=0;
	}
	
	if(INTFbits.PBIF)     //PB中断
	{
		INTFbits.PBIF=0;//清除外中断标志
		if(key==0)   //按下标记
		{
			delay_ms(30);
			if(key==0)   //按下标记
			{
				key_state = 1;
			}
		}
	}
	
	if(INTFbits.T0IF)    //定时器0中断  //1M 1.76MS
	{ 	
		INTFbits.T0IF=0;
		TMR0 = 50;
	}
}

这段代码比较简单,只用到了PB电平变化中断,如果要用定时器中断只需要在主函数里添加响应的init函数就行了。关于溢出时间,这条公式不是非常准,我在九齐的官网实例代码里没有看到对应的公式,只能结合逻辑分析仪一点点手动调,而且由于没有自动重装功能,定时器有一定的误差,如果需要做时间计算,需要做时间补偿。
所有的MCU设置在这里:
在这里插入图片描述
在这里插入图片描述
比如我要产生一个50us的中断,首先选择MCU的内部震荡频率是8Mhz,然后选择4T模式,最后再在定时器设置的时候,把内部时钟分配给定时器,不然的话MCU会分配给看门狗计时,然后设置成2分频,这样MCU一次计时就是1us,定时50us就只需要计时50次。这个初值不一定准,结合示波器或者逻辑分析仪慢慢去调才能减小误差。

另外,051D,053D,062D中文手册需要的可以私信,看到了会回。
云盘:https://pan.baidu.com/s/1v_hHeEACYy8HLKO9hrA0wA
提取码:r7aq

### 关于单片机开发教程 #### 单片机概述 单片机系列涵盖了多种型号,如NY8A050D、NY8A051B以及NY8B062F等。这些设备因其高性价比和丰富的功能,在嵌入式系统设计领域得到了广泛应用[^1]。 #### 开发环境搭建 为了便于程序编写与调试工作,建议采用官方推荐的集成开发环境(IDE),该平台不仅支持上述提到的各种芯片型号,还提供了详尽的帮助文档和技术支持服务,有助于加速项目的进展并提高效率。 #### 编程技巧分享 当面对资源受限的情况时——比如内存紧张的问题,可以采取结构化编程的方式优化存储利用率;具体来说就是通过定义位字段来节省宝贵的RAM空间。下面是一个简单的例子展示了如何创建一个标志寄存器用于状态跟踪: ```c typedef struct { unsigned char System_Sleep : 1; unsigned char PABIF_Trigger : 1; unsigned char Key_Up_Trigger : 1; unsigned char Key_Trigger : 1; unsigned char System_Status_Change : 1; unsigned char System_Status_Charge : 1; unsigned char System_Locked_Rotate : 1; unsigned char System_Start : 1; } flag_t; ``` 此方法允许在同一字节内分配多个布尔型变量,从而有效减少整体占用量[^3]。 #### 功耗管理实践 针对便携式电子产品或电池供电场景下的应用需求,合理规划系统的能耗至关重要。对于基于MCU构建的产品而言,在不活跃期间让处理器进入休眠模式是一种常见的节能策略。实现这一目标通常涉及以下几个方面的工作: - 设置合适的振荡源频率切换机制; - 配置外部中断触发条件以便及时响应事件发生; - 利用特定I/O端口的状态改变作为唤醒信号源之一。 例如,在准备进入低功耗之前可执行如下代码片段调整时钟配置,并调用`SLEEP()`函数暂停CPU运行直至下一次有效的硬件请求到来为止: ```c OSCCR = C_FLOSC_Sel; // Switch to low-speed oscillator selection SLEEP(); // After waking up, switch back to high speed mode. OSCCR = C_FHOSC_Sel; ``` 以上措施能够显著降低待机电流消耗水平,延长续航时间的同时也提高了用户体验感[^4]。
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值