《补充单片机应用系统设计实例.ppt》由会员分享,可在线阅读,更多相关《补充单片机应用系统设计实例.ppt(61页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、单片机应用系统设计实例,1. 8051系列单片机实现计算器功能 2. 简易波形发生器 3. 简易广告屏设计 4. 寻迹小车的设计 5. 无线呼叫系统设计,1. 8051单片机实现计算器功能,一 设计目标和实现方法,满足计算器要求,进行加减乘除运算; 打开计数器时,初始显示数字为0123; 实现简单的数据运算,不支持连续运算; 仿真和调试要用到Protues 和Keil 软件。,二 方案论证与设计,键盘包括0到9十个数字键,加减乘除四个符 号键,清除键和等号键,共16 个按键 ; 键盘选用4x4行列式键盘结构(如下图); 输入模块:键盘扫描; 数字大小范围为4位, 选用4个LED数码管 显示数据
2、和结果;,三 硬件电路设计,(1)主要器件:采用8051 单片机,它能够满足数据的采集、控制和数据处理的需求,显示用输入采用按键方式的4 段LED 数码管; (2)功能和操作:加减乘除运算和显示。步骤如下: 上电后,屏幕初始化,显示初始数值0123; 计算。依次数字键,符号键,数字键,等号键,屏幕上显示出计算结果; 如果要再次计算,可以按下“on/c”键清0,或者按下单片机的复位键,重新初始化。,四 软件设计,模块化程序设计是单片机应用中最常用的程序设计方法; 模块化程序设计的中心思想是把一个复杂应用程序按整体功能划分成若干相对独立的程序模块,各模块可以单独 设计,编程和调试,然后组合起来;
3、本系统的程序模块主要分为主程序,键值获取程序和处理子程序等,其流程图分别如下图所示:,主程序流程图,定时中断子程序流程图,按键处理子程序流程图,主程序: 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
4、_LED(4);break; case five: modify_LED(5);break; case six: modify_LED(6);break;,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_L
5、ED(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)LED0=LED1=LED2=space; else LED0=LED1; LED1=LED2;LED2=LED3;,LED3=x;key_ptr-; if(x=0) op1=op1*10+x; el
6、se if(x=10,case -: op2=op2-op1;break; case *: op2=op1*op2;break; case /: op2=op2/op1;break; default:break; result_pr(); key_ptr ,定时中断子程序: void timer0() interrupt TF0_VECTOR /中断检测键盘键值 TH0=(65536-2500)8; TL0=(65536-2500) /更新段码,wx_port=(1wx_ptr); /更新位选 wx_ptr+;wx_ptr /指向下一位 ,2. 简易波形发生器设计,波形发生器是一种在测量、控制
7、领域经常要使用到的信号发生装置,可以按照要求输出相应波形。其主要功能如下:,输出波形可调;输出复制和频率可调。,设计思路:以正弦波为例,一条正弦波曲线可以看做是一个个点的集合,我们可以按照一定的时间间隔输出这些点的电压值,在输出端就可以得到一个正弦波,时间间隔越小,输出的波形就越接近一个正弦波。,一 硬件设计,这个实现方案使用了以下元器件: 主控单元:AT89s52单片机; 显示界面:液晶屏幕lcd1602; 功能电路:8分辨率D/A转换芯片DAC0832, 运算放大器,与非门,按键等。,简易波形发生器原理图,在上原理图中: P1口作为LCD1602的数据输入总线; P2.22.4作为LCD1
8、602的读/写,使能控制线; P2.02.1作为DAC0832的控制线; P0口作为DAC0832的数据输入总线; 4个按键分别控制波形选择,频率+,频率-, 在DAC0832的输出端外接TL082集成运算放大 器,控制输出波形的幅值。,DAC0832是8分辨率的D/A转换集成芯片,由8位输入锁存器,8位DAC寄存器,8位D/A转换电路及转换控制电路构成。其引脚功能如下:,D0D7:8位数据输入线,TTL电平,有效时间90ns; ILE:数据锁存允许控制信号输入线,高电平有效; CS:片选信号输入线,低电平有效; WR1:数据锁存器写选通输入线,负脉冲有效; XFER:数据传输控制信号输入线,
9、低电平有效; WR2:DAC寄存器选通输入线,负脉冲有效; IOUT1:电流输出端1,其值随DAC寄存器的内容线性 变化; IOUT2:电流输出端2,其值与IOUT1值之和为一常数;,Rfb:反馈信号输入线,改变 Rfb端外接电阻值可调 整转换满量程精度; Vcc:电源输入端,Vcc的范围 为+5V+15V; VREF:基准电压输入线,VREF 的范围-10V+10V; AGND:模拟信号地 DGND:数字信号地,DAC0832管脚图,二 软件设计,主程序流程图,外部中断子程序流程图,定时器中断子程序流程图,主要程序举例 正弦波离散输出表: uchar code sine_tab256= /输
10、出电压从0到最大值(正弦波1/4部分) 0 x80,0 x83,0 x86,0 x89,0 x8d,0 x90,0 x93,0 x96,0 x99,0 x9c,0 x9f,0 xa2,0 xa5,0 xa8,0 xab,0 xae,0 xb1,0 xb4,0 xb7,0 xba,0 xbc, 0 xbf,0 xc2,0 xc5,0 xc7,0 xca,0 xcc,0 xcf,0 xd1,0 xd4,0 xd6,0 xd8,0 xda,0 xdd,0 xdf,0 xe1,0 xe3,0 xe5,0 xe7,0 xe9,0 xea,0 xec, 0 xee,0 xef,0 xf1,0 xf2,0
11、xf4,0 xf5,0 xf6,0 xf7,0 xf8,0 xf9,0 xfa,0 xfb,0 xfc,0 xfd,0 xfd,0 xfe,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff, /输出电压从最大值到0(正弦波1/4部分) 0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xfe,0 xfd,0 xfd,0 xfc,0 xfb,0 xfa,0 xf9,0 xf8,0 xf7,0 xf6,0 xf5,0 xf4,0 xf2,0 xf1,0 xef,0 xee,0 xec,0 xea,0 xe9,0 xe7,0 xe5,0 xe3,0 x
12、e1,0 xde,0 xdd,0 xda,0 xd8,0 xd6,0 xd4,0 xd1,0 xcf,0 xcc,0 xca,0 xc7,0 xc5,0 xc2, 0 xbf,0 xbc,0 xba,0 xb7,0 xb4,0 xb1,0 xae,0 xab,0 xa8,0 xa5,0 xa2,0 x9f,0 x9c,0 x99 ,0 x96,0 x93,0 x90,0 x8d,0 x89,0 x86,0 x83,0 x80, /输出电压从0到最小值(正弦波1/4部分) 0 x80,0 x7c,0 x79,0 x76,0 x72,0 x6f,0 x6c,0 x69,0 x66,0 x63,0
13、x60,0 x5d,0 x5a,0 x57,0 x55,0 x51,0 x4e,0 x4c,0 x48,0 x45,0 x43, 0 x40,0 x3d,0 x3a,0 x38,0 x35,0 x33,0 x30,0 x2e,0 x2b,0 x29,0 x27,0 x25,0 x22,0 x20,0 x1e,0 x1c,0 x1a,0 x18,0 x16 ,0 x15,0 x13, 0 x11,0 x10,0 x0e,0 x0d,0 x0b,0 x0a,0 x09,0 x08,0 x07,0 x06,0 x05,0 x04,0 x03,0 x02,0 x02,0 x01,0 x00,0 x00
14、,0 x00,0 x00,0 x00,0 x00,/输出电压从最小值到0(正弦波1/4部分) 0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x01,0 x02 ,0 x02,0 x03,0 x04,0 x05,0 x06,0 x07,0 x08,0 x09,0 x0a,0 x0b,0 x0d,0 x0e,0 x10, 0 x11,0 x13,0 x15 ,0 x16,0 x18,0 x1a,0 x1c,0 x1e,0 x20,0 x22,0 x25,0 x27,0 x29,0 x2b,0 x2e,0 x30,0 x33,0 x35,0 x38,0 x3a,0 x3
15、d, 0 x40,0 x43,0 x45,0 x48,0 x4c,0 x4e,0 x51,0 x55,0 x57,0 x5a,0 x5d,0 x60,0 x63,0 x66 ,0 x69,0 x6c,0 x6f,0 x72,0 x76,0 x79,0 x7c,0 x80; 正弦波输出程序: #define DAdata P0/DA数据端口 void sine_out() /正弦波输出 DAdata=sine_tabwavecount+; DA_S1=0; /打开8位输入寄存器 DA_S1=1; /关闭8位输入寄存器 ,主程序: void main() uchar i=0; DA_S2=0; /
16、使DAC寄存器处于直通状态 DAdata=0; DA_S1=1; /关闭8位输入寄存器 init_lcd(); waveform=0; TMOD=0 x01; /设置定时器0为16位工作方式 IT0=1; /设置外部中断0为下降沿触发 ET0=1; /开定时器中断 EX0=1; EA=1; while(1) ,定时中断子程序: void timer0() interrupt 1 TH0=THtemp; TL0=TLtemp; if(waveform=0) sine_out(); else if(waveform=1) triangle_out(); else if(waveform=2) sq
17、uare_out(); ,外部中断子程序: void key_int0() interrupt 0 uchar keytemp; uint total_freq; /总频率 EA=0; TR0=0; /关总中断与定时器 delay(5); /延时 if(key=0) /有按键按下而引发中断 keytemp=P3,case 0 xb0: wavefreqwaveform-; if(wavefreqwaveform1) wavefreqwaveform=10; break; case 0 x70: DA_S2=1; break; THtemp=waveTHwaveform*10+(wavefreq
18、waveform-1); /方括号中选取第几个数后,并把该值赋给T_temp TLtemp=waveTLwaveform*10+(wavefreqwaveform-1); total_freq= wavefreqwaveform * freq_unitwaveform; lcd_hang25=total_freq%10+0 x30; total_freq/=10; lcd_hang24=total_freq%10+0 x30; total_freq/=10; lcd_hang23=total_freq%10+0 x30; total_freq/=10; lcd_hang22=total_fre
19、q%10+0 x30; disp_lcd(0 x80, /在第一行显示,disp_lcd(0 xc0,lcd_hang2); /在第二行显示 wavecount=0; /计数清零 while(!key); EA=1; TR0=1; /开启中断与定时器 ,3. 简易广告屏设计,设计要求:基于51单片机设计一个电子广告 牌,其功能是滚动显示一串字符。,设计思路:选用了8个LED点阵,组成一个大的 16*64的LED点阵。使用分时控制 方法,用同一数据总线来控制8个 点阵的显示,减少对IO端口的需求。,一 硬件设计,右图是一个8*8的集成LED点阵,该点阵有16个引脚,8个引脚控制点阵每行的选中,另
20、外8个引脚控制点阵每列的选中,通过这16个引脚来控制点阵上每一个LED的亮灭。,16X64LED点阵的广告屏电路,在上原理图中: 使用P2.7,P2.6,P2.5通过与非门连接3片74273作为片选引脚。则在某一时刻内我们可以只选通其中一片D触发器,发送数据,图中的两片D触发器对显示屏上LED每行的选通进行控制。 D触发器上使用了六个端口,其中四根线接到4-16译码芯片上控制每列的选通,另外两根线控制4片译码器的选通,则可以实现对4*16=64列LED的选通控制。,二 软件设计,要在LED屏上显示汉字,首先要取得汉字的字模,本方案一个汉字所需要的存储空间是32个字节。我们可以定义一个数组来存储
21、这个字模,如“武”的字模为: char list=0 x20,0 x20,0 x20,0 x60,0 x24,0 x3F,0 x24,0 x20, 0 x24,0 x20,0 xE4,0 x1F,0 x26,0 x11,0 x24,0 x11, 0 x20,0 x10,0 xFF,0 x03,0 x20,0 x1C,0 x22,0 x20, 0 x2C,0 x40,0 x20,0 x80,0 x20,0 xE0,0 x00,0 x00,我们使用软件生成了所需汉字的字模之后,将这些字模存入程序的数组,运行程序,调用这些数组,这些汉字就显示在屏幕上了。程序流程图如右图所示:,主要程序: #defi
22、ne hang0 XBYTE0X7FFF /定义端口 #define hang1 XBYTE0XbFFF #define lie XBYTE0XDFFF void main() uchar i,j,k; uint b=0; uchar a; /控制移动间隔时间 while(1) j=0; if(a1) /移动间隔时间;取值0-255 a=0; b+=2; if(b=512) b=0; for(i=0;i64;i+) lie=i;hang0=0 x00; hang1=0 x00; ,for(i=0;i64;i+) lie=i; for(k=0;k5;k+) hang0=tablej+b; han
23、g1=tablej+b+1; delay(2); hang0=0 x00; hang1=0 x00; /清屏 j+=2; a+; ,4. 寻迹小车的设计,一 功能介绍,本循迹小车将实现自动寻迹并沿黑线走向行进的功能。 小车由前后两个电机分别控制前轮转弯及后轮前进驱动,其中前轮由小型舵机带动,使得系统减少了机械部分设计,使小车的转向控制数字化,易于单片机进行控制。后轮使用普通直流电机,通过PWM信号调节小车前进车速。,系统原理图,二 硬件介绍,(1) 舵机简介,舵机是一种位置伺服的驱动器,适用于角度不断变化并可以保持的控制系统。小型舵机的工作电压一般为4.8V或6V,转速一般为0.22/60度或
24、0.18/60度。,工作原理: 控制信号进入信号调制芯片,获得直流偏置电压; 基准电路产生周期20ms,宽度1.5ms的基准信号; 将直流偏置电压与电位器的电压比较获得电压差输出; 最后,电压差的正负输出到电机驱动芯片决定电机的正反转; 以180度角度伺服为例,对应的控制关系是: 0.5ms-0度; 2.0ms-135度; 1.0ms-45度; 2.5ms-180度; 1.5ms-90度;,(2) 黑线检测传感器的介绍,小车黑线检测用红外发射对管作为传感器。 其工作原理为:发射端发射红外光,接收端接收物体反射信号,因为各种颜色对光的吸收和反射程度不同,黑色吸收红外光,使得反射信号很弱,而白色反
25、射红外光使得反射信号相对发射信号损耗不大,接收端再将反射信号转换为相应的电压信号。传感器的接收信号再经过信号处理电路(如下页图)输送给单片机。,黑线信号检测电路,(3) 电机驱动原理简介,小车后轮采用小型直流电机,采用PWM信号驱动L298N电机驱动芯片进行控制。 L298N 为双全桥步进电机专用驱动芯片,内部包含4信道逻辑驱动电路,是一种二相和四相步进电机的专用驱动器,可同时驱动2个二相或1个四相步进电机。 此芯片可直接由单片机的IO端口来提供模拟时序信号,其电机驱动基本原理如下页图所示。,电机驱动电路,三 软件程序介绍,这次设计由于单片机89S52内部不带有PWM生成模块,故采用定时器与端
26、口电平翻转来实现PWM。 右图是小车运行的程序流程图。,主程序: 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=0 x8a; TMOD=0 x11; TH0=0 x00; TL0=0 x00; TH1=0 x00;TL1=0 x00; TR0=1; /启动T0 TR1=1; /启动T1,for(;) /* for
27、(i=0;i1000;i+); */ receive=P2; switch(receive) /根据采集到的值进行判断 case 0 x7f:ek1=0;break; /0111 1111 case 0 x3f:ek1=1;break; /0011 1111 case 0 xbf:ek1=2;break; /1011 1111 case 0 x9f:ek1=3;break; /1001 1111 case 0 xdf:ek1=4;break; /1101 1111 case 0 xcf:ek1=5;break; /1100 1111 case 0 xef:ek1=6;break; /1110
28、1111 case 0 xe7:ek1=7;break; /1110 0111 case 0 xf7:ek1=8;break; /1111 0111,case 0 xf3:ek1=9;break; /1111 0011 case 0 xfb:ek1=10;break; /1111 1011 case 0 xf9:ek1=11;break; /1111 1001 case 0 xfd:ek1=12;break; /1111 1101 case 0 xfc:ek1=13;break; /1111 1100 case 0 xfe:ek1=14;break; /1111 1110 default: e
29、k1=15;break; /1111 1111 if(ek1=15) ek1=ek2; /计算控制量 else b=90*ek1+middle-45*ek2-315; if(b1120) b=1120;if(b710) b=710 ek2=ek1 void interrupt_t0(void) interrupt 1, if(flag1=0) TH0=(uchar)(16384-b)/256+192); TL0=(uchar)(16384-b)%256); a=b;flag1=1;rudder=1; elseTH0=(uchar)(a/256+184); TL0=(uchar)(a%256 r
30、udder=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;, else TH1=lowh;TL1=lowl;pulse=0; /P1.1管脚电平跳变 flag2=0; TF1=0;TF0=0; ,5. 无线呼叫系统设计,一 硬件设计,本系统采用nrf2401作为无线呼叫功能芯片,进行无线数据传输。,nRF2401是单片射频收发芯片,工作于2.42.5GHz ISM频段,芯片内置频率合成器、功率放大
31、器、晶体振荡器和调制器等功能模块,输出功率和通信频道可通过程序进行配置。 芯片能耗非常低,以-5dBm的功率发射时,工作电流只有10.5mA,接收时工作电流只有18mA,多种低功率工作模式,节能设计更方便。其DuoCeiverTM技术使nRF2401可以使用同一天线,同时接收两个不同频道的数据。nRF2401适用于多种无线通信的场合。,二 软件设计,无线呼叫系统的软件设计分为三个模块,包括主程序,nRF2401发送模块和nRF2401接收模块,相关的流程图如下:,nRF2401 ShockBurst方式发送流程图和接收流程图,主程序: voidmain(void) delayms(1000);
32、 /开机延时 nRF2401_Data0=0; init_rs232(); /串口初始化 TI=1; /串口发射有效 nRF2401_config();/nRF2401初始化配置 delayms(100); speakertest(); /蜂鸣器叫一声 nRF2401_Transmit_Mode();/设置为发送模式 nRF2401_Transmit_Data(nRF2401_Data); /发送测试数据 nRF2401_Receive_Mode(); /设置为接收模式 SBUF=0 x55;/串口输出0 x55测试是否有正确的串口数据 delayms(100);,while(1) nRF24
33、01_Receive_Data(nRF2401_Data);if(nRF2401_flag /调用按键子程序,无线发送数据 ,发送数据子程序voidnRF2401_Transmit_Data(ucharTxBuf) uchari; nRF2401_CE=1; delayms(1); for(i=0;i(ADDR_W/8);i+) /写入接收地址(按字节对齐) nRF2401_Write_Byte(Channel_Addri); for(i=0;i(DATA1_W/8);i+) /写入需要发送的数据 nRF2401_Write_Byte(TxBufi); nRF2401_CE=0; /nRF2401_CE置低使发送有效 delayms(1); ,接收数据子程序voidnRF2401_Receive_Data(uchar*data_temp) uchari; if(DR1=1) /接收完毕后,DR1自动为0datasheet(page28of37); for(i=0;iDATA1_W/8;i+) *data_temp=nRF2401_Read_Byte();data_temp+; nRF2401_flag|=0 x01;/接收标志位nRF2401_flag_bit0=1 else nRF2401_flag/接收标志位nRF2401_flag_bit0=0 ,
限制150内