|
#include "uart.h"
unsigned char ostart;
unsigned char oend;
char idata outbuf[OLEN];
unsigned char istart;
unsigned char iend;
char idata inbuf[ILEN];
bit bdata sendfull;
bit bdata sendactive;
/*串行中断服务程序*/
static void com_isr(void) interrupt 4 using 1 //串口中断
{
//-------------接收数据中断--------------
char c;
if(RI)
{
c=SBUF;
RI=0;
if(istart+ILEN!=iend)
{
inbuf[iend++&(ILEN-1)]=c;
}
}
//-------------发送数据中断--------------
if(TI)
{
TI=0;
if(ostart!=oend)
{
SBUF=outbuf[ostart++&(OLEN-1)];
sendfull=0;
}
else
{
sendactive=0;
}
}
}
//PUTBUF: 写字符到SBUF或发送缓冲区
void putbuf(char c)
{
if(!sendfull)
{
if(!sendactive)
{
sendactive=1;
SBUF=c;
}
else
{
ES=0;
outbuf[oend++&(OLEN-1)]=c;
if(((oend^ostart)&(OLEN-1))==0)
{ sendfull=1;}
ES=1;
}
}
}
//替换标准库函数putchar程序
//printf函数使用putchar输出一个字符
char putchar (char c)
{
if (c=='\n')
{
while(sendfull);
putbuf(0x0D);
}
while(sendfull);
putbuf(c);
return(c);
}
//替换标准库函数_getkey程序
//getchar和gets函数使用_getkey
char _getkey(void)
{
char c;
while(iend==istart)
{;}
ES=0;
c=inbuf[istart++&(ILEN-1)];
ES=1;
return(c);
}
/* 初始化串行口和UART波特率函数*/
void com_initialize(void)
{
istart=0;
iend=0;
ostart=0;
oend=0;
sendactive=0;
sendfull=0;
TMOD |=0x20; //T/C1工作在方式2
TH1=0xfd;
TR1=1;
SCON=0xd8;
ES=1;
}
void uart_Init()
{
com_initialize();
EA=1;
}
|
|
相关帖子
- • 这是定义的问题吗,用的c语言,怎么都改不对
- • adc_dma进行采集时打印数据为0,不开dma数据能够正常显示,想问一下是什么原因
- • 单片机不使用外部中断,如何LED显示程序?
- • 做了个替BF7612CM的测试
- • Keil程序求助,这些报错怎么解决,小白一个,刚接触单片机
- • 求用at89c51单片机测LM331 V/F转化后的频率 我的没有显示
- • MCU模拟SPI通信,能发送数据,接收不到数据
- • 菜鸟求助
- • STM32单片机向ESP8266发送指令,设置延时1秒上传一次数据,延时不准确
- • 单片机矩阵按键 原理图+源代码
- • 通过手机蓝牙APP发出控制指令,控制3个以上LED灯亮灭和蜂鸣器报警和关闭,怎么做 求指导
- • 关于用51单片机驱动AD9851的原理及其编程思路?
- • 单片机用点阵LED实现静态字符显示实验程序
- • 关于单片机矩阵键盘多位数的输入程序问题
- • CCS10.2编译器貌似不支持部分GNU的__attribute__
- • STM32于OLED1.54寸的屏幕资料
- • 基于89C52单片机的时钟设计经验分享
- • [原创文档分享]一步一步写带界面的程序(基于EasyX等库) 第三版 C/C++语言
- • arduino due时钟 气象站制作 at24c w25q esp8266 源程序
- • 单片机秒表程序到了指定时间不会停下来
|
|
|
|
|