鱼的新天地 https://bbs.21ic.com/?522218 [收藏] [复制] [RSS] 零的开始,新的开始!

日志

来比较一下这2个程序的不同

已有 636 次阅读2007-11-30 17:33 |系统分类:单片机

(1)

#include "reg52.h"                               // 包含头文件   

/* 与编译器无关的数据类型定义 */
/********************************************************************************************/
typedef unsigned char      uint8;                // 无符号8位整型变量
typedef signed   char      int8;                 // 有符号8位整型变量
typedef unsigned short     uint16;               // 无符号16位整型变量
typedef signed   short     int16;                // 有符号16位整型变量
typedef unsigned int       uint32;               // 无符号32位整型变量
typedef signed   int       int32;                // 有符号32位整型变量
typedef float              fp32;                 // 单精度浮点数(32位长度)
typedef double             fp64;                 // 双精度浮点数(64位长度)
/********************************************************************************************/


/********************************************************************************************
* 函数名称:Delay()
* 功    能:软件延时
* 入口参数:count    延时参数,值越大,延时越长
* 出口参数:无
*********************************************************************************************/
void Delay(uint16 count)
{
  uint8 i;               


  while(--count != 0)       
    {
     for(i = 0; i < 125; i++);                // ";" 表示空语句,CPU空转。
   }                                // i 从0加到125,在12M晶体下CPU大概耗时1毫秒
}


/********************************************************************************************
* 函数名称:UART_Init()
* 功    能:UART初始化
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void UART_Init(void)
{
  IE=0x00;                                       // 禁止所有中断


  SCON=0x50;                                     // 串口工作方式1,即10位异步收发器(8位数据),波特率可变


  TMOD|=0x20;                                    // 定时器1:工作方式2(8位自动重装定时/计数器)


  PCON|=0x80;                                    // SMOD=1,即波特率提高一倍


  TH1=0xF4;                                      // 晶振频率为11.0592MHz时,波特率为4800


  TR1=1;                                         // 启动定时器/计数器1


}


/********************************************************************************************
* 函数名称:UART_Send_Char()
* 功    能:向串口发送一个字符
* 入口参数:Send_Char   要发送的一个字符
* 出口参数:无
*********************************************************************************************/
void UART_Send_Char(uint8 Send_Char)
{
  SBUF=Send_Char;                                // 将要发送的一个字符写入发送缓冲区
  while(TI==0);                                  // 查询UART发送中断标志,直到标志为1(产生发送中断)时,执行下面的语句 
  TI=0;                                          // 清0UART发送中断标志
}


/********************************************************************************************
* 函数名称:UART_Send_String()
* 功    能:向串口发送一个字符串
* 入口参数:Send_String   要发送的一个字符串
*           StringLen     字符串长度
* 出口参数:无
*********************************************************************************************/
void UART_Send_String(uint8 *Send_String,uint32 StringLen)
{
  uint32 i=0;


  do
    {
   UART_Send_Char(*(Send_String+i));
   i++;
 }while(i<StringLen);
}


/********************************************************************************************
* 函数名称:main()

*********************************************************************************************/    
void main (void)               
{
  UART_Init();                                   // UART初始化
 
  while(1)
      {
     UART_Send_String("Hello ARMSKY-51Easy!\n",21); // 通过UART向上位机发送"Hello ARMSKY-51Easy!"字符串
     Delay(500);                              // 延时
   }
}

(2)

#include "reg52.h"                               // 包含头文件   

/* 与编译器无关的数据类型定义 */
/********************************************************************************************/
typedef unsigned char      uint8;                // 无符号8位整型变量
typedef signed   char      int8;                 // 有符号8位整型变量
typedef unsigned short     uint16;               // 无符号16位整型变量
typedef signed   short     int16;                // 有符号16位整型变量
typedef unsigned int       uint32;               // 无符号32位整型变量
typedef signed   int       int32;                // 有符号32位整型变量
typedef float              fp32;                 // 单精度浮点数(32位长度)
typedef double             fp64;                 // 双精度浮点数(64位长度)
/********************************************************************************************/

sbit P1_7 = P1 ^ 7;                              // 定义位变量

#define LED11_ON()   (P1_7=0)                    // 定义"LED11_ON()"为AT89S52的P1.7脚输出低电
                                                 // 平使LED11点亮

#define LED11_OFF()  (P1_7=1)                    // 定义"LED11_OFF()"为AT89S52的P1.7脚输出高电
                                                 // 平使LED11熄灭

/********************************************************************************************
* 函数名称:UART_Init()
* 功    能:UART初始化
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void UART_Init(void)
{
  SCON=0x50;                                     // 串口工作方式1,即10位异步收发器(8位数据),波特率可变

  TMOD|=0x20;                                    // 定时器1:工作方式2(8位自动重装定时/计数器)

  PCON|=0x80;                                    // SMOD=1,即波特率提高一倍

  TH1=0xF4;                                      // 晶振频率为11.0592MHz时,波特率为4800

  IE=0x90;                                       // 允许UART中断

  TR1=1;                                         // 启动定时器/计数器1
}


/********************************************************************************************
* 函数名称:UART_Receive_Server()
* 功    能:UART接收中断服务程序.若接收到上位机发来的十六进制值0xAA,则点亮LED11;若接收到上位
*           机发来的十六进制值0x55,则熄灭LED11。
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void UART_Receive_Server(void) interrupt 4
{
  if(RI)                                         // 若产生UART接收中断
    {
   uint8 ReceiveData;                         // 定义接收变量

   RI=0;                                      // 清零UART的接收中断标记
   ReceiveData=SBUF;                          // 从接收缓冲区读出数据
  
   switch(ReceiveData)                        // 对收到的数据进行判断
         {
     case 0xAA:                         // 若接收到的数据为0xAA,则点亮LED11
               LED11_ON();
               break;
     case 0x55:                         // 若接收到的数据为0x55,则熄灭LED11 
                        LED11_OFF();
               break;
     default:
               break;
   
   }
    }
}

/********************************************************************************************
* 函数名称:main()

*           上位机发来的十六进制值0x55时,LED11灭。
*********************************************************************************************/    
void main (void)               
{
  UART_Init();                                   // UART初始化
  LED11_OFF();                                   // AT89S52的P1.7脚输出高电平来熄灭LED11

  while(1);                                      // 死循环,等待UART接收中断
}


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)