打印
[国产单片机]

单片机程序问题

[复制链接]
1757|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liusongwei123|  楼主 | 2010-5-8 21:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>
#include "message5.h"
sfr rs_timerL = 0x8A;              //TL0
sfr rs_timerH = 0x8C;              //TH0
#define INT8U unsigned char
#define INT16U unsigned int
INT8U code headCommand[]={0x00,0xAA,0xFF,0x55};
INT8U code askCommand[] ={0x28,0x20,0x20,0x31,0x3B,0x05,0x3B,0x29,0x31,0x20,0x20,0X34,0x0D,0x0A};
INT8U code ackCommand[] ={0x28,0x20,0x20,0x31,0x3B,0x06,0x3B,0x29,0x31,0x20,0x20,0X37,0x0D,0x0A};
/********************************************************************
选择工作模式  产品  调试
*********************************************************************
#define SYSTEM_DEBUG
void null(){}
/********************************************************************
选择通道
*********************************************************************/
#define channel 0x05
/********************************************************************
选择晶振和波特率
*********************************************************************/
//选择以下一个晶体频率
      
#define Fosc 11059200  //9600//                 

//为模拟串口定时器0选择以下一个波特率:
//#efine Baud 300                     
//#define Baud 1200
//#define Baud 2400
//#define Baud 4800 //*//
#define Baud 9600   //*//

//为硬件串口定时器1选择以下一个波特率:

#define Baud1 9600 //11059200//

/*********************************************************************
串口堆栈设置
**********************************************************************/
#ifdef   SYSTEM_DEBUG
#define uart_RECEIVE_MAX    128    //最大接收长度
#define uart_STACK   0x7F     //堆栈长度
INT8U   idata uartBuffer[uart_RECEIVE_MAX]; 、//为何定义 成这样啊
#else
#define uart_RECEIVE_MAX    1024   //最大接收长度
#define uart_STACK   0x3B4     //堆栈长度
INT8U  xdata uartBuffer[uart_RECEIVE_MAX];   //? 为何定义成片外
#endif
INT8U  uartBufLength,uartBufNum,uartBufFlag;
INT8U  uartSum[]={0x00,0x00,0x00,0x00};
INT8U  uartBufSum;
INT16U uartBufHead, uartBufTail;//askTime;
//接收缓冲设置
#define rs_RECEIVE_MAX    16             //最大接收长度
INT8U   rs_buffer[rs_RECEIVE_MAX];       //收、发缓冲区
INT8U ReceivePoint;                   //接收数据存储指针
/*********************************************************************
模拟串口设置
**********************************************************************/
sbit ledPower = P2^3;
sbit ledUart  = P2^4;
sbit ledRs    = P2^5;
sbit ledTest  = P2^6;
sbit rs_TXD   = P2^0;
sbit rs_RXD   = P2^1;
INT8U bdata rs_BUF;                  //串行收、发时用的移位暂存器。
sbit rs_BUF_bit7 = rs_BUF^7;        //移位暂存器的最高位。
INT8U rs_shift_count;                //移位计数器。
INT8U bdata rsFlags;
sbit rs_f_TI         = rsFlags^0;   //0:正在发送; 1: 一个字符完毕
sbit rs_f_RI_enable = rsFlags^1;   //0:禁止接收; 1:允许接收
sbit rs_f_TI_enable = rsFlags^2;   //0:禁止发送; 1:允许发送
sbit    rs_f_com      = rsFlags^3;     //0:禁止上传;1:允许上传
sbit    rs_f_sum  = rsFlags^6;   //0:校验正确;1:校验错误
sbit    rs_f_message = rsFlags^7;   //0:提取数据;1:提取信息
/*********************计算计数值***************************************/
//收、发一位所需定时器计数
#define rs_FULL_BIT0 ((Fosc/12) / Baud)
#define rs_FULL_BIT (65536 - rs_FULL_BIT0)
#define rs_FULL_BIT_H rs_FULL_BIT >> 8        //收、发一位所需定时器计数高位
#define rs_FULL_BIT_L (rs_FULL_BIT & 0x00FF)  //收、发一位所需定时器计数低位
//检测起始位的时间间隔所需定时器计数
#define rs_TEST0 rs_FULL_BIT0 / 4             //波特率较低时可以除以 3 或除以 2
#define rs_TEST ((~rs_TEST0))
#define rs_TEST_H rs_TEST >> 8                //高位
#define rs_TEST_L rs_TEST & 0x00FF            //低位
//发送起始位所需定时器总计数
#define rs_START_BIT0 ((Fosc/12)/Baud)
#define rs_START_BIT 0xFFFF -rs_START_BIT0+ 0x28
#define rs_START_BIT_H rs_START_BIT >> 8      //发送起始位所需定时器计数高位
#define rs_START_BIT_L rs_START_BIT & 0x00FF  //发送起始位所需定时器计数低位
/******************************************************************
                    延时程序
******************************************************************/
void delay(unsigned char delayTime)
{
  unsigned char i;
   for(i=delayTime;i>0;i--);
  }
/******************************************************************
波特率初始化程序
******************************************************************/
void baudInit()
{
TR0=0;// 关闭定时器0
TR1=0;// 关闭定时器1
TMOD=0X21;
    SCON=0X50;
    PCON=0X80;
TH1=(INT8U)(256-(Fosc/(16L*12L*Baud1)));
IP=0x02;
ET0=1;
ES=1;
EA=1;
TR0=1;// 启动定时器0
TR1=1;// 启动定时器1
}
/******************************************************************************
接收监听程序(需要提高2-4倍的波特率)
******************************************************************************/
void soft_receive_init()               //监测起始位
{
    TR0 = 0;             //停止定时器
    rs_timerH = rs_TEST_H;
    rs_timerL = rs_TEST_L;
    rs_shift_count = 0;
    TR0 = 1;             //启动定时器
}
/******************************************************************************
使能接收、废能发送
******************************************************************************/
void soft_receive_enable()             //允许接收
{
    rs_f_RI_enable = 1;                //允许接收
    rs_f_TI_enable = 0;                //禁止发送
    soft_receive_init();               //监测起始位, RXD 下降沿触发接收字节过程.
}
/******************************************************************************
使能发送、废能接收
******************************************************************************/
void soft_send_enable (void)          //允许发送
{
    TR0 = 0;                           //停止定时器
    rs_f_TI_enable = 1;                //允许发送
    rs_f_RI_enable = 0;                //禁止接收
    rs_shift_count = 0;                //清移位计数器
    rs_f_TI   = 1;                     //发送一个字符完毕标志
    TR0= 1;                            //启动定时器
}

请问这段程序中, rs_f_TI_enable = 1;                //允许发送
    rs_f_RI_enable = 0;                //禁止接收

这两句我不是很明白。为什么只是定义了一个寄存器和变量,就能达到他所说的效果了吗。就能实现允许发送和禁止接受了吗。这是为什么啊。

相关帖子

沙发
McuPlayer| | 2010-5-8 23:30 | 只看该作者
这是个sbit,你仔细跟踪一下定义就知道了,手要勤快

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

77

帖子

1

粉丝