文章目录
一.复习Keil4的使用
(1)新建工程:Project—New μVision Project…
在对应的路径保存了之后,选择芯片类型——Atmel里的AT89C51;
(2)给工程添加C文档:
a.File—New;
b.保存新建的文档;
c.将新建的文档添加进已经建好了的工程;
(3)建立hex文件:
程序编译无错误之后,点击再编译一次程序。
二.蜂鸣器
(1)蜂鸣器类型:有源和无源(“源”指震荡源)
无源蜂鸣器的工作发声原理是:方波信号输入谐振装置转换为声音信号输出
有源蜂鸣器的工作发声原理是:直流电源输入经过振荡系统的放大取样电路在谐振装置作用下产生声音信号
开发板所使用的为无源蜂鸣器:
(2)蜂鸣器工作原理:
①电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动。
② 压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。多谐振荡器由晶体管或集成电路构成,当接通电源后(1.5~15V直流工作电压),多谐振荡器起振,输出1.5~2.5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。
(3)蜂鸣器编程原理:
①改变单片机引脚输出波形的频率,就可以调整控制蜂鸣器音调,产生各种不同音色、音调的声音。
②改变输出电平的高低电平占空比,则可以控制蜂鸣器的声音大小。
可以使用延时实现不同频率和声音强度的变化。
附:生日快乐歌——蜂鸣器发声程序:
#define uint unsigned int
#define uchar unsigned char
sbit beep = P1^5;
uchar code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,
212,212,106,126,159,169,190,119,119,126,159,142,159,0};
uchar code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,
9,3,12,12,12,12,12,9,3,12,12,12,24,0};
void DelayMS(uint x)
{
uchar t;
while(x--) for(t=0;t<120;t++);
}
void PlayMusic()
{
uint i=0,j,k;
while(SONG_LONG[i]!=0||SONG_TONE[i]!=0)
{ //播放各个音符,SONG_LONG 为拍子长度
for(j=0;j<SONG_LONG[i]*20;j++)
{
beep=~beep;
/ /SONG_TONE 延时决定了每个音符的频率
for(k=0;k<SONG_TONE[i]/3;k++);
}
DelayMS(10);
i++;
}
}
void main()
{
beep=0;
while(1)
{
PlayMusic(); //播放生日快乐
DelayMS(500); //播放完后暂停一段时间
}
}
三.数码管
发光原理:
与led小灯发光原理一样,皆是通过发光二极管工作,而我们要选择数码管上的发光二极管的搭配,来显示我们需要的字符
需要注意的是,开发板上的数码管是共阳极,因此I/O口输出低电平才会发光。
锁存器介绍:
锁存器(Latch)是一种对脉冲电平敏感的存储单元电路,它们可以在特定输入脉冲电平作用下改变状态。锁存,就是把信号暂存以维持某种电平状态。锁存器的最主要作用是缓存,其次完成高速的控制器与慢速的外设的不同步问题,再其次是解决驱动的问题,最后是解决一个 I/O 口既能输出也能输入的问题。锁存器是利用电平控制数据的输入,它包括不带使能控制的锁存器和带使能控制的锁存器。
(1)使用译码器的多位数码管显示:
138译码器介绍:
74LS138 :3 线-8线译码器,共有 54LS138和 74LS138 两种线路结构型式。
工作原理:当一个选通端(E1)为高电平,另两个选通端((/E2))和(/E3))为低电平时,可将地址端(A0、A1、A2)的二进制编码在Y0至Y7对应的输出端以低电平译出。(即输出为Y0至Y7的非)比如:A2A1A0=110时,则Y6输出端输出低电平信号。
应用:
①利用 E1、E2和E3可级联扩展成 24 线译码器;若外接一个反相器还可级联扩展成 32 线译码器。
②若将选通端中的一个作为数据输入端时,74LS138还可作数据分配器。
③可用在8086的译码电路中,扩展内存。
74HC138 : 一款高速CMOS器件,74HC138引脚兼容低功耗肖特基TTL(LSTTL)系列。74HC138译码器可接受3位二进制加权地址输入(A0, A1和A2),并当使能时,提供8个互斥的低有效输出(Y0至Y7)。
74HC138特有3个使能输入端:两个低有效(E1和E2)和一个高有效(E3)。除非E1和E2置低且E3置高,否则74HC138将保持所有输出为高。
功能:74HC138 作用于高性能的存贮译码或要求传输延迟时间短的数据传输系统,在高性能存贮器系统中,用这种译码器可以提高译码系统的效率。将快速赋能电路用于高速存贮器时,译码器的延迟时间和存贮器的赋能时间通常小于存贮器的典型存取时间,这就是说由肖特基钳位的系统译码器所引起的有效系统延迟可以忽略不计。HC138 按照三位二进制输入码和赋能输入条件,从8 个输出端中译出一个 低电平输出。两个低电平有效的赋能输入端和一个高电平有效的赋能输入端减少了扩展所需要的外接门或倒相器,扩展成24 线译码器不需外接门;扩展成32 线译码器,只需要接一个外接倒相器。在解调器应用中,赋能输入端可用作数据输入端。
附:点亮多个数码管——译码器使用程序
#define uint unsigned int
#define uchar unsigned char
sbit C138=P2^4; //定义译码器的三个输入端
sbit B138=P2^3;
sbit A138=P2^2;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6D,0X7D,0X07,0x7f,0x6f};
//数码管数字显示数组
void delay1ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
void number_led()
{
C138=0;
B138=0;
A138=0;
P0=table[5]; //显示数字5,段选
delay1ms(); //延时
C138=0; //选择数码管,位选
B138=0;
A138=1;
P0=table[2];
delay1ms();
C138=0;
B138=1;
A138=0;
P0=table[0];
delay1ms();
C138=0;
B138=1;
A138=1;
P0=table[1];
delay1ms();
C138=1;
B138=0;
A138=0;
P0=table[3];
delay1ms();
C138=1;
B138=0;
A138=1;
P0=table[1];
delay1ms();
C138=1;
B138=1;
A138=0;
P0=table[4];
delay1ms();
C138=1;
B138=1;
A138=1;
}
void main()
{
while(1)
{
number_led();
}
}
(2)不使用译码器的多位数码管显示:
动态数码管显示原理:
通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
附:不使用译码器显示数字程序:
#define GPIO_DIG P0 //段选
#define GPIO_PLACE P1 //位选
unsigned char code DIG_PLACE[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char code DIG_CODE[17] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char DisplayData[8];
void DigDisplay();
void main(void)
{
unsigned char i;
for(i=0; i<8; i++)
{
DisplayData[i] = DIG_CODE[i];
}
while(1)
{
DigDisplay();
}
}
void DigDisplay()
{
unsigned char i;
unsigned int j;
for(i=0; i<8; i++)
{
GPIO_PLACE = DIG_PLACE[i];
GPIO_DIG = DisplayData[i];
j = 10;
while(j--);
GPIO_DIG = 0x00;
}
}
接线图: