/*SCON 设置使用mode 0;设置TI的值为1 开始发送数据,发送完毕后,软件置0.
TI是指单片机SFR中SCON的一位,而且是被硬件置位的。当单片机发送完一帧数据后,该数据位由硬件置1
*/
#include
#include#define uchar unsigned char
#define uint unsigned int
sbit SPK=P3^7;
uchar FRQ=0x00;
//Time delay.
void DelayMS(uint ms)
{
uchar i;
while(ms--) for(i=0;i<120;i++);
}
//Main procedure.
void main()
{
uchar c=0x80;
SCON=0x00; //Serial control register,Operating Mode:0;
TI=1; //Transmit interrupt flag ,Set by hardware at the end of the 8th bit time in mode 0
while(1)
{
c=_crol_(c,1); //Left move 1 bit.
SBUF=c; //Serial Buffer
while(0 == TI); //Waiting for send over.
TI=0; //Cleared by software.
DelayMS(400); //Setting time delay.
}
}
为了数据接收不完整这个问题,纠结了好几天,一个小问题,却能让人奔溃。今天算解决了,总结如下:1.程序流程的考虑。以前总是觉得实现了这个功能就行了,很少留意到程序的编写流程,例如总开关EA的打开关闭,ES的打开关闭。项目中用到的中断不止UART一个,如果每次都操作EA,可能会造成不可预料的后果。在中断初始化的时候,只需关注自己操作的中断,将中断关闭,然后再打开,完成初始化操作。总开关EA 的打开放在各个中断初始化后。2.解决数据接收不完整: a.单个字符是否可以正常接收完整 b.考虑数据接收的时候所需要的时间在下面程序中, for(i = 1000; i > 0 ; i--) 其实是为了在1S内接收中断发过来的数据,在接收完成后再进行数据的发送。
void UART()
{
u8 i = 0;
if (1 == ReadFlag)
{
ReadFlag = 0;
for(i = 0;i < 50; i++)
{
if(0 != UARTBuf[i])
SendByte(UARTBuf[i]);
}
SBUFData = 0;
while(SBUFData < 50)
{
UARTBuf[SBUFData] = 0;
SBUFData++;
}
}
}
//serial interrupt function
void serial () interrupt 4
{
u16 i;
inuartnum = 0;
for(i = 1000; i > 0 ; i--) // Define 100ms delay time for reception.
{
if (1 == RI_0) //when receiving data, hardware automatic set 1
{
RI_0 = 0 ;
// SBUFData =SBUF0;
UARTBuf[inuartnum] = SBUF0;
inuartnum++;
ReadFlag = 1;
}
}
}