本帖最后由 芯圣电子官方QQ 于 2023-7-20 09:48 编辑
因为懒,许久未来更新,不过学习还是没有停止。今天我们介绍用芯圣SQ013模拟串口。
串口通讯概述
我们常用的串口通讯协议 为1个起始位+8个数据位+1位结束位。起始位为低电平,结束位高电平。一般我们常用的串口通讯协议是三线制 TXD RXD GND 。我们设置波特率9600bps ,即1秒钟发送9600个码元 ,传输一位时间为1s/9600 = 104us.
单片机概述
我使用的是芯圣SQ013单片机 ,是一颗8位精简指令集单片机,支持C语言,汇编编程,但由于没有硬件UART,所以我们采用IO口进行模拟。
程序代码
#include "holychip_define.h"
#define TXD PORTB1
//#define RXD PORTB4
unsigned int Count=0;
unsigned int Time_1s;
unsigned int i ;
void Delay(unsigned char i)
{
while(i--);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned int t,无返回值
unsigned int 是定义无符号字符变量,其值的范围是
0~1024 精确延时请使用汇编
-------------------------------------------------*/
void DelayMS(unsigned int t)
{
unsigned char count = 195;
while(t--)
{
while(count--);
}
}
void Init(void)
{
PORTB = 0B00110010; //PB1上电高电平
TRISB = 0X00;
PHCON = 0XFF;
PDCON = 0xff;
ODCON = 0X00;
}
void Time0_Init(void)
{
OPTION = 0x16;
T0 = 178; //定时50ms
T0IE = 1;
T0IF = 0;
GIE = 1;
}
void WriteByte(unsigned char Byte)
{
unsigned char i = 8;
TXD = 0; //发送起始位
Delay(25);
//发送8位数据位
while(i--)
{
TXD = (Byte&0x01); //先传最低位
Byte = Byte>>1;
Delay(25);
}
//发送校验位
TXD = 1;
Delay(25);
}
void UART_SendString(unsigned char *buf)
{
while(*buf!='\0')
{
WriteByte(*buf);
buf++;
}
}
void main(void)
{
unsigned int i ;
Init();
Time0_Init();
while(1)
{
if(Time_1s==1)
{
Time_1s=0;
for(i=0;i<3;i++)
{
UART_SendString("Hello,World!");
DelayMS(1);
}
asm(sleep);asm(nop);asm(nop);asm(nop);
}
}
}
//*****************************中断服务程序*****************************
//进中断时间=1/(时钟源/xT/分频比)*(256-T0初值)
void Intr(void) __interrupt 0
{
if(T0IF)
{
T0IF =0;
T0 = 178;
Count++;
if(Count>=200)
{
Count=0;
Time_1s=1; //1s时间到
}
}
}
实现现象首先我们需要一个USB转串口模块,CH340,CP2102都行。
本例程序我们只验证串口发送。
程序执行现象为上电1s后 上位机接收3句Hello,World! 睡眠。
此处为了展示1s发送一次,我将睡眠语句注释了。
延时法最初我设置的值为27,用逻辑分析仪发现时间为111.1us
此处设置值为26 ,时间为107.4us
此处设置值为25,时间为104.3us
结束语 以上数据都为实际芯片测试,仿真器测试时发现设置值为25时,时间为102us,但图片没有保存下来。有机会再测试一下。
|