1,串口设备
1.1, UART 协议
发送 0xFF 0X00 0X04 0X08数据1.2,uart 串口波形
波形实现方法:
- CPU 已实现,仅需设置寄存器
- GPIO管脚模拟波形
1.3,例
//发送0x04 数据
void uart_tx(void)
{
GPA1CON = GPA1CON&~(0xf<<4)|(0x01<<4); //设置GPA1_1 GPIO输出模式
//开始位
GPA1DAT = GPA1DAT&~0x02 ; //设置GPA1_1 低电平
delay10ms();
//传数据 0x04 0000 0100
delay10ms(); //0
delay10ms(); //0
GPA1DAT = GPA1DAT|0x02 ; //1
delay10ms();
GPA1DAT = GPA1DAT&~0x02 ; //设置GPA1_1 低电平
delay10ms(); //0
delay10ms(); //0
delay10ms(); //0
delay10ms(); //0
//停止位
GPA1DAT = GPA1DAT|0x02 ; //1
delay10ms();
}
void uart_rx(void)
{
unsigned char output=0;
GPA1CON = GPA1CON&~(0xf); //设置GPA1_1 GPIO输入模式
//检测开始位
while(1)
{
if(GPA1DAT&0x01==0)
break;
delay10ms();
}
//接收数据
if(GPA1DAT&0x01==0) //bit0
output=0;
else
output=1;
if(GPA1DAT&0x01==0) //bit1
output=output&~(0x01<<1);
else
output=output|(0x01<<1);
if(GPA1DAT&0x01==0) //bit2
output=output&~(0x01<<2);
else
output=output|(0x01<<2);
....
}
2,I2C 设备
双线 i2c (半双工 同步) 支持一主机对多从机 可主从切换 支持一主机对多从机 可主从切换2.1,I2C 协议
往ID为0x3c的I2C 设备写数据 0x2e 0x2e ... 1.由主机发起,在SCL为高电平时,SDA由高到低切 变,形成开始信号; 2.接着是7位地址和一位读写标志,这里7位地址为0111100,即0x3c,正是我们代码中设置的地址ID;最后一位为0表示写操作; 3.接着在下一个时钟,主机以高电平状态释放SDA,这时从机响应,将SDA拉低了; 4.接着是两个8位数据00101110与响应,即0x2E, 5.还有其它数据和最后的停止位,图中被截掉了2.1,I2C 波形
PWM(Pulse Width Modulation) :3,PWM 蜂鸣器
3.1,PWM 蜂鸣器
3.2,配置pwm
3.2.1,设置GPI/O为PWM模式
GPD0CON = (GPD0CON & ~(0X00F << 0)) | (0x02 << 0); //1.设置GPD0_0为PWM模式
3.2.2,设置pwm频率
3.2.2.1,第一级分频TCFG0
TCFG0 = (TCFG0 & ~(0XFF << 0)) | (100 << 0); //第一级分频100
3.2.2.2,第二级分频
TCFG1 = (TCFG1 & ~(0X0F << 0)) | (0x03 << 0); //第二级分频8
3.2.2.3,第三级分频
TCNTB0 = 200; //第三级分频200
3.2.3,设置占空比
TCMPB0 = 100; //3.设置占空比为50%
3.2.4,启动定时器
//4.启动定时器
//TCON = (TCON & ~(0x0f << 0)) | (0x0b << 0); //定时器启动设置(定时器开启,波形不翻转,更新定时器初值,自动重装载)
TCON = (TCON & ~(0x0f << 0)) | (0x0a << 0); //先配置,先不启动
TCON = (TCON & ~(0x0f << 0)) | (0x09 << 0); //配置好了再启动
3.4,例
#define GPD0CON (*(volatile unsigned int *)0x114000a0) //
#define TCFG0 (*(volatile unsigned int *)0x139d0000) //pwm第一级分频,设置Prescaler
#define TCFG1 (*(volatile unsigned int *)0x139d0004) //pwm第二级分频
#define TCNTB0 (*(volatile unsigned int *)0x139d000c) //pwm第三级分频
#define TCMPB0 (*(volatile unsigned int *)0x139d0010) //设置占空比
#define TCON (*(volatile unsigned int *)0x139d0008) //定时器启动设置(定时器开启,波形翻转,更新定时器初值,自动重装载)
#define ON 1
#define OFF 2
void pwm_init()
{
//*********外部 配置GPIO***********************************
//1.设置GPD0_0为PWM模式
GPD0CON = (GPD0CON & ~(0X00F << 0)) | (0x02 << 0);
//*********内部 配置PWN功能块***************************************
//2.设置PWM周期为625Hz
TCFG0 = (TCFG0 & ~(0XFF << 0)) | (100 << 0); //第一级分频100
TCFG1 = (TCFG1 & ~(0X0F << 0)) | (0x03 << 0); //第二级分频8
TCNTB0 = 200; //第三级分频200
//3.设置占空比为50%
TCMPB0 = 100;
//4.启动定时器
//TCON = (TCON & ~(0x0f << 0)) | (0x0b << 0); //定时器启动设置(定时器开启,波形不翻转,更新定时器初值,自动重装载)
TCON = (TCON & ~(0x0f << 0)) | (0x0a << 0); //先配置,先不启动
TCON = (TCON & ~(0x0f << 0)) | (0x09 << 0); //配置好了再启动
}
void pwm_beep(int on_off)
{
if(on_off == ON)
{
TCON = (TCON & ~(0x01 << 0)) | (0x01 << 0); //启动定时器(beep)
}
else if(on_off == OFF)
{
TCON = (TCON & ~(0x01 << 0)) | (0x00 << 0); //关闭定时器(beep)
}
}