这里借用我之前的测试代码,用定时器0做延时0.5秒,用定时器1作为串口0时钟脉搏。
串口为P2.0和P2.1,分别为RX0与TX0
使用好串口就可以 通过串口与WIFI模块,或者Lora模块,或者4G模块进行通信,实现数据的远距离传输,因此串口的使用是非常重要的。
由于我们习惯用printf函数,作为串口的发送函数,因此要完善
char putchar(char c)
{
while(!TI);
TI=0;
return(SBUF = c);
}
完整代码如下所示
#include<SC95F861X.H>
#include<stdio.h>
void delay(void);
void Timer0_Init(void);
void Uart_Init(unsigned int Freq,unsigned long int baud);
bit UartSendFlag = 0; //发送中断标志位
bit UartReceiveFlag = 0; //接收中断标志位
char putchar(char c)
{
while(!TI);
TI=0;
return(SBUF = c);
}
void main(void)
{
Timer0_Init();
Uart_Init(32,9600);
while(1)
{
// SBUF = 0x55;
// while(!UartSendFlag);
// UartSendFlag=0;
/*因为调用的putchar()会先判断是否发送完成,所以这里先置位TI,确保能进入发送环节*/
TI=1;
printf("Hello World !\n");
delay();
}
}
/*****************************************************
*函数名称:void Uart_Init(uint Freq,unsigned long int baud)
*函数功能:Uart中断初始化
*入口参数:Freq-主频,baud-波特率
*出口参数:void
*****************************************************/
void Uart_Init(unsigned int Freq,unsigned long int baud) //选择Timer1作为波特率信号发生器
{
P2CON &= 0xFC; //TX/RX设置为输入带上拉
P2PH |= 0x03;
SCON |= 0X50; //设置通信方式为模式一,允许接收
TMCON |= 0X02; //定时器TI频率源自fsys即32Mhz
TH1 = (Freq*1000000/baud)>>8; //波特率为T1的溢出时间;
TL1 = Freq*1000000/baud;
TR1 = 0;
ET1 = 0;
EUART = 1; //开启Uart中断
EA = 1;
}
void delay(void)
{
//设置为320,延时0.5S,设置到80即延时0.125S,8个IO口跑马灯则每个IO的闪烁频率刚好是1Hz
int i=320;
TR0=1;
while(i--)
{
TL0 = (65536 - 50000)%256; //时钟为Fsys,则溢出时间=50000*(1/Fsys);
TH0 = (65536 - 50000)/256;
while(TF0==0);
TF0=0;
}
TR0=0;
}
void Timer0_Init(void)
{
/*
TCON,定时器控制寄存器, |TF1|TR1|TF0|TR0|---|IE1|-|IE0|-|
TMOD,定时器工作模式寄存器,|- |C/T1|M11|M01|---|C/T0|M10|M00|
模式0:13位定时器计数器模式
模式1:16位定时器计数器模式
模式2:8位自动重载模式
模式3:两个8位定时器计数器模式
*/
//设置定时器0工作模式1
TMOD |= 0x01;
//设置定时器0时钟源不分频,32MHz;默认是12分频
TMCON |= 0x01;
}
|