使用瑞萨单片机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单片机的教程比较少,于是就写了这样一个教程。内容很简单。
成功控制一个管脚,就等于迈出了一大步。加油!
谢谢阅读。