c51-c51 间通信控制

发布者:不懂之人最新更新时间:2016-10-13 来源: elecfans关键字:c51  通信控制 手机看文章 扫描二维码
随时随地手机看文章
/*
c51A:键盘控制发送字符串“open","close"等,
c51B:接收字符串,根据字符串发出控制命令。
*/
 
//c51A程序
 
/*
发送机程序,程序功能:
1.参数 f=12MHZ,baud=1200
2.串口中断方式:发送字符串存放字符数组tran_buf[]中
2.发送字符串由16位键盘控制。由T2定时中断,每10ms扫描一次键盘。不同按键发送不同字符串。
 
*/
 
#include"reg52.h"
#include"string.h"
 
 
#define uchar unsigned char
 
//发送字符串缓存
uchar tran_buf[10];
 
 
uchar tnum=0;
 
 
//串口初始化
void init();
 
//发送字符串
void transmit(uchar *str);
 
//T2 初始化设置,10ms一次中断,扫描键盘。
//t=(2^16-T)*f/12
//t:定时器延时。
//T:时间常数。
//由 f=12MHZ,t=10ms
//得:T=2^16-10^4=55536=0xd8f0;
void init_t2();
 
//定义全局变量,
uchar kd;   //kd=1表示键闭合,并已经过10ms延时去抖动,已处于稳定状态;
uchar kin;  //kin=1表示键值已读到kbuf中,等待处理。
uchar kp;   //kp=1表示kbuf中的数据已处理。
 
 
//存放键值
uchar kbuf;
 
//
//16位键盘接P0口,判断是否有键按下,
//有键按下返回1,无键按下返回0
uchar keys();
 
//键号函数,将键转换为对应的0~F的数值。
uchar nkey();
 
//16位键盘行翻转法对应键值。
uchar code kcode[]={
0x77,0x7b,0x7d,0x7e,
0xb7,0xbb,0xbd,0xbe,
0xd7,0xdb,0xdd,0xde,
0xe7,0xeb,0xed,0xee};
 
uchar open[]={0x6f,0x70,0x65,0x6e,0x00};  //6f 70 65 6e 00
uchar close[]={0x63,0x6c,0x6f,0x73,0x65,0x00}; //63 6c 6f 73 65 00
 
 
void main()
{
uchar i,j,k;
init();
init_t2();
 
while(1)
{
//如果kbuf中用数据,且未处理。
if((kin==1)& (kp==1))
{
P1=~kbuf;  //P1显示键值。
switch(kbuf)
{
case 0 : transmit(open);break;
case 1 : transmit("click 1");break;
case 2 : transmit("click 2");break;
case 3 : transmit("click 3");break;
case 4 : transmit("click 4");break;
case 5 : transmit("click 5");break;
case 6 : transmit("click 6");break;
case 7 : transmit("click 7");break;
case 8 : transmit("click 8");break;
case 9 : transmit("click 9");break;
case 10: transmit("click 10");break;
case 11: transmit("click 11");break;
case 12: transmit("click 12");break;
case 13: transmit("click 13");break;
case 14: transmit("click 14");break;
case 15: transmit(close);break;
default:P1=0;
}
 
for(i=0;i<3;i++)
{
for(j=0;j<255;j++)
for(k=0;k<255;k++);
}
 
 
kd=0;
kin=0; 
kp=0; 
}
 
 
 
}
 
 
 
 
 
     
}
 
//T1工作方式2,作波特率发生器,f=12MHZ,baud=1200,TH=0xe6;
void init()
{
//T1方式2作波特率,
TMOD=0x20;
//串口方式1,允许接收设置
SCON=0x50;
//计算常数
TH1=0xe6;
TL1=0xe6;
//启动
TR1=1;
//开中断
EA=1;
ES=1;
 
}
 
void serial() interrupt 4
{
if(TI==1)
{
TI=0;
tnum++;
 
if(tnum>10)
return;
 
if(tran_buf[tnum]!='\0')
SBUF=tran_buf[tnum];
else
{
ES=0;
 
SBUF='\0';
while(TI==0);
TI=0;
ES=1;
 
 
}
}
 
}
 
//
void transmit(uchar *str)
{
strcpy(tran_buf,str);
 
tnum=0;
//发送tran_buf[]数组第一个字符,触发中断,由中断程序将其他字符发送。
SBUF=tran_buf[tnum];
 
}
 
void init_t2()
{
TL2=0xf0;  //时间常数
TH2=0xd8;
RCAP2L=0xf0;
RCAP2H=0xd8;
//开中断
EA=1;
ET2=1;
//启动T2
TR2=1;
 
}
 
 
//T2 中断程序,功能将键值存放在kbuf中。
void timer2() interrupt 5
{
//关中断标志
TF2=0;
//
if(keys()==1)  //有键按下
{
if(kd==1)  //延时去抖动
{
if(kin==0) //新键值未输入,
{
kin=1;
if(kp==0) //kbuf 中的数据已处理,kbuf空。
{
kbuf=nkey(); //键值保存到kbuf中,此时按键处于稳定按下时期。
kp=1;
}
}
}
else
kd=1;  //按键未延时去抖动。
}
else 
kd=0;
}
 
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;
}
 
 
}
 
 
 
//c51B程序
 
/*
接收机功能:
1.参数 f=12MHZ,baud=1200
2.串口中断方式:接收字符串存放字符数组rec_buf[]中。
3.不同的接收字符实现不同的控制功能
4、发送收到的字符串。
 
*/
 
#include"reg52.h"
#include"string.h"
 
 
#define uchar unsigned char
 
//接收字符串缓存
uchar rec_buf[10];
//uchar tran_buf[10];
 
uchar rnum=0;
//uchar tnum=0;
 
//串口初始化
void init();
 
//发送字符串
//void transmit(uchar *str);
 
 
//uchar open[]={0x6f,0x70,0x65,0x6e,0x00,0x00};  //6f 70 65 6e 00
//uchar close[]={0x63,0x6c,0x6f,0x73,0x65,0x00,0x00}; //63 6c 6f 73 65 00
 
 
void main()
{
 
init();
 
while(1)
{
 
//由接收字符串控制单片机
//如果 接收到字符串 open,则P1=0; 
//ascii:0x6f,0x70,0x65,0x6e,0x00
if(strcmp(rec_buf,"open")==0)
{
P1=0x00;
 
}
 
//如果 接收到字符串 close,则P1=1; 
//ascii:0x63,0x6c,0x6f,0x73,0x65,0x00
if(strcmp(rec_buf,"close")==0)
{
P1=0xff;
 
}
}
 
 
     
}
 
//T1工作方式2,作波特率发生器,f=12MHZ,baud=1200,TH=0xe6;
void init()
{
//T1方式2作波特率,
TMOD=0x20;
//串口方式1,允许接收设置
SCON=0x50;
//计算常数
TH1=0xe6;
TL1=0xe6;
//启动
TR1=1;
//开中断
EA=1;
ES=1;
 
}
 
void serial() interrupt 4
{
if(RI==1)
{
RI=0;
rec_buf[rnum]=SBUF;
 
if(rec_buf[rnum]!='\0')
rnum++;
else
{
rec_buf[rnum]='\0';
 
rnum=0;
 
//transmit(rec_buf);
}
 
 
}
 
 
}

关键字:c51  通信控制 引用地址:c51-c51 间通信控制

上一篇:C51:串口程序
下一篇:c51: 串口中断方式,收发字符串

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

c51单片机驱动AD9954的程序及调试
第一次用51单片机写AD9954程序,仔细读了一遍datasheet、并参考前面同学的示例程序之后,只简单的实现了单频输出(Single-tone Mode)。 一开始调试,先要正确控制SYNC_CLK,因为这个输出引脚就是内部DDS时钟的4分频(假设DDS时钟最高为400MHz,那么SYNC_CLK此时应当输出100MHz;反之,通常用SYNC_CLK来推测DDS系统时钟)。前提是必须复位Control Function Register No.1(CFR1:0x00)中的bit1(SYNC_CLK Disable)。 然后根据输入时钟的频率正确设置CFR2中的倍频系数REFCLK Multiplier和VCO Range(0
[单片机]
<font color='red'>c51</font>单片机驱动AD9954的程序及调试
c51:延时程序
#include reg52.h #define uchar unsigned char //f=11.0592 void delay(uchar ms) //约n(ms)延时 { int i; while(ms--) { i=97; while(i--); //循环1此约1ms } } main() { delay(1); delay(5); delay(10); delay(100); delay(1); //上述语句设置断点,观察sec参数,了解延时时间。 } /*约15ms延时 ,需较准确延时:
[单片机]
C51单总线时序图分析与底层编程配置(DS18B20为例)
前言 单片机与外设之间的数据通讯常用的主要有:I2C、SPI、SCI总线。 I2C:同步串行二线制(1时钟线1数据线) SPI:同步串行三线制(1时钟线1输入线1输出线) SCI:异步通讯(1输入线1输出线) 单总线:1根线,既有时钟,又有双向数据 提示:本章主要为了了解时序图及单总线操作原理 一、场景 示例:基于DSB18B20进行单总线通讯的底层配置,主要是看懂时序图,其它单总线器件原理相同。结合代码与时序图,相对容易理解点。 二、编程实现 1.初始化(复位) 检测是否存在单总线器件(若有则会返回一个低脉冲,无则一直是高电平)。 时序图如下: 代码如下(示例): bit SingleWireRst() {
[单片机]
<font color='red'>C51</font>单总线时序图分析与底层编程配置(DS18B20为例)
c51 bit使用
如i=0时,tab 的值为0x3f,那么这句bit_dat((bit)(tab &0x80));的作用是: 第一步:tab 与0x80作位与,即0x3f与0x80作位与(与0x40相位与就是取了第6位),这样的效果是取得了0x3f的最高位(第7位),其它位全部被屏蔽为0 第二步:作int向bit强制转换,向bit转换有一个规则,只要待转换前变量是非零,转换后的bit类型变量即为1,否则为0,这里,0x3f&0x80的结果为0,也就是((bit)(tab &0x80))的结果为0 第三步:调用bit_dat函数,向外设写入这一位。 后面的(bit_dat((bit)(tab &0x40))句子就是取次高位,后面的依此类推,就可以从高
[单片机]
I2C串行总线标准驱动程序(C51)
I2C串行总线标准驱动程序(C51)-万能程序 /*------------------------------------------------------------------------------------------ I2C.c 1.1b ===================================================================================*/ #i nclude reg51.h #i nclude intrins.h unsigned char SystemError; sbit SCL= P1^6; //定义串行时钟线所在口 使用时根据自己
[单片机]
4×4键盘C51单片机程序源码分享
/*MCU:AT89S52*/ #include #include #define uchar unsigned char int key; int del; void Key_Scan(void); /************主程序*************/ void main(void) { void Key_Scan(void); void delay(int); while(1) { Key_Scan(); delay(2000); } } /********矩键查寻键值4*4程序******/ void Key_Scan(void) { uchar readkey; uchar x_temp,y_temp; P
[单片机]
4×4键盘<font color='red'>C51</font>单片机程序源码分享
keil中C51关键字code用法
keil中关键字code说明 关键字code是51单片机特有关键字,用unsigned int 或signed char等定义的变量都存储在单片机的RAM中,程序中可以随意更改这些变量的值。而运用code关键字修饰下定义的变量,比如unsigned char code i;,它们则存储在单片机程序存储空间FLASH中,节省单片机RAM资源,但在程序中不能更改这些变量的值。
[单片机]
Keil C51精确延时程序设计
C语言具有较强的数据处理能力、语言功能齐全、使用灵活方便、开发效率高,被广泛应用于在单片机系统开发应用中。在单片机幕统开发的过程中,经常需要使用到延时程序,但C语言代码执行时间。的可预见性和实时性较差,在开发一些具有严格通信时序要求的系统时,往往需要反复调试延时代码,给开发者带来了较大困难。比如使用DS18B20进行温度测控时,必须按照其单总线通信协议,否则无法读取温度数据。针对上述问题,结合Keil C51开发工具和Proteus仿真软件,介绍在Keil C51开发系统中,利用C语言编写的延时程序设计及其运行的时间的计算方法。 1 常用延时程序的设计方法 1.1 利用定时器/计数器延时 利用C51单片机内部2个16位定时
[单片机]
Keil <font color='red'>C51</font>精确延时程序设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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