4 单片机模块4.1 构建STC11F02E最小系统我们选用STC11F02E单片机作为SHY的控制芯片电路部分,关于STC11F02E的参数如下:
STC11F02E单片机为增强型的8051内核,具有2KB的片内Flash程序存储器、2KB的EEPROM存储器和256KB的片内SRAM数据存储器。
这款单片机的UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)模块的最大特点就是通过配置特殊功能寄存器AUXR1中的第7位UART_P1的状态可以使UART模块的两个引脚(RXD、TXD)接到P3端口的P3.0、P3.1引脚,或者接到P1端口的P1.6、P1.7引脚,从而可以充当两个串口使用。
因为制作SHY需要的引脚并不是很多,所以我们只需要20引脚的单片机即可。这片STC11F02E
- 符合20引脚,小巧,作为增强型STC芯片,功耗小。
- 有两个串口通讯接口,可一个用于下载,一个用于openwrt路由通讯。
- 从DATASHEET中得到STC11F02E 的芯片管脚图
在这里,我们需要用到:
P1.7 作为串口的TX(transmit) 传送 接口
P1.6 作为串口的RX(Recive) 接收 接口
P1.5 - P1.0 用于控制L298N驱动电路
P3.7 用于PWM控制LED灯
P3.6/RST 用于复位电路
XTAL2
XTAL1 用于11.0592MHZ晶振
RXD
TXD 用于在线下载线路
关于复位电路的解释
RST保持两个机器周期以上的高电平时自动复位
至此,STC11F02E最小系统完成。
4.2 中断方式接收串口数据接收串口数据的目的是为了与openwrt路由完成通讯,STC11F02E要准确无误的辨识出openwrt路由发过来的指令,编制测试程序如下:
#include #include #define uchar unsigned char#define uint unsigned intunsigned char Receive(void){unsigned char dat;while(RI==0); //只要接收中断标志位RI没有被置“1” 当接收完毕时,中断标志RI被置1 //等待,直至接收完毕(RI=1)RI=0; //为了接收下一帧数据,需将RI清0dat=SBUF; //将接收缓冲器中的数据存于datreturn dat;}void main (void){SCON = 0x50; //REN=1允许串行接受状态,串口工作模式2TMOD|= 0x20; //定时器1工作方式2TH1 = 0xFD; //baud /* 波特率9600、数据位8、停止位1。效验位无 (11.0592M)TL1 = 0xFD;TR1 = 1;REN=1; while(1) { if(Receive() == 'W') P1=~P1; }}以上程序有一个缺点是,并没有使用串口中断,其实在在这个程序上,用不用中断处理程序对于单片机都是一样的,因为使用的是一样的开销。但是,我们在前面提到过,完成Shy的一个目的是学习,所以我们要使用串口中断完成这个程序的编制 完成串口中断的编写,如下:
#include #include #define uchar unsigned char#define uint unsigned intvoid InitUART (void){SCON = 0x50;TMOD|= 0x20;TH1 = 0xFD;TL1 = 0xFD;TR1 = 1;REN=1;ES=1; //允许串行口中断EA =1; //单片机中断允许}unsigned char Receive(void){unsigned char dat;while(RI==0);RI=0;dat=SBUF;return dat;}void main (void){InitUART();while(1){}}void serial (void) interrupt 4 using 3{ if(Receive() == 'W') P1=~P1;}可以看到,程序被精简,并且模块化,主函数中几乎没有代码。经过测试,能够正常使用。
在这里:
interrupt 0 指明是外部中断0;interrupt 1 指明是定时器中断0;interrupt 2 指明是外部中断1;interrupt 3 指明是定时器中断1;interrupt 4 指明是串行口中断;using 0 是第0组寄存器;using 1 是第1组寄存器;using 2 是第2组寄存器;using 3 是第3组寄存器;51单片机的中断编号如下:
51单片机的中断功能号如下:
几个比较重要的概念如下:
EA、EX0、ET0、EX1、ET1、ES、ET2
中断名称、中断号、入口地址
中断允许控制寄存器(interrupt enable)
中断优先级控制寄存器(interrupt priority)
SHY的中断方式接收串口数据部分完毕。
4.3 PWM调光编程正规的解释如下:
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
脉冲宽度调制是一种模拟控制方式,其根据相应载荷的变化来调制晶体管栅极或基极的偏置,来实现开关稳压电源输出晶体管或晶体管导通时间的改变,这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。
随着电子技术的发展,出现了多种PWM技术,其中包括:相电压控制PWM、脉宽PWM法、随机PWM、SPWM法、线电压控制PWM等,而在镍氢电池智能充电器中采用的脉宽PWM法,它是把每一脉冲宽度均相等的脉冲列作为PWM波形,通过改变脉冲列的周期可以调频,改变脉冲的宽度或占空比可以调压,采用适当控制方法即可使电压与频率协调变化。可以通过调整PWM的周期、PWM的占空比而达到控制充电电流的目的。
以上参考地址:http://baike.baidu.com/view/168039.htm
可以看到,以上的解释非常抽象。
在我的单片机开发板中,有PWM的示例程序,但不是以函数的形式,改写为函数的形式如下:
unsigned int CYCLE=600,PWM_LOW=0;//PWM-定义周期并赋值void PWM_LED (void) { LED0=1; Delay(60000); //特意加延时,可以看到熄灭的过程 for(PWM_LOW=1WM_LOW0WM_LOW--){ //与逐渐变亮相反的过程LED0=0;Delay(PWM_LOW);LED0=1;Delay(CYCLE-PWM_LOW);}}
图片来源:《LY-51S开发板说明书v1.1.pdf》
烧制入单片机后演示
此刻,在官方的解释中“是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术”此句,是否以不再抽象?
基本上来说,在这个LED应用中,是采用时分法,用时差来进行电压连续变化量的模拟。因为在单片机中,管脚的输出不是1就是0
如何输出一定电压范围的模拟量,PWM就是解决这个问题的一种方式。
此刻,相信我们已经可以猜测到了,Shy呼吸灯的变幻方式。