一、题目
二、编程
2.1 经常需要添加的AUXR辅助寄存器
用到串口就要对辅助寄存器AUXR进行操作,只有两步,首先在开头加上sfr AUXR =0x8e,然后在串口初始化函数中对AUXR赋0x00。
2.2 初始化系统函数
InitSystemLED灯是低电平有效,Y5C控制的元器件是低电平有效,因为从HC573寄存器出来后接了一个达林顿管,取反了,所以给高电平有效。
2.3 和中断有关的函数
初始化串口 InitUart 函数,首先设置定时器的模式,利用TMOD模式控制寄存器
经常给TMOD赋值0x20.
然后设置波特率9600,因为是用的自动重装的8位定时器,参考下图,给TH1和TL1赋0xfd。这也是最常见的情况之一。
然后给串口控制寄存器SCON赋值。这也是很常见的情况,8位的UART,允许接收,SCON = 0x50 ;
2.4 如何给上位机发送字符串
void SendByte(unsigned char dat)
{
SBUF = dat;
while(TI == 0);
TI = 0;
}
------------------------------------------------------------------
void SendString(unsigned char *str)
{
while(*str != '\0')
{
SendByte(*str++);
}
}
发送一个字符串其实就是不断地调用SendByte,字符串实际上可以看成是一个数组,用字符型的指针一个一个发,因为数组最后一个数据是'\0',可以用循环判断,把整个字符串一个字符一个字符发送。在发送或者接收过程中,应该注意在完成发送或者接收后标志位的初始化。
三、代码
#include "reg52.h"
sfr AUXR = 0x8e;
void SendByte(unsigned char dat);
void SelectHC573(unsigned char channel)
{
switch(channel)
{
case 4:
P2 = (P2 & 0x1f) | 0x80;
break;
case 5:
P2 = (P2 & 0x1f) | 0xa0;
break;
case 6:
P2 = (P2 & 0x1f) | 0xc0;
break;
case 7:
P2 = (P2 & 0x1f) | 0xe0;
break;
case 0:
P2 = (P2 & 0x1f) | 0x00;
break;
}
}
void InitSystem()
{
SelectHC573(5); //Y5C控制STEPA、STEPB、STEPC、STEPD、继电器RELAY、马达、蜂鸣器。注意,这里只有7个口,第八个口P07没有连接达林顿管,直接连接N_SPK。
P0 = 0x00 ; //连接了达林顿管,取了反的,所以是高电平有效,全部位赋零关闭。
SelectHC573(4); //Y4C控制LED灯,低电平有效,给P0全部位赋1,关闭所有灯。
P0 = 0xff;
}
//***********和中断有关的函数*****************
void InitUart()
{
TMOD = 0x20; //TMOD模式控制寄存器
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1 ;
SCON = 0x50 ; //串口控制寄存器SCON,模式1,八位UART,允许接收
ES = 1;
EA = 1;
AUXR = 0x00;
}
unsigned char command = 0x00;
void ServiceUart() interrupt 4 //串口中断,4号中断
{
if(RI == 1)
{
command = SBUF ;
RI = 0;
}
}
//*******************************************
//***************发送函数********************
void SendString(unsigned char *str) //实际上数组,用字符型的指针一个一个发,数组最后一个是'\0'.
{
while(*str != '\0')
{
SendByte(*str++);
}
}
void SendByte(unsigned char dat)
{
SBUF = dat;
while(TI == 0);
TI = 0;
}
//*******************************************
void Working()
{
if(command != 0x00)
{
switch(command & 0xf0)
{
case 0xa0:
P0 = (P0 | 0x0f) & (~command | 0xf0);
command = 0x00;
break;
case 0xb0:
P0 = (P0 | 0xf0) & ((~command <<4 ) | 0x0f);
command = 0x00;
break;
case 0xc0:
SendString("The System is Running...\r\n");
command = 0x00;
break;
}
}
}
void main()
{
InitSystem();
InitUart();
SendString("Welcome to XMF System!\r\n");
while(1)
{
Working();
}
}