蓝桥杯电子类串口部分代码

main.c

#include "STC15F2K60S2.h"
#include "uart.h"

#define u8 unsigned char

u8 true_data[]={'A','A','A','S','S','S'};


u8 judge_data(u8 a[],u8 b[])
{
  u8 i;
  for(i=0;i<6;i++)
  {
    if(a[i]!=b[i])
	{
	  return 0;
	}
  }
  return 1;
}


void main()
{
  P2=0x80;P0=0xff;P2=0;
  P2=0xa0;P0=0;P2=0;
  UartInit();
  while(1)
  {
    if(rec_index>5)
	{
	  for(rec_index=0;rec_index<6;rec_index++)
	  {
	    SendData(rec_table[rec_index]);
	  }
	  if(judge_data(rec_table,true_data))
	  {
	    P2=0x80;P0=~0x01;P2=0;
	  }
	  rec_index=0;
	}
  }
}





uart.c

#include "uart.h"

bit busy;

unsigned char rec_table[6];
unsigned char rec_index=0;


void UartInit(void)		//1200bps@11.0592MHz
{
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x40;		//定时器1时钟为Fosc,即1T
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//设定定时器1为16位自动重装方式
	TL1 = 0x00;		//设定定时初值
	TH1 = 0xF7;		//设定定时初值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
	ES = 1;
	EA = 1;
	SendString("STC15F2K60S2\r\nUart Test !\r\n");
}


/*----------------------------
UART 中断服务程序
-----------------------------*/
void Uart() interrupt 4 using 1
{
    if (RI)
    {
        RI = 0;                 //清除RI位
        rec_table[rec_index] = SBUF;              //P0显示串口数据
        rec_index++;
    }
    if (TI)
    {
        TI = 0;                 //清除TI位
        busy = 0;               //清忙标志
    }
}

/*----------------------------
发送串口数据
----------------------------*/
void SendData(BYTE dat)
{
    while (busy);               //等待前面的数据发送完成
    busy = 1;
    SBUF = dat;                 //写数据到UART数据寄存器
}

/*----------------------------
发送字符串
----------------------------*/
void SendString(char *s)
{
    while (*s)                  //检测字符串结束标志
    {
        SendData(*s++);         //发送当前字符
    }
}


uart.h

#ifndef _UART_H_
#define _UART_H_

#include "STC15F2K60S2.h"

typedef unsigned char BYTE;
typedef unsigned int WORD;


extern unsigned char rec_table[6];
extern unsigned char rec_index;

void UartInit(void);
void SendData(BYTE dat);
void SendString(char *s);

#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值