萬用電路板

----纯属爱好,谁与共鸣

« 简洁的RS232串口通信电路与串口通信测试程序【图】运用TL084运放的重低音增强板 »

51串口实验:数码管显示电脑键盘按键ASCII值

        继上次的51单片机串口测试程序调试成功之后,我又做了一个电脑与单片机之间双向通信的实验,这次不仅可以通过一个按钮控制单片机向电脑发送字符串,而且还可以通过数码管显示电脑键盘上按键的ASCII值。

        本实验除需要单片机最小系统外,还需用到自制多功能数码管显示实验板一文中的数码管实验板和简洁的RS232串口通信电路与串口测试程序文中的串口通信电路,另需一只轻触式按钮。

        系统连接:P1.0接轻触式按钮K1,P0口输出数码管段码,P2口为数码管位选信号,在此实验中只用到了十位和个位显示。

        操作说明:打开串口调试助手之类的软件(这次不要勾选“HEX显示”),当按下单片机系统的K1按钮时,单片机向主机发送字符串"欢迎光临万用电路板http://www.jiangx.net/",在串口调试软件中看得到;当按下电脑键盘上任一按键时,数码管则显示出该键的ASCII键值。

程序如下:

/**************************************************************
程序名称:51串口通信程序,晶振11.0592M
程序功能:单片机接收主机的数据,然后将数据通过数码管显示,再将数据发回主机
    当按下K1(P1.0)时,单片机发送字符串给主机
编    写:JiangX.net
时间地点:09/03/23晚于寝室
**************************************************************/
#include <AT89X52.h>
#define uchar unsigned char
uchar key_s, key_v, tmp;
char code str[] = "欢迎光临万用电路板http://www.jiangx.net/";
uchar code dis[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
sbit K1 = P1^0;      //字符串发送按钮

/*****n(ms)延时子程序*****/
void delayms(uchar ms)    //延时ms 
{      
 uchar i;
 while(ms--)
 {
  for(i = 0; i < 120; i++);
 }
}

/*****串口传送一个字符*****/
void send_char(uchar txd)
{
 SBUF = txd;
 while(!TI);      //等特数据传送
 TI = 0;       //清除数据传送标志
}

/*****串口传送字符串*****/
void send_str()
{
 uchar i = 0;
 while(str[i] != '\0')
 {
  SBUF = str[i];
  while(!TI);     //等特数据传送
  TI = 0;      //清除数据传送标志
  i++;      //下一个字符
 } 
}

/*****扫描按键*****/
bit scan_key()
{
 key_s = 0x00;
 key_s |= K1;
 return(key_s ^ key_v); 
}

/*****按键处理*****/
void proc_key()
{
 if((key_v & 0x01) == 0)   //K1按下
 {   
  send_str();     //传送字串
 }
}

/*****显示子程序*****/
void display()
{
 P0=dis[tmp&0x0f];
 P2=0x7f;
 delayms(10);     //个位显示
 P0=dis[tmp/16];
 P2=0xbf;
 delayms(10);     //十位显示
}

/*****主函数*****/
main()
{
 TMOD = 0x20;     //定时器1工作于8位自动重载模式, 用于产生波特率
 TH1 = 0xFD;      //波特率9600
 TL1 = 0xFD;
 
 SCON = 0x50;     //设定串行口工作方式
 PCON &= 0xef;     //波特率不倍增
  
 TR1 = 1;      //启动定时器1
 IE = 0x0;      //禁止任何中断
 while(1)
 {
  if(scan_key())    //扫描按键
  {
   delayms(10);   //延时去抖动
   if(scan_key())   //再次扫描
   {
    key_v = key_s;  //保存键值
    proc_key();   //键处理
   }
  }
  if(RI)      //是否有数据到来
  {
   RI = 0;
   tmp = SBUF;    //暂存接收到的数据
   send_char(tmp);   //回传接收到的数据
  }
  display();  
 }
}

/*****END*****/

(此串口调试工具下载地址:http://www.jiangx.net/post/278.html

本站原创如转载,请注明:转载自萬用電路板 [ http://www.jiangx.net/ ]

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

赞助商广告

最近发表

热文排行

最新评论及回复

广告

图标汇集

Powered By Z-Blog 1.8 Walle Build 100427

Copyright 2008-2011 JiangX.com 萬用電路板 All Rights Reserved.
鄂ICP备08003060号 [login]