打印
[DemoCode下载]

【赛元95F】+我也测试串口

[复制链接]
877|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
这里借用我之前的测试代码,用定时器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;
}

使用特权

评论回复

相关帖子

沙发
gaoyang9992006|  楼主 | 2020-4-7 21:27 | 只看该作者
然后仿照putchar实现getchar功能。这个也是非常有用的,可以用于给单片机下达指令使用。
#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);
}

char getchar(void)
{
        while(!RI);
        RI=0;
        return(SBUF);
}

void main(void)
{
int aa=0;
  Timer0_Init();
        Uart_Init(32,9600);
        while(1)
        {
        //        SBUF = 0x55;
        //        while(!UartSendFlag);
        //        UartSendFlag=0;
               
                /*因为调用的putchar()会先判断是否发送完成,所以这里先置位TI,确保能进入发送环节*/
                TI=1;

                printf("Hello World !\n");
                aa=getchar();
                printf("AA=%d \n",aa);               
                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;
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:西安公路研究院南京院
简介:主要工作从事监控网络与通信网络设计,以及从事基于嵌入式的通信与控制设备研发。擅长单片机嵌入式系统物联网设备开发,音频功放电路开发。

1964

主题

15940

帖子

208

粉丝