c51:串口通信,按键发送字符串

发布者:ph49635359最新更新时间:2016-10-13 来源: elecfans关键字:c51  串口通信  按键发送  字符串 手机看文章 扫描二维码
随时随地手机看文章
一、程序功能

1、实现0~f的16位键盘输入功能,将键值由P1口输出。

2、不同的键值串口发送不同的字符串

二、代码

//函数功能

//1.实现0~f的16位键盘功能,将按键表示的数字由数码管显示

//2.定义不同的按键表示发送不同的字符串

 

#include"reg52.h"

#define uchar unsigned char

 

//16位键盘行翻转法对应键值。

//对应的键值为0~f

uchar code kcode[]={

0x77,0x7b,0x7d,0x7e,

0xb7,0xbb,0xbd,0xbe,

0xd7,0xdb,0xdd,0xde,

0xe7,0xeb,0xed,0xee};

 

//不同键值发送的字符串

uchar buf0[4]={0x11,0x12,0x13,0x00};

uchar buf1[5]={0x11,0x12,0x13,0x14,0x00};

uchar buf2[6]={0x11,0x12,0x13,0x14,0x15,0x00};

uchar buf3[7]={0x11,0x12,0x13,0x14,0x15,0x16,0x00};

uchar buf4[8]={0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x00};

//---串口初始化

//T1为波特率发生器,初始化T1

//f=11.0592,baud=9600

//串口中断执行数据发送

void init_comm();

 

//定义标志位,全局变量

uchar kd;    //kd=1表示键闭合,并已经过10ms延时去抖动,已处于稳定状态;

uchar kin;  //kin=1表示键值已读到kbuf中,等待处理。

uchar kp;   //kp=1表示kbuf中的数据已处理。

uchar kbuf; //保存键值0~16

 

//开机flag=0;数据有发送flag=1;

uchar flag; 

 

//判断是否有键按下,

//有键按下返回1,无键按下返回0

//16位键盘接P0

uchar keys();

//键号函数,将键转换为对应的0~F的数值。

uchar nkey();

//T2为 键盘按键延时消颤,

void init_T2();

//数据处理函数

void dataprocess(uchar k);

//

void send(uchar* pbuf);

 

void main()

{

  //

  uchar flag;

  //

  uchar k1,k;

  //初始化T2

  init_T2();

  //初始化串口

  init_comm();

  //开总中断

  EA=1;

  flag=0;

  //处理键值

  while(1)

  {

     if(kin==1)

     {

        //关T2中断

        ET2=0;       

        //标志复位

        kin=0;

        kd=0;

        //数据处理

        P1=~kbuf;

        ET2=1;

        //连续按相同按键,只发送1此键值

        if(flag==0)

        {

          //程序第一次发送键值

          flag=1;

          //记录发送键值

          k=kbuf;

          k1=k;

          //键值发送

          dataprocess(k);

        }

        if(flag==1)

        {

          //第一次以后发送键值

          k=kbuf;

          if(k!=k1)

          {

             k1=k;

             //键值发送

             ES=0;

             dataprocess(k);

             ES=1;

          }

        }

        ET2=1;

     }

  }

 

}

//初始化T2

void init_T2()

{

    //T2默认自动重载方式,T1作波特率发生器

  //时间常数 ,f=11.0592,延时10ms ,

  //计数器需记数9216个脉冲,延时10ms,

  TL2=0x00; 

  TH2=0xdc;

  RCAP2L=0x00;

  RCAP2H=0xdc;

  //开T2中断

  ET2=1;

  //启动T2

  TR2=1; 

}

 

//T2的中断程序,功能对各标志位赋值,保存键值

void timer2() interrupt 5

{

  //复位中断标志,为下一次中断

  TF2=0;

 

  //判断有键按下

  if(keys()==1)  //有键按下

  {

     if(kd==1)  //延时去抖动

     {                                        

        //10ms后,检测键还是按下, 保存键值

        //如果上次输入键值处理完毕

        if(kin==0)

        {

           kin=1;

          kbuf=nkey(); //键值保存到kbuf中,此时按键处于稳定按下时期。         

        } 

     }

     //第一次检查到键按下

     else

        kd=1;

  }

  //每次检测有键没有键按下,kd复位

  else

  {

     kd=0;

     kin=0;

  }

}

//判断是否有键按下,

//有键按下返回1,无键按下返回0

//16位键盘接P0

uchar keys()

{

  //如果设置:char a ,程序始终返回1.

  uchar a;

  P0=0xf0;

  a=P0;

  if(a==0xf0)          

     return 0;

  else

     return 1; 

}

 

uchar nkey()

{

  uchar high,low,key,i;

  P0=0xf0;

  high=P0;

  P0=0x0f;

  low=P0;

  key=high|low;

  for(i=0;i<16;i++)

  {

     if(key==kcode[i])

     return i;    

  }    

}

 

//T1初始化,f=11.0592,baud=9600

void init_comm()

{

  //

  flag=0;

  //串口工作方式1,允许串口接收

  SCON=0x50;

  //T1工作方式2 ,自动重载8位计数器

  TMOD=0x20;

  //T1时间常数

  TH1=0xfd;

  TL1=0xfd;

  //开串口中断

  ES=1;

  //启动T1

  TR1=1;

}

 

//串口中断程序

void commfun() interrupt 4

{

  //处理接收

  if(RI)

  {    

     RI=0;

  }

 

  //处理发送

}

//数据处理函数

void dataprocess(uchar k)

{

  switch(k)

  {

     case 0:

     send(buf0);

     break;

 

     case 1:

     send(buf1);

     break;

 

     case 2:

     send(buf2);

     break;

 

     case 3:

     send(buf3);

     break;

     case 4:

     send(buf4);

     break;

  }

}

void send(uchar* pbuf)

{

  while(*pbuf!=0x00)

  {                      

     SBUF=*pbuf;

     //发送完成,TI=1

     while(TI==0);

     TI=0;

     pbuf++;

 

  }    

}

关键字:c51  串口通信  按键发送  字符串 引用地址:c51:串口通信,按键发送字符串

上一篇:51单片机外部中断的问题
下一篇:c51: 16位键盘程序1

推荐阅读最新更新时间:2024-03-16 15:15

PIC单片机精通_串口通信模块C实现
1.串口通讯头/定义文件 usart.h #ifndef _SERIAL_H_ #define _SERIAL_H_ #define BAUD 9600 #define FOSC 9216000L #define NINE 0 /* Use 9bit communication? FALSE=8bit */ #define DIVIDER ((int)(FOSC/(16UL * BAUD) -1)) #define HIGH_SPEED 1 #if NINE == 1 #define NINE_BITS 0x40 #else #define NINE_BITS 0 #endif #if HIG
[单片机]
单片机通过串口通信调整时间的程序
本程序所用的原理图下载: 点这里 ,单片机芯片使用的stc89c51;找到时钟部分的原理图修改为你自己的电路上的io即可.这是一整个单片机开发板的电路图其他的忽略. /**************************通过串口通信调整时间******************************/ /** *功能:单片机开始上电时点阵显示倒计时3,2,1,0,然后点阵LED关闭显示 * 定时器和串口开始工作,定时器开始一秒计时,并在数码管上显示时,分,秒 * 此计时器可以通过串口发送数据调整时间,可调整时与分,当调整分钟时秒清零 * 附加功能:当单片机收到数据时有蜂鸣器响一声作为提示 * 彩色流水灯以20毫秒的速度向
[单片机]
Linux下ARM和单片机的串口通信设计
  0 引言   数据采集系统中由于单片机侧重于控制,数据处理能力较弱,对采集的数据进行运算处理比较繁琐,如果通过串口与上位机通信,利用上位机强大的数据处理能力和友好的控制界面对数据进行处理和显示则可以提高设计效率。串口通信以其简单的硬件连接,成熟的通信协议,成为上下位机之间通信的首选。移植了Linux 操作系统的s3c2440 可以在Linux 环境下操作串口,降低了串口操作的难度,可以使开发者集中精力开发大规模的应用程序,而不必在操作底层设计上耗费时间。   1 硬件连接   s3c2440 是三星公司生产的基于ARM9 核的处理器,采用3.3 V 电压供电; C8051Fxxx 系列单片机是美国CYGNAL 公司推出的与
[单片机]
Linux下ARM和单片机的<font color='red'>串口通信</font>设计
STM8 I口模拟串口通信
使用普通的IO口,模拟串口协议, 和PC端串口调试软件实现通信。 网上找了很多资料,有很多网友有些程序,但是感觉都不是很完整,无意间看到ST官方居然有实现,直接下载代码开始用。 针对官方的IO口模拟串口软件,简单介绍下用到资源。 由于模拟的串口RX脚,对于电平的输入判断用到定时器的输入捕获功能,所以官方用的是定时器3的通道2。 我自己在STM8S003F3P6最小系统上,移植到了TIM2的CH1即PD4用来做串口的RX脚,和PC端串口调试器的TX脚连接。 模拟串口的TX脚没有特殊要求,我这里用的PD3。。。。 修改了MAIN里面的函数,实现模拟串口直接发送接收到的数据。 PPS,关于串口波特率的配置,
[单片机]
基于AVR单片机的实验加载闭环控制系统
分离式液压千斤顶在生产建设、科学实验等各类工程结构加载工作中具有广泛的用途。 该设备一般由电动高压油泵+压(拉)千斤顶组成,本文论及的加载系统规格如表1所示。 油泵电机直接带动泵轴旋转,柱塞作往复运动,进油阀/排油阀工作,液压油通过高压油管进入千斤顶。用户可通过泵站上的手柄,人工转动泵内卸荷阀处于不同位置,实现系统的加载/卸载、推力/拉力及加载速率和稳压作业。 在对力和位移数值或稳压时间等精度要求较高的科研实验加载场合,显然这种仅靠手工操作的方式难以胜任。给该设备增设电脑测控系统就成为一项与时俱进的技术革新,也是提高此类设备性价比的最佳方案。 1 下位机 由ATmega128构成下位机控制核心(见图1),其
[单片机]
基于AVR单片机的实验加载闭环控制系统
C51单片机与PC串口通信的单片机部分程序
注意波特率是9600 功能:电脑通过串口给单片机发一个字节,单片机收到后又给电脑发回去 、#include #define uchar unsigned char #define uint unsigned int uint temp; bit flag; void init_ser1(); main() { init_ser1(); while(1) { if(RI==1) { P1=SBUF; RI=0; } if(flag==1) { ES=0;//暂时关闭接收 flag=0; SBUF=temp; while(!TI);//等待发送完毕 TI=0; ES=1; } } } void sel() interrup
[单片机]
ISD4004语音芯片C51驱动程序源代码
ISD4004语音芯片C51驱动程序源代码 /*spi isd4004.h*/ #include reg51.h #include intrins.h sbit _cs = p0^0; sbit _sclk= p0^3; sbit _mosi= p0^1; sbit _miso= p0^2; sbit _rac = p0^4; sbit _int = p0^5; void delay(unsigned int i) //延时程序 { while(i--); } void stopmode() //停止 { unsigned char m,i,j; _cs=1; _sclk=0; _cs=0; m=0x30; for(i=0;i
[单片机]
一种电动天窗耐久性测试系统的研制与开发
1 概述   汽车天窗是为满足消费者乘车健康和舒适度的要求而设计的,因此人们对天窗性能的要求不仅仅停留在美观、豪华上,还必须满足安全、可靠、运行自如等全方位的要求。所以,在汽车天窗装车前要首先对其进行耐久性和安全性测试,以确保其装车后符合技术和用户的要求。而现有汽车天窗存在行程不到位,天窗打不开;行程不到位,天窗关不严,对汽车防盗防雨构成威胁;控制开关失灵,出现夹人现象等隐患和问题。   目前,国内天窗测试大都采用单机式的下位机系统。该类系统虽能进行常规测试,但不能记录或反馈测试信息。我们设计的汽车天窗测试系统分上、下位机,下位机具有控制天窗的执行机构,不但可以控制天窗的往返等动作,完成测试项目,而且还具备自动辨别故障功能
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved