使用瑞萨单片机R8C/1B输出方波

使用瑞萨单片机R8C/1B输出方波

P10输出方波

使用P10输出方波。

1.MCU时钟配置。

使用内部高速8M晶振,代码如下

void clock(void)
{
	prcr=0x01;//关闭CM0、 CM1、 OCD、 HRA0、 HRA1 和 HRA2 寄存器的保护
	cm05=1;//停止主时钟
	cm02=0;//等待模式下不停止外围功能
	cm14=0;//开启内部低速振荡器
	ocd0=0;
	ocd1=0;//关闭震荡检测功能
	hra00=1;//开启内部高速震荡
	hra01=1;//选择内部高速震荡
	ocd2=1;//选择内部振荡器时钟
	cm16=0;
	cm17=0;//cm16、cm17:选择时钟分频,这里选择不分频
	cm06=0;//分频配置有效
	asm("NOP\nNOP\nNOP\nNOP");
	prcr=0;开启寄存器保护。
}

2.定时器X设置

因为要用到定时器X,所有要配置定时器X
代码如下

void timerx_init(void)
{
	txmr = 0x00;
	tcss = 0x00;			// f1
	prex = 9;
	tx = 9;				//1/(9+1)(9+1) * 8M=80kHz		
	txic = 0x04;//中断优先级配置,如不配置就禁用中断
	txs = 0;	
}

3.主程序

#include "sfr_r81b.h"
#define 	EI();		asm("FSET I");
#define 	DI();		asm("FCLR I");

typedef 	unsigned char	u8;
typedef 	unsigned int	u16;
typedef 	unsigned long	U32;
typedef 	char			S8;
typedef 	int				S16;
typedef 	long			S32;

void clock(void);
void delay_nop(void);
void timerx_init(void);

void main()
{ 
	DI();
	pd1_0=1;//配置P10为输出
	drr0=1;	
	tcout0=0;
	clock();
	timerx_init();
	txs=1;
	EI();
	while(1)
	{	
		
	}
}


void clock(void)
{
	prcr=0x01;
	cm05=1;
	cm02=0;
	cm14=0;
	ocd0=0;
	ocd1=0;
	hra00=1;
	hra01=1;
	ocd2=1;
	cm16=0;
	cm17=0;
	cm06=0;
	asm("NOP\nNOP\nNOP\nNOP");
	prcr=0;
}
void delay_nop(void)//8MHz,
{
	
	asm("NOP");	
	asm("NOP");	
	asm("NOP");	
	asm("NOP");
	asm("NOP");
	asm("NOP");	
	asm("NOP");	
	asm("NOP");	
	asm("NOP");
	asm("NOP");	
	
}
void timerx_init(void)
{
	txmr = 0x00;
	tcss = 0x00;			// f1
	prex = 9;
	tx = 9;				//1/(9+1)(9+1) * 8M=80kHz		
	txic = 0x04;
	txs = 0;	
}
// timer X			(software int 22)
//中断函数
#pragma interrupt	_timer_x(vect=22)
void _timer_x(void){	
	p1_0=~p1_0;	
}

4.波形

使用逻辑分析仪 得到的波形
有偏差的原因是因为单片机内部的时钟源是RC震荡电路,精度不高而且很容易受到干扰,如果使用外部晶振就可以解决这个问题。

看到R8c单片机的教程比较少,于是就写了这样一个教程。内容很简单。
成功控制一个管脚,就等于迈出了一大步。加油!
谢谢阅读。

猜你喜欢

转载自blog.csdn.net/weixin_44284357/article/details/89374639