#include "c8051f020.h"
unsigned char data1
void SYSCLK_Init()
void PORT_Init()
void UART0_Init()
void SYSCLK_Init()
{
unsigned int i
OSCXCN=0X67//0X67=0110,0111
for(i=0i<256i++)//等待>1ms
while(!(OSCXCN&0X80)) //等待XTLVLD变为1
OSCICN=0X88//时钟失效监测器,选择外部时钟源作为系统时钟
}
void PORT_Init()
{
XBR0 = 0x27/*交叉开关配置,URAT总线TX0置到P0.0口,RX0置到P0.1口, SPI总线SCK配置到P0.2口,
MOSI为P0.4口卖袜睁, NSS为P0.5,MISO配置到P0.3口,IIC总线SDA置到P0.6口�SCK置到P0.7 TX1,RX1配置到P1.0,P1.1,CEX0,CEX1,配置到P1.2,P1.3,外部中断int0配置到P1.4 */
XBR1 = 0x04
XBR2 = 0x44 /*允许功能选择开关有效*/
P0MDOUT = 0x1A/*SCK、MOSI和NSS为推拉式输出,MISO为开漏式.*/
P74OUT =0xff
}
void UART0_Init()
{
SCON0=0x50 //串口方式1
TMOD=0X20//选用定时器1作为波特率发好桥生器
TH1=0xF4 //波特率为4800
TL1=0xF4
ES0=1 //开启串口中断0
TF1=0
TR1=1 //定时器启动
PCON=0X80//波特率加倍 波特率为9600
TI0=1
}
void UART0_ISR() interrupt 4 using 1
{
if(RI0)
{
RI0=0//中断接收标志清零
data1=SBUF0//接收数据
SBUF0=data1//发送数据
while(TI0==0)
TI0=0//发送标志清零
}
}
main()
{
WDTCN=0XDE
WDTCN=0XAD
SYSCLK_Init()
PORT_Init()
UART0_Init()
EA=1
while(1)
}
当你有数据接收到了以后立即触发中断,但是你在中断函数里面立即将RI0清零处理了,这样一来你的RI0几乎总是等于零的,这样
if(RI0)
{
RI0 = 0// 清除RI1标志位
*chr = SBUF0// 读取数据
return TRUE// 返回接收数据成功
}
else
return FALSE// 接收数据失败,无数据
}
这个条件永远不成立,所以你得不到数据,有两种解决办法,第一将中断关闭,这样也可以运行程序,但是不完美,第二在中断函数里面将SBUF0的数粗悔宽此据存到一个全局变量里面,同时用一个标志位指示数据的接收情况。
然后。。。。然后,,,你岩巧正应该明白了。。祝你成功。。
#include "C8051F340.h"#define SYSCLK 48000000
#define BAUDRATE 9600
void UART0_Init(void)
{
TCON = 0x40
TMOD = 0x20 //Timer1工作8位重装载,
TH1 = 256-(SYSCLK+BAUDRATE)/2l/BAUDRATE
SCON0 = 0x10 //UART0接收允许答喊
}
void main(void)
{
PCA0MD&= ~0x40 // 关闭看门狗帆世
PCA0MD= 0x00
UART0_Init()
P0MDOUT = 0x10
XBR0 = 0x01
XBR1 = 0x40
IE= 0x90 //UART中态举肢断及全局中断使能
while(1)
{
}
}
void UART0_ISR(void) interrupt INTERRUPT_UART0
{
unsigned char value
if(RI0==1)
{value=SBUF0
SBUF0=value
}
TI0=0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)