51单片机第1步_putchar()和_getkey()应用

发布于:2024-06-30 ⋅ 阅读:(12) ⋅ 点赞:(0)

没有开发板,没有烧录器,没有学习场所,如何学习写51单片机的程序?除了采用软件模拟仿真,没有更好的方法,因此,使用串口是学习的第一步。

1、_getkey ()函数

在C:\Keil\C51\LIB中有一个叫GETKEY.C的函数,如下:

#include <reg51.h>

//函数功能:从串口读取一个字节,并将读到的值返回;

char _getkey ()

{ char c;        //声明有符号字节型暂态变量c;

while (!RI);   //等待串口输入,RI=1时,表示串口接收到一个字节;

  c = SBUF;    //将接收到字节保存到c中;

  RI = 0;       //将RI=0,为下次接收做准备;

  return (c);     //将接收到的值返回;

}

2、putchar (char c)函数

在C:\Keil\C51\LIB中有一个叫PUTCHAR.C的函数,如下:

#include <reg51.h>

#define XON    0x11   //定义XON的值为0x11

#define XOFF   0x13   //定义XOFF的值为0x13

//函数功能:将字节值通过串口发送出去,若是换行符'\n',则先发送回车符'\r',再发送换行符'\n';

char putchar (char c)

{ if (c == '\n')   //若输出的值是'\n',则执行下面语句;

{ if (RI)    //查询串口有无数据输入,若串口有数据输入,则执行下面语句;

{ if (SBUF == XOFF)  //

{ do { RI = 0;

               while (!RI);

             }while (SBUF != XON);  //若串口接收到的是XON的值,则停止接收;

           RI = 0;  //将RI=0,为下次接收做准备;

         }

       }

     while (!TI);  //等待串口将上一次的数据发送完毕;

     TI = 0;      //为下次发送做准备;

     SBUF = 0x0d;  //将回车符'\r'(值为0x0d)写入串口发送缓冲器,等待发送;

   }

if (RI) //查询串口有无数据输入,若串口有数据输入,则执行下面语句;

{ if (SBUF == XOFF)

{ do { RI = 0;

            while (!RI);

          }while (SBUF != XON); //若串口接收到的是XON的值,则停止接收;

        RI = 0;  //将RI=0,为下次接收做准备;

      }

   }

while (!TI);  //等待串口将上一次的数据发送完毕;

TI = 0;      //为下次发送做准备;

return (SBUF = c);  //将c的值写入串口发送缓冲器,等待发送;;

}

3、putchar()和_getkey()应用举例

#include <REG51.h>  //包含头文件REG51.h,使能51内部寄存器;

#include <stdio.h>  //包含头文件stdio.h

unsigned char KEY_Value;

//函数功能:初始化串口,设置波特率为1200bps@16MHz,使能接收,使用8位UART;

void Serial_Port_Initialization()

{ SCON  = 0x50; //串行控制寄存器: SM0,SM1,SM2,REN,TB8,RB8,TI,RI

                //SM1:SM0=01,选择方式1,SM2=0,表示非多机通讯,8-bit UART;

//REN=1,使能接收;

  TMOD |= 0x20; //定时器方式控制寄存器:GATE1,C/T1,M11,M10,GATE0,C/T0,M01,M00

                //GATE=0,TR置1便可以启动Timer;GATE=1,TR置1,且INT脚输入高电

//平,才可以启动Timer;

//M11:M10=10,选择方式2,8位自动重装载;

  TH1   = 221;  //TH1:  reload value for 1200 baud @ 16MHz

  TR1   = 1;    //启动Timer1;

  TI    = 1;    //发送UART的第一个字节,为下次发送做准备;

}

//函数功能:测试_getkey()函数;

void test_getkey()

{ KEY_Value=_getkey();//view->serial window #1,打开serial window #1,用键盘输入一个字符;

  printf("KEY_Value=%c\n",KEY_Value); //在串行调试窗口里,打印KEY_Value=输入的字符;

}

//函数功能:测试getchar()函数;

void test_getchar()

{ printf("KEY_Value="); //在串行调试窗口里,打印KEY_Value=

  KEY_Value=getchar();  //getchar()函数先用_getkey()从键盘读取一个字符,然后用putchar()

//打印出来;

  printf("\n");

}

//函数功能:测试putchar()函数;

void test_putchar()

{ putchar ('O');   //在串行调试窗口里,打印O的字符;

  putchar ('K');   //在串行调试窗口里,打印K的字符;

  putchar ('!');   //在串行调试窗口里,打印!的字符;

  putchar ('\n');  //在串行调试窗口里,打印换行字符;

}

void main (void)

{ Serial_Port_Initialization();  //初始化串口,设置波特率为1200bps@16MHz,使能接收,

//使用8位UART;

  for(;;)

    { test_putchar();  //测试putchar()函数;

  test_getchar();  //测试getchar()函数;

  test_getkey();  //测试_getkey()函数;

}

}


网站公告

今日签到

点亮在社区的每一天
去签到