📄 uartcom1.c
字号:
/*********************************************************************/
/* 模 块 名:单片机(C51) 文件名:uart_com1.c */
/* 提交日期:2006年1月16日 作 者:金雨和(jinyuhe@163.com) */
/* 版 本:V1.0 --Copyright(c) 2006-2008 */
/* 描 述:单片机(C51)串口1处理程序 */
/* 修改记录: */
/* 日 期 版本 修改人 修改内容 */
/* 1. */
/*********************************************************************/
#include <Reg935.h>
#include "uart.h"
#include "string.h"
#define PLEEN PLLEN
extern unsigned char xdata g_ucI2CSendBuf[MAX_I2CDATALEN]; //IIC数据缓存
extern unsigned char xdata g_ucI2CSendBuf_Len; //IIC数据缓存内容长度
extern unsigned char xdata g_ucI2CSendBuf_offset; //IIC缓存数据读取当前位移
/*******************************************************************
** 函 数 名: main()
** 输 入: 无
** 输 出: 无
** 描 述: C51主循环函数,红外接收检测及串口收发相应处理。
** 全局变量:
** g_workFlag -- 工作灯状态
** 调用模块:
** timer1_Init -- 定时器1初始化
** SendDataToBsp -- IIC发送中断给CPU
** 被调模块: 无
** 作 者:
** 创建日期: 2006年1月16日
** 修 改:
** 日 期 版本 修改人 修改内容
** 1.
********************************************************************/
void main()
{
//使能中断
EA = 1;
TMOD = 0;
TAMOD = 0;
IICInit();
// timer0_Init();
timer1_Init();
IRRecvInit(); //红外接收初始化
// P0M1=P0M2=0;
// P1M1=P1M2=0; //P0,P1口设置为准双向
P1M1 &= 0xfc;
P1M2 &= 0xfc;
//P2M1=P2M2=0xc0; //P2.6,P2.7设置为开漏
// CCU_Init(); //CCU模块初始化,用以产生38KHz调制信号
UART1_Init();
UART2_Init();
while(1)
{
OnIRRecv(); //检测到正确的红外接收码后,通过IIC发送?
Delay(10);
}
}
/*******************************************************************
** 函 数 名: UART1SendData()
** 输 入:
** pbuf -- 发送数据缓冲
** len -- 发送数据长度
** 输 出: 无
** 描 述: 通过UART连续发送字节数据
** 注意:此程序采用查询方式发送。
** 全局变量: 无
** 调用模块: 无
** 被调模块:
** main -- 主循环处理函数
** 作 者: 金雨和
** 创建日期: 2006年1月16日
** 修 改:
** 日 期 版本 修改人 修改内容
** 1.
********************************************************************/
void UART1SendData(uchar *pbuf, uchar len)
{
uchar i;
TI=0;
for(i=0; i<len; i++)
{
SBUF=pbuf[i];
while(!TI);
TI=0;
}
}
/*******************************************************************
** 函 数 名: UART1RcvData()
** 输 入:
** pbuf -- 用于接收数据的缓冲区首地址
** 输 出: 无
** 描 述: 通过UART连续接收字节数据
** 注意:此程序采用查询方式进行接收。由于采取半双工通信,所以接收
** 数据之前要打开接收允许,接收完毕之后要关闭接收允许。
** 全局变量: 无
** 调用模块: 无
** 被调模块:
** main -- 主循环处理函数
** 作 者: 金雨和
** 创建日期: 2006年1月16日
** 修 改:
** 日 期 版本 修改人 修改内容
** 1.
********************************************************************/
void UART1RcvData(uchar *pbuf)
{
uchar i=0;
REN=1;
FE=0;
RI=0;
//for(i=0;i<16;i++)
{
while(!RI);
RI=0;
pbuf[i]=SBUF;
}
REN=0;
}
/*******************************************************************
** 函 数 名: CCU_Init()
** 输 入: 无
** 输 出: 无
** 描 述: CCU模块初始化,使OCA(P2.7)输出38KHz,50%占空比的PWM波,
** 作为红外线的载波
** 使用6MHz晶振时,CCU频率=((6000000/2)/6)*32=16MHz
** 定时器重装值=CCU频率/红外线载频=16000000/38000=421=0x1a5
** 全局变量: 无
** 调用模块: 无
** 被调模块:
** main -- 主循环处理函数
** 作 者: 金雨和
** 创建日期: 2006年1月16日
** 修 改:
** 日 期 版本 修改人 修改内容
** 1.
********************************************************************/
void CCU_Init()
{
//TOR2H=0x01; //定时器重装值
//TOR2L=0xa5;
//OCRAH=0x00; //(OCRAH:OCRAL)=(TOR2H:TOR2L)/2,PWM的占空比为50%
//OCRAL=0xd2;
TOR2H=0x03; //定时器重装值
TOR2L=0x4a;
OCRAH=0x01; //(OCRAH:OCRAL)=(TOR2H:TOR2L)/2,PWM的占空比为50%
OCRAL=0xa5;
TCR21=0x85; //PLL预分频为5+1
CCCRA=1; //非反相的PWM,
TCR20=0;
PLEEN=1;
while(!PLEEN);
TCR20|=3; //启动定时器,非对称PWM模式
}
/*******************************************************************
** 函 数 名: UART1_Init()
** 输 入: 无
** 输 出: 无
** 描 述: UART初始化,波特率9600bit/s
** 全局变量: 无
** 调用模块: 无
** 被调模块:
** main -- 主循环处理函数
** 作 者: 金雨和
** 创建日期: 2006年1月16日
** 修 改:
** 日 期 版本 修改人 修改内容
** 1.
********************************************************************/
void UART1_Init()
{
//PCON=0;
//SSTAT=0; //双缓冲禁止,中断禁止,采用查询方式发送和接收
SSTAT=0xE0; //选择独立的Tx/Rx中断
SCON=0x50; //串口模式1,接收禁止
//PCON|=0x40; //SMOD0=1,SCON的位7作为FE
BRGCON=0;
BRGR1=0x04; //0x02;//波特率为9600bits/s
BRGR0=0xd2; //0xf0;//波特率为9600bits/s
BRGCON=3; //启动UART的波特率发生器
ESR=1; //ESR=Enable Serial Recieve
// EST=1; //EST=Enable Serial Transmit
EA=1; //使能中断
}
/*******************************************************************
** 函 数 名: Delay()
** 输 入:
** k -- 延时时间
** 输 出: 无
** 描 述: 延时0.1*k秒(振荡器为6MHz)
** 注意:如果入口参数k等于0,则不延时而直接返回。
** 全局变量: 无
** 调用模块: 无
** 被调模块: 无
** 作 者: 金雨和
** 创建日期: 2006年1月16日
** 修 改:
** 日 期 版本 修改人 修改内容
** 1.
********************************************************************/
void Delay(uchar k)
{
uchar i,j;
if(k==0)
{
return;
}
for(;k;k--)
{
for(j=200;j;j--) //延时0.1S
{
for(i=250;i;i--)
{
//nop();
//nop();
//nop();
;//nop();
}
}
}
}
/*******************************************************************
** 函 数 名: UART1_Rcv_ISR()
** 输 入: 无
** 输 出: 无
** 描 述: C51串口1接收中断处理函数.
** 全局变量: 无
** 调用模块:
** UART1SendData -- 串口1字符串发送函数
** 被调模块: 无
** 作 者: 金雨和
** 创建日期: 2006年1月29日
** 修 改:
** 日 期 版本 修改人 修改内容
** 1.
********************************************************************/
void UART1_Rcv_ISR() interrupt 4
{
uchar temp;
uchar sndBuf[10];
//;当接收完一个字节RI置1进入Recieve中断
EA=0;
// while(!RI) //等待接收完时RI置位
temp=SBUF; //保存所读取的数据
RI=0; //RI清0以等待下次发送
#if 0
SBUF = temp; //发送数据
while(!TI); //当TI为1时发送完毕
TI=0; //TI清0准备发送
#endif
if(temp == 0x0D) //回车键
UART1SendData("\r\n", 2);
else if(temp == 0x0A) //换行
UART1SendData("\r\n", 2);
else if(temp == 0x08) //backspace键
{
sndBuf[0] = 0x08;
sndBuf[1] = ' ';
sndBuf[2] = 0x08;
UART1SendData(sndBuf, 3);
}
else
UART1SendData(&temp,1); //发送接收到的字符
g_ucI2CSendBuf[0] = UART1;
g_ucI2CSendBuf[1] = temp;
g_ucI2CSendBuf_Len = 2;
g_ucI2CSendBuf_offset = 0;
IICSendIntToCPU();
EA=1;
}
//--------------------------------
//在有的时候会出现仅发送一次然后程序卡死这种现象但是如果把程序中
//指令的流程稍微修改一下把TI=0移到 while(!TI)的后面程序可连续接收发送 SBUF=temp;
//发送数据 while(!TI); //当TI为1时发送完毕 TI=0; //TI清0准备下一次发送
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -