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

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

  • Upload
    kelton

  • View
    151

  • Download
    7

Embed Size (px)

DESCRIPTION

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

Citation preview

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 }