第六章 单片机应用系统设计实例

61
第第第 第第第第第第 第第第第 6.1 8051 第第第第第第第第第第第第 6.2 第第第第第第第 6.3 第第第第第第第 6.4 第第第第第第第 6.5 第第第第第 第第

description

第六章 单片机应用系统设计实例. 6.1 8051 系列单片机实现计算器功能 6.2 简易波形发生器 6.3 简易广告屏设计 6.4 寻迹小车的设计 6.5 无线呼叫系统设计. 6.1 8051 单片机实现计算器功能. 一 设计目标和实现方法. 满足计算器要求,进行加减乘除运算; 打开计数器时,初始显示数字为 0123 ; 实现简单的数据运算,不支持连续运算; 仿真和调试要用到 Protues 和 Keil 软件。. 二 方案论证与设计. - PowerPoint PPT Presentation

Transcript of 第六章 单片机应用系统设计实例

Page 1: 第六章  单片机应用系统设计实例

第六章 单片机应用系统设计实例

6.1 8051 系列单片机实现计算器功能6.2 简易波形发生器6.3 简易广告屏设计6.4 寻迹小车的设计6.5 无线呼叫系统设计

Page 2: 第六章  单片机应用系统设计实例
Page 3: 第六章  单片机应用系统设计实例

6.1 8051 单片机实现计算器功能

一 设计目标和实现方法

满足计算器要求,进行加减乘除运算; 打开计数器时,初始显示数字为 0123 ; 实现简单的数据运算,不支持连续运算; 仿真和调试要用到 Protues 和 Keil 软

件。

Page 4: 第六章  单片机应用系统设计实例

二 方案论证与设计键盘包括 0到 9 十个数字键 , 加减乘除四个

符 号键 , 清除键和等号键,共 16 个按键 ;键盘选用 4x4 行列式键盘结构(如下图);输入模块:键盘扫描;数字大小范围为 4 位, 选用 4个 LED 数码管 显示数据和结果;

Page 5: 第六章  单片机应用系统设计实例

三 硬件电路设计( 1 )主要器件:采用 8051 单片机 , 它能够满足数据的采集、控制和数据处理的需求 , 显示用输入采用按键方式的 4 段 LED 数码管;( 2 )功能和操作:加减乘除运算和显示。步骤如下:① 上电后 , 屏幕初始化 , 显示初始数值 0123 ;② 计算。依次数字键 , 符号键 , 数字键 , 等号键,屏幕上显示出计算结果;③ 如果要再次计算 , 可以按下“ on/c” 键清 0 ,或者按下单片机的复位键 , 重新初始化。

Page 6: 第六章  单片机应用系统设计实例

四 软件设计模块化程序设计是单片机应用中最常用的

程序设计方法;模块化程序设计的中心思想是把一个复杂

应用程序按整体功能划分成若干相对独立的程序模块 , 各模块可以单独 设计 , 编程和调试 , 然后组合起来;

本系统的程序模块主要分为主程序,键值获取程序和处理子程序等,其流程图分别如下图所示:

Page 7: 第六章  单片机应用系统设计实例

主程序流程图 定时中断子程序流程图

按键处理子程序流程图

Page 8: 第六章  单片机应用系统设计实例

主程序:void main(){ inint();while(1){ if(key)pkey();}}按键处理子程序:void pkey() {switch(key) { case zero: modify_LED(0);break; case one: modify_LED(1);break; case two: modify_LED(2);break; case three: modify_LED(3);break; case four: modify_LED(4);break; case five: modify_LED(5);break; case six: modify_LED(6);break;

Page 9: 第六章  单片机应用系统设计实例

case seven: modify_LED(7);break; case eight: modify_LED(8);break; case nine: modify_LED(9);break; case clear: key_ptr=3;modify_LED(17);op1=op2=0;break; case add: key_ptr=3;modify_LED(10);break; case sub: key_ptr=3;modify_LED(11);break; case mux: key_ptr=3;modify_LED(12);break; case div: key_ptr=3;modify_LED(13);break; case equ: key_ptr=3;modify_LED(14);break; default:break; } key=0;}void modify_LED(uchar x){ if(key_ptr==3){LED[0]=LED[1]=LED[2]=space;} else {LED[0]=LED[1]; LED[1]=LED[2];LED[2]=LED[3];}

Page 10: 第六章  单片机应用系统设计实例

LED[3]=x;key_ptr--; if(x<=9&&x>=0) op1=op1*10+x; else if(x>=10&&x<=13) { LED[0]=LED[1]=LED[2]=LED[3]=space;

key_ptr=3; op2=op1;op1=0; switch(x)

{ case 10: op3='+';break; case 11: op3='-';break;

case 12: op3='*';break; case 13: op3='/';break; default:break; }

} else if(x==14) {switch(op3) {case '+': op2=op1+op2;break;

Page 11: 第六章  单片机应用系统设计实例

case '-': op2=op2-op1;break; case '*': op2=op1*op2;break; case '/': op2=op2/op1;break; default:break; } result_pr(); } key_ptr&=0x03;}

Page 12: 第六章  单片机应用系统设计实例

定时中断子程序:void timer0() interrupt TF0_VECTOR // 中断检测键盘键值{ TH0=(65536-2500)>>8; TL0=(65536-2500)&0xff; if((key_port&0xf0)!=0xf0) // 有键按下 {if(key_port==xkey) { ckey++; // 去抖动 if(ckey>10)

{key=xkey; ckey=0;}}

else {xkey= key_port;

ckey=0;}} wx_port=0xff;

dm_port=dm[LED[wx_ptr]]; // 更新段码

Page 13: 第六章  单片机应用系统设计实例

wx_port^=(1<<wx_ptr); // 更新位选 wx_ptr++;wx_ptr&=3; // 指向下一位}

Page 14: 第六章  单片机应用系统设计实例

6.2 简易波形发生器设计 波形发生器是一种在测量、控制领域经常要使用到的信号发生装置,可以按照要求输出相应波形。其主要功能如下:

① 输出波形可调;②输出复制和频率可调。 设计思路:以正弦波为例 , 一条正弦波曲线可

以看做是一个个点的集合 , 我们可以按照一定的时间间隔输出这些点的电压值 , 在输出端就可以得到一个正弦波 , 时间间隔越小 , 输出的波形就越接近一个正弦波。

Page 15: 第六章  单片机应用系统设计实例

一 硬件设计

这个实现方案使用了以下元器件: ① 主控单元: AT89s52 单片机; ② 显示界面:液晶屏幕 lcd1602 ; ③ 功能电路: 8 分辨率 D/A 转换芯片DAC0832, 运算放大器 , 与非门 , 按键等。

Page 16: 第六章  单片机应用系统设计实例

简易波形发生器原理图

Page 17: 第六章  单片机应用系统设计实例

在上原理图中:•P1 口作为 LCD1602 的数据输入总线;•P2.2~2.4 作为 LCD1602 的读 /写 , 使能控制线;•P2.0~2.1 作为 DAC0832 的控制线;•P0 口作为 DAC0832 的数据输入总线;•4 个按键分别控制波形选择 , 频率 +, 频率 -, 在 DAC0832 的输出端外接 TL082 集成运算放大 器 , 控制输出波形的幅值。

Page 18: 第六章  单片机应用系统设计实例

DAC0832是 8 分辨率的 D/A 转换集成芯片 ,由8 位输入锁存器 ,8位 DAC寄存器 ,8位 D/A 转换电路及转换控制电路构成。其引脚功能如下:•D0~D7: 8 位数据输入线 ,TTL 电平 ,有效时间>90ns ;•ILE :数据锁存允许控制信号输入线 ,高电平有效;•CS :片选信号输入线 ,低电平有效;•WR1 :数据锁存器写选通输入线 ,负脉冲有效; •XFER :数据传输控制信号输入线 ,低电平有效;•WR2: DAC寄存器选通输入线,负脉冲有效;•IOUT1 :电流输出端 1, 其值随 DAC寄存器的内容线性 变化;•IOUT2 :电流输出端 2, 其值与 IOUT1 值之和为一常数;   

Page 19: 第六章  单片机应用系统设计实例

•Rfb :反馈信号输入线 ,改变 Rfb 端外接电阻值可调 整转换满量程精度; •Vcc :电源输入端 ,Vcc 的范围 为 +5V~+15V ;  •VREF :基准电压输入线 ,VREF 的范围 -10V~+10V ;•AGND :模拟信号地 •DGND :数字信号地 

DAC0832 管脚图

Page 20: 第六章  单片机应用系统设计实例

二 软件设计

主程序流程图 外部中断子程序流程图

定时器中断子程序流程图

Page 21: 第六章  单片机应用系统设计实例

主要程序举例正弦波离散输出表:uchar code sine_tab[256]={

// 输出电压从 0 到最大值(正弦波 1/4 部分)

0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,

0xbf,0xc2,0xc5,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,

0xee,0xef,0xf1,0xf2,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,

// 输出电压从最大值到 0 (正弦波 1/4 部分)

0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,

Page 22: 第六章  单片机应用系统设计实例

0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,

0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99 ,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,

// 输出电压从 0 到最小值(正弦波 1/4 部分)

0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,0x4e,0x4c,0x48,0x45,0x43,

0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16 ,0x15,0x13,

0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,

Page 23: 第六章  单片机应用系统设计实例

// 输出电压从最小值到 0 (正弦波 1/4 部分)

0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,

0x11,0x13,0x15 ,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,

0x40,0x43,0x45,0x48,0x4c,0x4e,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80};

正弦波输出程序:#define DAdata P0 //DA 数据端口void sine_out() // 正弦波输出{ DAdata=sine_tab[wavecount++];

DA_S1=0; // 打开 8 位输入寄存器DA_S1=1; // 关闭 8 位输入寄存器

}

Page 24: 第六章  单片机应用系统设计实例

主程序:void main(){uchar i=0; DA_S2=0; //使 DAC 寄存器处于直通状态 DAdata=0; DA_S1=1; // 关闭 8 位输入寄存器 init_lcd();waveform=0; TMOD=0x01; // 设置定时器 0为 16 位工作方式 IT0=1; // 设置外部中断 0 为下降沿触发 ET0=1; // 开定时器中断 EX0=1; EA=1; while(1) {}}

Page 25: 第六章  单片机应用系统设计实例

定时中断子程序:void timer0() interrupt 1{

TH0=THtemp;TL0=TLtemp;if(waveform==0) sine_out();else if(waveform==1) triangle_out();else if(waveform==2) square_out();

}

Page 26: 第六章  单片机应用系统设计实例

外部中断子程序:void key_int0() interrupt 0{uchar keytemp; uint total_freq; // 总频率 EA=0; TR0=0; // 关总中断与定时器 delay(5); // 延时 if(key==0) // 有按键按下而引发中断 {keytemp=P3&0xf0; // 检测按键状态 switch(keytemp) { case 0xe0: // 选择波形 waveform++; if(waveform>2) waveform=0;

break; case 0xd0: wavefreq[waveform]++; if(wavefreq[waveform]>10) wavefreq[waveform]=1;

break;

Page 27: 第六章  单片机应用系统设计实例

case 0xb0: wavefreq[waveform]--; if(wavefreq[waveform]<1) wavefreq[waveform]=10; break; case 0x70: DA_S2=1; break;}THtemp=waveTH[waveform*10+(wavefreq[waveform]-1)]; // 方括号中选取第几个数后,并把该值赋给 T_tempTLtemp=waveTL[waveform*10+(wavefreq[waveform]-1)]; total_freq= wavefreq[waveform] * freq_unit[waveform]; lcd_hang2[5]=total_freq%10+0x30; total_freq/=10; lcd_hang2[4]=total_freq%10+0x30; total_freq/=10; lcd_hang2[3]=total_freq%10+0x30; total_freq/=10; lcd_hang2[2]=total_freq%10+0x30; disp_lcd(0x80,&lcd_hang1[waveform*16]); // 在第一行显示

Page 28: 第六章  单片机应用系统设计实例

disp_lcd(0xc0,lcd_hang2); // 在第二行显示}wavecount=0; // 计数清零while(!key);EA=1; TR0=1; // 开启中断与定时器

}

Page 29: 第六章  单片机应用系统设计实例
Page 30: 第六章  单片机应用系统设计实例

6.3 简易广告屏设计

设计要求:基于 51 单片机设计一个电子广告 牌 , 其功能是滚动显示一串字符。 设计思路:选用了 8个 LED 点阵 , 组成一个大的 16*64的 LED 点阵。使用分时控制 方法 , 用同一数据总线来控制 8 个 点阵的显示 , 减少对 IO 端口的需求。

Page 31: 第六章  单片机应用系统设计实例

一 硬件设计 右图是一个 8*8的集成 LED 点阵 ,该点阵有 16 个引脚 ,8个引脚控制点阵每行的选中,另外 8 个引脚控制点阵每列的选中 ,通过这 16 个引脚来控制点阵上每一个 LED 的亮灭。

Page 32: 第六章  单片机应用系统设计实例

16X64LED 点阵的广告屏电路

Page 33: 第六章  单片机应用系统设计实例

在上原理图中: 使用 P2.7,P2.6,P2.5通过与非门连接 3片74273 作为片选引脚。则在某一时刻内我们可以只选通其中一片 D触发器,发送数据,图中的两片 D触发器对显示屏上 LED每行的选通进行控制。 D触发器上使用了六个端口,其中四根线接到 4-16译码芯片上控制每列的选通,另外两根线控制 4 片译码器的选通,则可以实现对4*16=64列 LED 的选通控制。

Page 34: 第六章  单片机应用系统设计实例

二 软件设计

要在 LED 屏上显示汉字 ,首先要取得汉字的字模 , 本方案一个汉字所需要的存储空间是 32 个字节。我们可以定义一个数组来存储这个字模,如“武”的字模为: char list[]={0x20,0x20,0x20,0x60,0x24,0x3F,0x24,0x20, 0x24,0x20,0xE4,0x1F,0x26,0x11,0x24,0x11, 0x20,0x10,0xFF,0x03,0x20,0x1C,0x22,0x20, 0x2C,0x40,0x20,0x80,0x20,0xE0,0x00,0x00}

Page 35: 第六章  单片机应用系统设计实例

我们使用软件生成了所需汉字的字模之后,将这些字模存入程序的数组,运行程序,调用这些数组,这些汉字就显示在屏幕上了。程序流程图如右图所示:

Page 36: 第六章  单片机应用系统设计实例

主要程序:#define hang0 XBYTE[0X7FFF] // 定义端口#define hang1 XBYTE[0XbFFF]#define lie XBYTE[0XDFFF]void main() {uchar i,j,k; uint b=0; uchar a; // 控制移动间隔时间while(1) {j=0; if(a>1) // 移动间隔时间;取值 0--255 {a=0; b+=2; if(b>=512) {b=0; for(i=0;i<64;i++) {lie=i;hang0=0x00; hang1=0x00; }}

Page 37: 第六章  单片机应用系统设计实例

for(i=0;i<64;i++) {lie=i; for(k=0;k<5;k++) {hang0=table[j+b]; hang1=table[j+b+1]; delay(2); hang0=0x00; hang1=0x00; } // 清屏 j+=2; } a++; }}

Page 38: 第六章  单片机应用系统设计实例
Page 39: 第六章  单片机应用系统设计实例

6.4 寻迹小车的设计一 功能介绍 本循迹小车将实现自动寻迹并沿黑线走向行进的功能。 小车由前后两个电机分别控制前轮转弯及后轮前进驱动,其中前轮由小型舵机带动,使得系统减少了机械部分设计,使小车的转向控制数字化,易于单片机进行控制。后轮使用普通直流电机,通过 PWM 信号调节小车前进车速。

Page 40: 第六章  单片机应用系统设计实例

系统原理图

Page 41: 第六章  单片机应用系统设计实例

二 硬件介绍( 1) 舵机简介

舵机是一种位置伺服的驱动器,适用于角度不断变化并可以保持的控制系统。小型舵机的工作电压一般为 4.8V或 6V ,转速一般为 0.22/60度或 0.18/60度。

Page 42: 第六章  单片机应用系统设计实例

工作原理:•控制信号进入信号调制芯片 , 获得直流偏置电压;•基准电路产生周期 20ms,宽度 1.5ms 的基准信号;•将直流偏置电压与电位器的电压比较获得电压差输出;•最后 , 电压差的正负输出到电机驱动芯片决定电机的正反转;•以 180度角度伺服为例,对应的控制关系是:    0.5ms--------------0度; 2.0ms-----------135度;    1.0ms------------45度; 2.5ms-----------180度;    1.5ms------------90度;

Page 43: 第六章  单片机应用系统设计实例

( 2) 黑线检测传感器的介绍 小车黑线检测用红外发射对管作为传感器。

其工作原理为:发射端发射红外光,接收端接收物体反射信号,因为各种颜色对光的吸收和反射程度不同,黑色吸收红外光,使得反射信号很弱,而白色反射红外光使得反射信号相对发射信号损耗不大,接收端再将反射信号转换为相应的电压信号。传感器的接收信号再经过信号处理电路(如下页图)输送给单片机。

Page 44: 第六章  单片机应用系统设计实例

黑线信号检测电路

Page 45: 第六章  单片机应用系统设计实例

( 3) 电机驱动原理简介 小车后轮采用小型直流电机,采用 PWM 信号驱动 L298N 电机驱动芯片进行控制。 L298N 为双全桥步进电机专用驱动芯片,内部包含 4 信道逻辑驱动电路 , 是一种二相 和四相步进电机的专用驱动器 , 可同时驱动 2 个二相或 1 个四相步进电机。 此芯片可直接由单片机的 IO 端口来提供模拟时序信号,其电机驱动基本原理如下页图所示。

Page 46: 第六章  单片机应用系统设计实例

电机驱动电路

Page 47: 第六章  单片机应用系统设计实例

三 软件程序介绍 程序初始化

初始化T0、T1,产生PWM

黑线检测信号状态是否正前方?

更改T0计数初始值

更改行进状态以追踪黑线

N

直线行走继续追踪黑线

Y

这次设计由于单片机 89S52内部不带有 PWM 生成模块,故采用定时器与端口电平翻转来实现 PWM 。 右图是小车运行的程序流程图。

Page 48: 第六章  单片机应用系统设计实例

主程序:main(){uchar receive,ek1=7,ek2=7; pulse=0;highh=(uchar)((16384-high)/256+192); highl=(uchar)((16384-high)%256); lowh=(uchar)(high/256+200);lowl=(uchar)(high%256);IE=0x8a; TMOD=0x11; TH0=0x00; TL0=0x00; TH1=0x00;TL1=0x00;TR0=1; // 启动 T0TR1=1; // 启动 T1

Page 49: 第六章  单片机应用系统设计实例

for(;;){ /* for(i=0;i<1000;i++); */ receive=P2; } switch(receive) // 根据采集到的值进行判断{case 0x7f:ek1=0;break; //0111 1111case 0x3f:ek1=1;break; //0011 1111case 0xbf:ek1=2;break; //1011 1111case 0x9f:ek1=3;break; //1001 1111case 0xdf:ek1=4;break; //1101 1111case 0xcf:ek1=5;break; //1100 1111case 0xef:ek1=6;break; //1110 1111case 0xe7:ek1=7;break; //1110 0111case 0xf7:ek1=8;break; //1111 0111

Page 50: 第六章  单片机应用系统设计实例

case 0xf3:ek1=9;break; //1111 0011case 0xfb:ek1=10;break; //1111 1011case 0xf9:ek1=11;break; //1111 1001case 0xfd:ek1=12;break; //1111 1101case 0xfc:ek1=13;break; //1111 1100case 0xfe:ek1=14;break; //1111 1110default: ek1=15;break; //1111 1111}if(ek1==15) ek1=ek2; // 计算控制量 else b=90*ek1+middle-45*ek2-315; if(b>1120) b=1120;if(b<710) b=710ek2=ek1}void interrupt_t0(void) interrupt 1

Page 51: 第六章  单片机应用系统设计实例

{if(flag1==0){ TH0=(uchar)((16384-b)/256+192); TL0=(uchar)((16384-b)%256);a=b;flag1=1;rudder=1;}else{TH0=(uchar)(a/256+184); TL0=(uchar)(a%256rudder=0;flag1=0;}TF0=0;TF1=0;}void interrupt_t1(void) interrupt 3{if(flag2==0){TH1=highh; TL1=highl; pulse=1; //P1.1 管脚电平跳变flag2=1;

Page 52: 第六章  单片机应用系统设计实例

}else{TH1=lowh;TL1=lowl;pulse=0; //P1.1 管脚电平跳变flag2=0;}TF1=0;TF0=0;}

Page 53: 第六章  单片机应用系统设计实例
Page 54: 第六章  单片机应用系统设计实例

6.5 无线呼叫系统设计一 硬件设计

本系统采用 nrf2401 作为无线呼叫功能芯片,进行无线数据传输。

Page 55: 第六章  单片机应用系统设计实例

nRF2401 是单片射频收发芯片,工作于2.4~2.5GHz ISM 频段,芯片内置频率合成器、功率放大器、晶体振荡器和调制器等功能模块,输出功率和通信频道可通过程序进行配置。 芯片能耗非常低,以 -5dBm 的功率发射时,工作电流只有 10.5mA ,接收时工作电流只有 18mA ,多种低功率工作模式,节能设计更方便。其 DuoCeiverTM技术使 nRF2401可以使用同一天线,同时接收两个不同频道的数据。 nRF2401适用于多种无线通信的场合。

Page 56: 第六章  单片机应用系统设计实例

二 软件设计

无线呼叫系统的软件设计分为三个模块,包括主程序, nRF2401 发送模块和nRF2401 接收模块,相关的流程图如下:

Page 57: 第六章  单片机应用系统设计实例

 nRF2401 ShockBurst 方式发送流程图和接收流程图

Page 58: 第六章  单片机应用系统设计实例

主程序:void main(void) { delayms(1000); // 开机延时   nRF2401_Data[0] = 0;     init_rs232();   // 串口初始化      TI=1;           // 串口发射有效   nRF2401_config(); //nRF2401 初始化配置 delayms(100);  speakertest();   // 蜂鸣器叫一声   nRF2401_Transmit_Mode();      // 设置为发送模式   nRF2401_Transmit_Data(nRF2401_Data); // 发送测试数据   nRF2401_Receive_Mode();  // 设置为接收模式   SBUF=0x55; // 串口输出 0x55  测试是否有正确的串口数据   delayms(100);

Page 59: 第六章  单片机应用系统设计实例

 while (1)  { nRF2401_Receive_Data(nRF2401_Data);  if (nRF2401_flag&0x01==0x01)  // 判断是否有数据收到    { P0=~nRF2401_Data[0]; SBUF=nRF2401_Data[0];     }   keytest();   // 调用按键子程序,无线发送数据    } }

Page 60: 第六章  单片机应用系统设计实例

发送数据子程序void nRF2401_Transmit_Data(uchar TxBuf[]) { uchar i;  nRF2401_CE=1; delayms(1);  for (i=0;i< (ADDR_W/8);i++) // 写入接收地址 ( 按字节对齐 )  { nRF2401_Write_Byte(Channel_Addr[i]); }  for (i=0;i<(DATA1_W/8);i++) // 写入需要发送的数据  { nRF2401_Write_Byte(TxBuf[i]); }  nRF2401_CE=0;  //nRF2401_CE  置低使发送有效   delayms(1); }

Page 61: 第六章  单片机应用系统设计实例

接收数据子程序void nRF2401_Receive_Data(uchar *data_temp) { uchar i;  if (DR1==1)  // 接收完毕后, DR1 自动为0  datasheet(page28 of 37);  {   for (i=0; i<DATA1_W/8; i++)   { *data_temp=nRF2401_Read_Byte();data_temp++; }   nRF2401_flag|=0x01; // 接收标志位 nRF2401_flag_bit0=1  }  else {nRF2401_flag&=0xfe;}// 接收标志位nRF2401_flag_bit0=0 }