前言
本次编程实验以IAP15F2K61S2为单片机主控芯片,头文件为STC15F2K60S2.H
。若用于51系列单片机,以reg52.h
为头文件,则读者需将程序中可能涉及的定时器初始化程序和LED亮灭程序和数码管显示程序,根据自身所用单片机原理图和手册进行修改。
一、实验内容
将名字小写由上位机发送给单片机,单片机返回名字大写给上位机。由于串口通信原理较为简单,因此不作原理说明,请读者结合代码自行思考。
二、编程实现
#include <STC15F2K60S2.H>
#include "string.h"
typedef unsigned char u8;
#define outputp0(y,x) P0=x,P2&=0x1f,P2|=y,P2&=0x1f;
u8 receivebuff[7]=0;
u8 receiveflag=0;
u8 temp=0;
void Uart1Init(void) //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器时钟12T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xFD; //设置定时初始值
TH1 = 0xFD; //设置定时重载值
ET1 = 0; //禁止定时器中断
TR1 = 1; //定时器1开始计时
EA=1; //开串口中断
ES=1;
}
void sendbit(u8 sendbit)
{
SBUF=sendbit;
while(TI==0);
TI=0;
}
void sendbuff(u8 *string)
{
while(*string!='\r')
sendbit((*string++)-32); //小写字母转换为大写
}
void UART1_Routine() interrupt 4
{
if(RI==1)
{
RI=0;
temp=SBUF;
receivebuff[receiveflag]=temp;
receiveflag++;
if(temp=='\r') //判断接收完成
{
sendbuff(receivebuff);
receiveflag=0;
}
}
}
void main()
{
outputp0(0x80,0xff);
outputp0(0xa0,0x00);
Uart1Init();
while(1)
{
}
}