⑴ 单片机如何实现多路模拟量的数据采集、显示
普通单片机实现多路模拟量的数据采集、显示需要:
外部连接一个多通道输入的ADC芯片,单片机按照一定的周期驱动模拟开关切换到不同的模拟通道,设计模数转换控制器的控制程序,可以进行定时模拟信号采集和显示。
(1)单片机ic04扩展阅读:
单片机基本结构及作用:
1、运算器
运算器由运算部件——算术逻辑单元(Arithmetic & Logical Unit,简称ALU)、累加器和寄存器等几部分组成。ALU的作用是把传来的数据进行算术或逻辑运算,输入来源为两个8位数据,分别来自累加器和数据寄存器。
ALU能完成对这两个数据进行加、减、与、或、比较大小等操作,最后将结果存入累加器。
运算器有两个功能:
执行各种算术运算。
执行各种逻辑运算,并进行逻辑测试,如零值测试或两个值的比较。
运算器所执行全部操作都是由控制器发出的控制信号来指挥的,并且,一个算术操作产生一个运算结果,一个逻辑操作产生一个判决。
2、控制器
控制器由程序计数器、指令寄存器、指令译码器、时序发生器和操作控制器等组成,是发布命令的“决策机构”,即协调和指挥整个微机系统的操作。其主要功能有:
从内存中取出一条指令,并指出下一条指令在内存中的位置。
对指令进行译码和测试,并产生相应的操作控制信号,以便于执行规定的动作。
指挥并控制CPU、内存和输入输出设备之间数据流动的方向。
微处理器内通过内部总线把ALU、计数器、寄存器和控制部分互联,并通过外部总线与外部的存储器、输入输出接口电路联接。外部总线又称为系统总线,分为数据总线DB、地址总线AB和控制总线CB。通过输入输出接口电路,实现与各种外围设备连接。
3、主要寄存器
累加器A
累加器A是微处理器中使用最频繁的寄存器。在算术和逻辑运算时它有双功能:运算前,用于保存一个操作数;运算后,用于保存所得的和、差或逻辑运算结果。
数据寄存器DR
数据寄存器通过数据总线向存储器和输入散竖/输出设备送(写)或取(读)数据的暂存单元。它可以保存一条正在译码的指令,也可以保存正在送槐或往存储器中存储的一个数据字节等等。
指令寄存器IR和指令译码器ID
指令包括操作码和操作数。
指令寄存器是用来保存当前正在执行的一条指令。当执行一条指令时,先把它从内存中取到数据寄存器中,然后再传送到指令寄存器。
当系统执行给定的指令时,必须对操作码进行译码,以确定所要求的操作,指令译码器就是负责这项工作的。其中,指令寄存器中操作码字段的输出就是指令译码器的输入。
程序计数器PC
PC用于确定下一条指令铅掘伍的地址,以保证程序能够连续地执行下去,因此通常又被称为指令地址计数器。在程序开始执行前必须将程序的第一条指令的内存单元地址(即程序的首地址)送入PC,使它总是指向下一条要执行指令的地址。
地址寄存器AR
地址寄存器用于保存当前CPU所要访问的内存单元或I/O设备的地址。由于内存与CPU之间存在着速度上的差异,所以必须使用地址寄存器来保持地址信息,直到内存读/写操作完成为止。
显然,当CPU向存储器存数据、CPU从内存取数据和CPU从内存读出指令时,都要用到地址寄存器和数据寄存器。同样,如果把外围设备的地址作为内存地址单元来看的话,那么当CPU和外围设备交换信息时,也需要用到地址寄存器和数据寄存器。
⑵ 单片机80c51中定时/计数器的工作方式中怎么计数范围怎么算的为什么这样算
定时器有一个16位的计数寄存器,这个16位被分成两个8位的寄存器,分别是THx和TLx,有4种工作方式:
方式0:用了THx的8位,用了TLx中的低5位,这样,加起来一共是13位,所以,最大计数范围就是0-8191,一共8192个时钟
方式1:用了THx的8位,用了TLx中的全部8位,这样,加起来一共是16位,所以,最大计数范围就是0-65535,一共65536个时钟,也是定时器用的最大的范围
方式2:只用了THx用来计数,当THx的计数用完了之后,硬件自动把TLx赋值给THx,所以方式2相当于只是8位,所以最大计数到 0-255,共256个
方式3:用于串口波特率的计算,不讨论.
方式0是为了向上兼容老式单片机,一般很少用,现在基本上用方式1最多.
⑶ 单片机主要外围器件
单片机外围器件,常跟单片机外围电路相关,其电路主要有键盘输入 、A/D输入,温度、通讯、I2C存储等单元电路,输出主要有LED或者LCD输出,一般控制接口输出,在配相应的功率驱动IC。和以上相关的常见外围器件有:通讯电平转换芯片(比如SP3232EEY,相似型号还有很多)、I2C存储器(一般是24C02、24C04、FM24CL16等,根据最后数据大小确定存储容量)、温度(DS1820单总线、DS600U)、LED数码管驱动(CH452A V2)、输出驱动一般用继电器转换控制,也有专用芯片等。其它日历有2300系列。
⑷ 求教一个51单片机程序。。(LCD电子时钟)
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar a,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp;
#define yh 0x80
#define er 0x80+0x40//液晶屏的与 C51 之间的引脚连接定义
sbit rs=P2^5;
sbit en=P2^7;
sbit rw=P2^6;//如果硬件上 rw 接地,就不用写这句和后面的 rw=0
//DS1302 时钟芯片与 C51 之间的引脚连接定义
sbit IO=P3^6;
sbit SCLK=P3^5;
sbit RST=P3^7;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;//校时按键与 C51 的引脚连接定义
sbit key1=P3^2;//设置键
sbit key2=P3^3;//加键
sbit key3=P3^4;//减键
uchar code tab1[]={"20//////////"};//年显示的固定字符
uchar code tab2[]={"LOVE ::::::"};//时间显示的固定字符
//延时函数,后面经常调用
void delay(uint xms)//延时函数,有参函数
{
uint x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
/********液晶写入指令函数与写入数据函数,以后可调用**************/
write_1602com(uchar com) //****液晶写入指令函数****
{
rs=0; //数据/指令选择置为指令
rw=0; //读写选择 置为写
P0=com; //送入数据
delay(1);
en=1; //拉高使能端,为制造有效的下降沿做准备
delay(1);
en=0;
//en 由高变低,产生下降沿,液晶执行命令
}
write_1602dat(uchar dat) //***液晶写入数据函数****
{
rs=1; //数据/指令选择置为数据
rw=0; //读写选择置为写
P0=dat; //送入数据
delay(1);
en=1; //en 置高电平,为制造下降沿做准备
delay(1);
en=0; //en 由高变低,产生下降沿,液晶执行命令
}
lcd_init() //***液晶初始化函数****//
{
write_1602com(0x38); //设置液晶工作模式,意思:16*2 行显示,5*7 点阵,8 位数据
write_1602com(0x0c); //开显示不显示光标
write_1602com(0x06); //整屏不移动,光标自动右移
write_1602com(0x01); //清显示
write_1602com(yh+1); //日历显示固定符号从第一行第 1 个位置之后开始显示
for(a=0;a<14;a++)
{
write_1602dat(tab1[a]); //向液晶屏写日历显示的固定符号部分
}
write_1602com(er+1);//时间显示固定符号写入位置,从第 2 个位置后开始显示
for(a=0;a<12;a++)
{
write_1602dat(tab2[a]);//写显示时间固定符号,两个冒号
}
}
/***************DS1302 有关子函数********************/
void write_byte(uchar dat)//写一个字节
{
ACC=dat;
RST=1;
for(a=8;a>0;a--)
{
IO=ACC0;//相当于汇编中的 RRC
SCLK=0;
SCLK=1;
ACC=ACC>>1;
}
}
uchar read_byte() //读一个字节
{
RST=1;
for(a=8;a>0;a--)
{
ACC7=IO;
SCLK=1;
SCLK=0;
ACC=ACC>>1;
}
return (ACC);
}
//----------------------------------------//
void write_1302(uchar add,uchar dat) //向 1302 芯片写函数,指定写入地址,数据
{
RST=0;
SCLK=0;
RST=1;
write_byte(add);
write_byte(dat);
SCLK=1;
RST=0;
}
uchar read_1302(uchar add) //从 1302 读数据函数,指定读取数据来源地址
{
uchar temp;
RST=0;
SCLK=0;
RST=1;
write_byte(add);
temp=read_byte();
SCLK=1;
RST=0;
return(temp);
}
uchar BCD_Decimal(uchar bcd)//BCD 码转十进制函数,输入 BCD,返回十进制
{
uchar Decimal;
Decimal=bcd>>4;
return(Decimal=Decimal*10+(bcd&=0x0F));
}
//--------------------------------------//
void ds1302_init()//1302 芯片初始化子函数(2010-01-07,12:00:00,week4)
{
RST=0;
SCLK=0;
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x8e,0x80);//打开写保护
}
//时分秒显示子函数
void write_sfm(uchar add,uchar dat)//向 LCD 写时分秒,有显示位置加、现示数据,两个参数
{
uchar gw,sw;
gw=dat%10;//取得个位数字
sw=dat/10;//取得十位数字
write_1602com(er+add);//er 是头文件规定的值 0x80+0x40
write_1602dat(0x30+sw);//数字+30 得到该数字的 LCD1602 显示码
write_1602dat(0x30+gw);//数字+30 得到该数字的 LCD1602 显示码
}
//年月日显示子函数
void write_nyr(uchar add,uchar dat)//向 LCD 写年月日,有显示位置加数、显示数据,两个参数
{
uchar gw,sw;
gw=dat%10;//取得个位数字
sw=dat/10;//取得十位数字
write_1602com(yh+add);//设定显示位置为第一个位置+add
write_1602dat(0x30+sw);//数字+30 得到该数字的 LCD1602 显示码
write_1602dat(0x30+gw);//数字+30 得到该数字的 LCD1602 显示码
}
void write_week(uchar week)//写星期函数
{
write_1602com(yh+0x0c);//星期字符的显示位置
switch(week)
{
case 1:write_1602dat('M');//星期数为一时,显示
write_1602dat('o');
write_1602dat('n');break;
case 2:write_1602dat('T');//星期数据为二时显示
write_1602dat('u');
write_1602dat('e');break;
case 3:write_1602dat('W');//星期数据为三时显示
write_1602dat('e');
write_1602dat('d');break;
case 4:write_1602dat('T');//星期数据为四是显示
write_1602dat('h');
write_1602dat('u');break;
case 5:write_1602dat('F');//星期数据为五时显示
write_1602dat('r');
write_1602dat('i');break;
case 6:write_1602dat('S');//星期数据为六时显示
write_1602dat('t');
write_1602dat('a');break;
case 7:write_1602dat('S');//星期数据为日时显示
write_1602dat('u');
write_1602dat('n');break;
}
}
//****************键盘扫描有关函数**********************
void keyscan()
{
if(key1==0)//key1 为功能键(设置键)
{
delay(9);//延时,用于消抖动
if(key1==0)//延时后再次确认按键按下
{
delay(20);
while(!key1);
key1n++;
if(key1n==9)
key1n=1;//设置按键共有秒、分、时、星期、日、月、年、返回,8 个功能循环
switch(key1n)
{
case 1:TR0=0;//关闭定时器
write_1602com(er+0x0E);//设置按键按动一次,秒位置显示光标
write_1602com(0x0f);//设置光标为闪烁
temp=(miao)/10*16+(miao)%10;//秒数据写入 DS1302
write_1302(0x8e,0x00);
write_1302(0x80,0x80|temp);//miao
write_1302(0x8e,0x80);break;
case 2:write_1602com(er+11);//按 2 次 fen 位置显示光标
break;
case 3:write_1602com(er+8);//按动 3 次,shi
break;
case 4:write_1602com(yh+0x0e);//按动 4 次,week
break;
case 5:write_1602com(yh+0x0a);//按动 5 次,ri
break;
case 6:write_1602com(yh+0x07);//按动 6 次,yue
break;
case 7:write_1602com(yh+0x04);//按动 7 次,nian
break;
case 8:write_1602com(0x0c);//按动到第 8 次,设置光标不闪烁
TR0=1;//打开定时器
TR0=1;
temp=(miao)/10*16+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,0x00|temp);//miao 数据写入 DS1302
write_1302(0x8e,0x80);break;
}
}
}
//------------------------------加键 key2----------------------------//
if(key1n!=0)//当 key1 按下以下。再按以下键才有效(按键次数不等于零)
{
if(key2==0)//上调键
{
delay(10);
if(key2==0)
{
delay(20);
while(!key2);
switch(key1n)
{
case 1:miao++;//设置键按动 1 次,调秒
if(miao==60)
miao=0;
write_sfm(0x0D,miao);
temp=(miao)/10*16+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,temp);
write_1302(0x8e,0x80);
write_1602com(er+0x0E);
break;
case 2:fen++;
if(fen==60)
fen=0;
write_sfm(0x0A,fen);
temp=(fen)/10*16+(fen)%10;
write_1302(0x8e,0x00);
write_1302(0x82,temp);
write_1302(0x8e,0x80);
write_1602com(er+11);
break;
case 3:shi++;
if(shi==24)
shi=0;
write_sfm(7,shi);
temp=(shi)/10*16+(shi)%10;
write_1302(0x8e,0x00);
write_1302(0x84,temp);
write_1302(0x8e,0x80);
write_1602com(er+8);
break;
case 4:week++;
if(week==8)
week=1;
write_1602com(yh+0x0C) ;
write_week(week);
temp=(week)/10*16+(week)%10;
write_1302(0x8e,0x00);
write_1302(0x8a,temp);
write_1302(0x8e,0x80);
write_1602com(yh+0x0e);
break;
case 5:ri++;
if(ri==32)
ri=1;
write_nyr(9,ri);
temp=(ri)/10*16+(ri)%10;
write_1302(0x8e,0x00);
write_1302(0x86,temp);
write_1302(0x8e,0x80);
write_1602com(yh+10);
break;
case 6:yue++;
if(yue==13)
yue=1;
write_nyr(6,yue);
temp=(yue)/10*16+(yue)%10;
write_1302(0x8e,0x00);
write_1302(0x88,temp);
write_1302(0x8e,0x80);
write_1602com(yh+7);
break;
case 7:nian++;
if(nian==100)
nian=0;
write_nyr(3,nian);
temp=(nian)/10*16+(nian)%10;
write_1302(0x8e,0x00);
write_1302(0x8c,temp);
write_1302(0x8e,0x80);
write_1602com(yh+4);
break;
}
}
}
//------------------减键 key3,各句功能参照'加键'注释---------------
if(key3==0)
{
delay(10);
//调延时,消抖动
if(key3==0)
{
delay(20);
while(!key3);
switch(key1n)
{
case 1:miao--;
if(miao==-1)
miao=59;
write_sfm(0x0D,miao);
temp=(miao)/10*16+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,temp);
write_1302(0x8e,0x80);
write_1602com(er+0x0E);
break;
case 2:fen--;
if(fen==-1)
fen=59;
write_sfm(10,fen);
temp=(fen)/10*16+(fen)%10;
write_1302(0x8e,0x00);
write_1302(0x82,temp);
write_1302(0x8e,0x80);
write_1602com(er+11);
break;
case 3:shi--;
if(shi==-1)
shi=23;
write_sfm(7,shi);
temp=(shi)/10*16+(shi)%10;
write_1302(0x8e,0x00);
write_1302(0x84,temp);
write_1302(0x8e,0x80);
write_1602com(er+8);
break;
case 4:week--;
if(week==0)
week=7;
write_1602com(yh+0x0C);
write_week(week);
temp=(week)/10*16+(week)%10;
write_1302(0x8e,0x00);
write_1302(0x8a,temp);
write_1302(0x8e,0x80);
write_1602com(yh+0x0e);
break;
case 5:ri--;
if(ri==0)
ri=31;
write_nyr(9,ri);
temp=(ri)/10*16+(ri)%10;//十进制转换成 DS1302 要求的 DCB 码
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x86,temp);//向 DS1302 内写日期寄存器 86H 写入调整后的日期数据 BCD 码
write_1302(0x8e,0x80);//打开写保护
write_1602com(yh+10);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
break;
case 6:yue--;
if(yue==0)
yue=12;
write_nyr(6,yue);
temp=(yue)/10*16+(yue)%10; //十进制转换成 DS1302 要求的 DCB 码
write_1302(0x8e,0x00); //允许写,禁止写保护
write_1302(0x88,temp); //向 DS1302 内写月份寄存器 88H 写入调整后的月份数据 BCD 码
write_1302(0x8e,0x80); //打开写保护
write_1602com(yh+7); //因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
break;
case 7:nian--;
if(nian==-1)
nian=99;
write_nyr(3,nian);
temp=(nian)/10*16+(nian)%10; //十进制转换成 DS1302 要求的 DCB 码
write_1302(0x8e,0x00); //允许写,禁止写保护
write_1302(0x8c,temp); //向 DS1302 内写年份寄存器 8cH 写入调整后的年份数据 BCD 码
write_1302(0x8e,0x80); //打开写保护
write_1602com(yh+4); //因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
break;
}
}
}
}
}
void init()
//定时器、计数器设置函数
{
TMOD=0x11;
//指定定时/计数器的工作方式为 3
TH0=0;
//定时器 T0 的高四位=0
TL0=0;
//定时器 T0 的低四位=0
EA=1;
//系统允许有开放的中断
ET0=1;
//允许 T0 中断
TR0=1;
//开启中断,启动定时器
}
//*******************主函数**************************
void main()
{
lcd_init(); //调用液晶屏初始化子函数
ds1302_init(); //调用 DS1302 时钟的初始化子函数
init(); //调用定时计数器的设置子函数
delay(80);
while(1)
//无限循环下面的语句:
{
keyscan();
//调用键盘扫描子函数
}
}
void timer0() interrupt 1 //取得并显示日历和时间
{ //读取秒时分周日月年七个数据(DS1302 的读寄存器与写寄存器不一样)
miao = BCD_Decimal(read_1302(0x81));
fen = BCD_Decimal(read_1302(0x83));
shi = BCD_Decimal(read_1302(0x85));
ri = BCD_Decimal(read_1302(0x87));
yue = BCD_Decimal(read_1302(0x89));
nian=BCD_Decimal(read_1302(0x8d));
week=BCD_Decimal(read_1302(0x8b));
//显示秒、时、分数据:
write_sfm(13,miao); //秒,从第二行第 8 个字后开始显示(调用时分秒显示子函数)
write_sfm(10,fen); //分,从第二行第 5 个字符后开始显示
write_sfm(7,shi); //小时,从第二行第 2 个字符后开始显示
//显示日、月、年数据:
write_nyr(9,ri); //日期,从第二行第 9 个字符后开始显示
write_nyr(6,yue); //月份,从第二行第 6 个字符后开始显示
write_nyr(3,nian); //年,从第二行第 3 个字符后开始显示
write_week(week);
}
⑸ 单片机的最小系统晶振电路的两个电阻作用,为什么
晶振电路需要2个10-30pF级别的电容作为起振用途,10-30pF具体的值根据不同的晶振频率不同的单片机而有所不同,作用都是使晶振起振,如果去掉这2个电容,晶振就不会起振,就没有频率输出,单片机就不会工作。这样说你懂了吗?
也有串并连电阻的案例,正常我们不需要那么做,官方的Deom里也是没有的,以下内容来自网络,讲解的很详细,你可以自习读读,以后对这部分电路会有更详细的认识。
一份电路在其输出端串接了一个22K的电阻,在其输出端和输入端之间接了一个10M的电阻,这是由于连接晶振的芯片端内部是一个线性运算放大器,将输入进行反向180度输出,晶振处的负载电容电阻组成的网络提供另外180度的相移,整个环路的相移360度,满足振荡的相位条件,同时还要求闭环增益大于等于1,晶体才正常工作。
晶振输入输出连接的电阻作用是产生负反馈,保证放大器工作在高增益的线性区,一般在M欧级,输出端的电阻与负载电容组成网络,提供180度相移,同时起到限流的作用,防止反向器输出对晶振过驱动,损坏晶振。
和晶振串联的电阻常用来预防晶振被过分驱动。晶振过分驱动的后果是将逐渐损耗减少晶振的接触电镀,这将引起频率的上升,并导致晶振的早期失效,又可以讲drive level调整用。用来调整drive level和发振余裕度。
Xin和Xout的内部一般是一个施密特反相器,反相器是不能驱动晶体震荡的.因此,在反相器的两端并联一个电阻,由电阻完成将输出的信号反向 180度反馈到输入端形成负反馈,构成负反馈放大电路.晶体并在电阻上,电阻与晶体的等效阻抗是并联关系,自己想一下是电阻大还是电阻小对晶体的阻抗影响小大?
电阻的作用是将电路内部的反向器加一个反馈回路,形成放大器,当晶体并在其中会使反馈回路的交流等效按照晶体频率谐振,由于晶体的Q值非常高,因此电阻在很大的范围变化都不会影响输出频率。过去,曾经试验此电路的稳定性时,试过从100K~20M都可以正常启振,但会影响脉宽比的。
晶体的Q值非常高, Q值是什么意思呢? 晶体的串联等效阻抗是 Ze = Re + jXe, Re<< |jXe|, 晶体一般等效于一个Q很高很高的电感,相当于电感的导线电阻很小很小。Q一般达到10^-4量级。
避免信号太强打坏晶体的。电阻一般比较大,一般是几百K。
串进去的电阻是用来限制振荡幅度的,并进去的两颗电容根据LZ的晶振为几十MHZ一般是在20~30P左右,主要用与微调频率和波形,并影响幅度,并进去的电阻就要看 IC spec了,有的是用来反馈的,有的是为过EMI的对策
可是转化为 并联等效阻抗后,Re越小,Rp就越大,这是有现成的公式的。晶体的等效Rp很大很大。外面并的电阻是并到这个Rp上的,于是,降低了Rp值 -----> 增大了Re -----> 降低了Q
精确的分析还可以知道,对频率也会有很小很小的影响。
总结并联电阻的四大作用:
1、配合IC内部电路组成负反馈、移相,使放大器工作在线性区;
2、限流防止谐振器被过驱;
3、并联降低谐振阻抗,使谐振器易启动;
4、电阻取值影响波形的脉宽。
有源晶振与无源晶振以及无源晶振起振电容的选择:
无源晶振(Crystal):内只有一片按一定轴向切割的石英晶体薄片,供接入运放(或微处理器的Xtal端)以形成振荡。(依靠配合其他IC内部振荡电路工作)
有源晶振(Oscillator):内带运放,工作在最佳状态,送入电源后,可直接输出一定频率的等副正弦波。(晶振+振动电路,封装在一起,加上电源,就有波形输出)
1.无源晶振是有2个引脚的无极性元件,需要借助于时钟电路才能产生振荡信号,自身无法振荡起来 无源晶振需要用DSP片内的振荡器,在datasheet上有建议的连接方法。无源晶振没有电压的问题,信号电平是可变的,也就是说是根据起振电路来决定的,同样的晶振可以适用于多种电压,可用于多种不同时钟信号电压要求的DSP,而且价格通常也较低,因此对于一般的应用如果条件许可建议用晶体,这尤其适合于产品线丰富批量大的生产者。无源晶振相对于晶振而言其缺陷是信号质量较差,通常需要精确匹配外围电路(用于信号匹配的电容、电感、电阻等),更换不同频率的晶体时周边配置电路需要做相应的调整。使用时建议采用精度较高的石英晶体,尽可能不要采用精度低的陶瓷晶体。
2.有源晶振有4只引脚,是一个完整的振荡器,里面除了石英晶体外,还有晶体管和阻容元件 。有源晶振不需要DSP的内部振荡器,信号质量好,比较稳定,而且连接方式相对简单(主要是做好电源滤波,通常使用一个电容和电感构成的PI型滤波网络,输出端用一个小阻值的电阻过滤信号即可),不需要复杂的配置电路。相对于无源晶体,有源晶振的缺陷是其信号电平是固定的,需要选择好合适输出电平,灵活性较差,价格相对较高。对于时序要求敏感的应用,还是有源的晶振好,因为可以选用比较精密的晶振,甚至是高档的温度补偿晶振。有些DSP内部没有起振电路,只能使用有源的晶振,如TI的6000系列等。有源晶振相比于无源晶体通常体积较大,但现在许多有源晶振是表贴的,体积和晶体相当,有的甚至比许多晶体还要小。
在电子学上,通常将含有晶体管元件的电路称作“有源电路”(如有源音箱、有源滤波器等),而仅由阻容元件组成的电路称作“无源电路”。电脑中的晶体振荡器也分为无源晶振和有源晶振两种类型。无源晶振与有源晶振的英文名称不同,无源晶振为crystal(晶体),而有源晶振则叫做oscillator(振荡器)。无源晶振是有2个引脚的无极性元件,需要借助于时钟电路才能产生振荡信号,自身无法振荡起来,所以“无源晶振”这个说法并不准确;有源晶振有4只引脚,是一个完整的振荡器,其中除了石英晶体外,还有晶体管和阻容元件,因此体积较大。
有源晶振型号纵多,而且每一种型号的引脚定义都有所不同,接发也不同,下面我介绍一下有源晶振引脚识别,以方便大家
有个点标记的为1脚,按逆时针(管脚向下)分别为2、3、4。
有源晶振通常的用法:一脚悬空,二脚接地,三脚接输出,四脚接电压。
有源晶振不需要DSP的内部振荡器,信号质量好,比较稳定,而且连接方式相对简单(主要是做好电源滤波,通常使用一个电容和电感构成的PI型滤波网络,输出端用一个小阻值的电阻过滤信号即可),不需要复杂的配置电路。相对于无源晶体,有源晶振的缺陷是其信号电平是固定的,需要选择好合适输出电平,灵活性较差,而且价格高。
有源晶振是右石英晶体组成的,石英晶片之所以能当为振荡器使用,是基于它的压电效应:在晶片的两个极上加一电场,会使晶体产生机械变形;在石英晶片上加上交变电压,晶体就会产生机械振动,同时机械变形振动又会产生交变电场,虽然这种交变电场的电压极其微弱,但其振动频率是十分稳定的。当外加交变电压的频率与晶片的固有频率(由晶片的尺寸和形状决定)相等时,机械振动的幅度将急剧增加,这种现象称为“压电谐振”。
压电谐振状态的建立和维持都必须借助于振荡器电路才能实现。图3是一个串联型振荡器,晶体管T1和T2构成的两级放大器,石英晶体XT与电容C2构成LC电路。在这个电路中,石英晶体相当于一个电感,C2为可变电容器,调节其容量即可使电路进入谐振状态。该振荡器供电电压为5V,输出波形为方波。
有源晶振型号纵多,而且每一种型号的引脚定义都有所不同,接发也不同,下面我介绍一下有源晶振引脚识别,以方便大家
有个点标记的为1脚,按逆时针(管脚向下)分别为2、3、4。
有源晶振通常的用法:一脚悬空,二脚接地,三脚接输出,四脚接电压。
有源晶振不需要DSP的内部振荡器,信号质量好,比较稳定,而且连接方式相对简单(主要是做好电源滤波,通常使用一个电容和电感构成的PI型滤波网络,输出端用一个小阻值的电阻过滤信号即可),不需要复杂的配置电路。相对于无源晶体,有源晶振的缺陷是其信号电平是固定的,需要选择好合适输出电平,灵活性较差,而且价格高。
有源晶振是右石英晶体组成的,石英晶片之所以能当为振荡器使用,是基于它的压电效应:在晶片的两个极上加一电场,会使晶体产生机械变形;在石英晶片上加上交变电压,晶体就会产生机械振动,同时机械变形振动又会产生交变电场,虽然这种交变电场的电压极其微弱,但其振动频率是十分稳定的。当外加交变电压的频率与晶片的固有频率(由晶片的尺寸和形状决定)相等时,机械振动的幅度将急剧增加,这种现象称为“压电谐振”。
压电谐振状态的建立和维持都必须借助于振荡器电路才能实现。
石英晶体振荡器的频率稳定度可达10^-9/日,甚至10^-11。例如10MHz的振荡器,频率在一日之内的变化一般不大于0.1Hz。因此,完全可以将晶体振荡器视为恒定的基准频率源(石英表、电子表中都是利用石英晶体来做计时的基准频率)。从PC诞生至现在,主板上一直都使用一颗14.318MHz的石英晶体振荡器作为基准频率源。 主板上除了这颗14.318MHz的晶振,还能找到一颗频率为32.768MHz的晶振,它被用于实时时钟(RTC)电路中,显示精确的时间和日期
方形有源晶振引脚分布:
1、正方的,使用DIP-8封装,打点的是1脚。
1-NC; 4-GND; 5-Output; 8-VCC
2、长方的,使用DIP-14封装,打点的是1脚。
1-NC; 7-GND; 8-Output; 14-VCC
BTW:
1、电源有两种,一种是TTL,只能用5V,一种是HC的,可以3.3V/5V
2、边沿有一个是尖角,三个圆角,尖角的是一脚,和打点一致。
Vcc out
NC(点) GND
现在提供一些实际数据:
测试样品为TOYOCOM的711SC 1.000M的输出频率,1脚悬空,2脚接地,3脚输出,4叫接+5V;
1.4V就开始起振,峰值电压1.64V,但是工作频率会有一定的偏差;3V时峰值电压3.24V,工作频率1.000M,输出频率准确;5V时峰值电压为5.6V,工作频率1.000M,输出频率准确
关于晶振的匹配电容问题
晶振还是晶体?
晶振的话好像不用电容吧?
晶体的话0.1u和0.01u的电容有些大了,
一般应该100p到20p之间
nod
晶振的标称值在测试时有一个“负载电容”的条件,在工作时满足这个条件,振荡频率才与标称值一致。一般来讲,有低负载电容(串联谐振晶体)
高负载电容(并联谐振晶体)之分。在电路上的特征为:晶振串一只电容跨接在IC两只脚上的,则为串联谐振型;一只脚接IC,一只脚接地的,则为并联型。如确实没有原型号,需要代用的可采取串联谐振型电路上的电容再并一个电容,并联谐振电路上串一只电容的措施。例如:4.433MHz晶振,并一只3300PF电容或串一只70P的微调电容。另一种说法是“损耗值”与“激励电平”之说:
其实,上述原因都可以作为选择晶振的条件作为考虑。
常见的晶振大多是二只脚,3脚的晶振是一种集晶振和电容为一体的复合元件。由于在集成电路振荡端子外围电路中总是以一个晶振(或其它谐振元件)和两个电容组成回路,为便于简化电路及工艺,人们便研制生产了这种复合件。其3个引脚中,中间的1个脚通常是2 个电容连接一起的公共端,另外2个引脚即为晶振两端,也是两个电容各自与晶振连接的两端。由此可见,这种复合件可用一个同频率晶振和两个100~200pF的瓷片电容按常规连接后直接予以代换。
*********************************************************************************
怎样选择一款合适的晶体振荡器21ic.com
发信站: 瀚海星云 (2003年11月04日10:18:05 星期二), 站内信件
---- 本文介绍了一些足以表现出一个晶体振荡器性能高低的技术指标,了解这些指标的含义,将有助于通讯设计工程师顺利完成设计项目,同时也可以大大减少整机
---- 总频差:在规定的时间内,由于规定的工作和非工作参数全部组合而引起的晶体振荡器频率与给定标称频率的最大频差。
---- 说明:总频差包括频率温度稳定度、频率温度准确度、频率老化率、频率电源电压稳定度和频率负载稳定度共同造成的最大频差。一般只在对短期频率稳定度关心,而对其他频率稳定度指标不严格要求的场合采用。例如:精密制导雷达。
---- 频率温度稳定度:在标称电源和负载下,工作在规定温度范围内的不带隐含基准温度或带隐含基准温度的最大允许频偏。
---- fT=±(fmax-fmin)/(fmax+fmin)
---- fTref =±MAX[|(fmax-fref)/fref|,|(fmin-fref)/fref|] fT:频率温度稳定度(不带隐含基准温度)
---- fTref:频率温度稳定度(带隐含基准温度)
---- fmax :规定温度范围内测得的最高频率
---- fmin:规定温度范围内测得的最低频率
---- fref:规定基准温度测得的频率
---- 说明:采用fTref指标的晶体振荡器其生产难度要高于采用fT指标的晶体振荡器,故fTref指标的晶体振荡器售价较高。
---- 几种电子系统使用的晶体振荡器典型频率温度稳定度指标见下表:
---- 表中有一部分频率温度稳定度指标应是带隐含基准温度的频率温度稳定度指标,但没表示出来。 (1ppm=1×10-6;1ppb=1×10-9)。
---- 频率稳定预热时间:以晶体振荡器稳定输出频率为基准,从加电到输出频率小于规定频率允差所需要的时间。
---- 说明:在多数应用中,晶体振荡器是长期加电的,然而在某些应用中晶体振荡器需要频繁的开机和关机,这时频率稳定预热时间指标需要被考虑到(尤其是对于在苛刻环境中使用的军用通讯电台,当要求频率温度稳定度≤±0.3ppm(-45℃~85℃),采用OCXO作为本振,频率稳定预热时间将不少于5分钟,而采用DTCXO只需要十几秒钟)。
---- 频率老化率:在恒定的环境条件下测量振荡器频率时,振荡器频率和时间之间的关系。这种长期频率漂移是由晶体元件和振荡器电路元件的缓慢变化造成的,可用规定时限后的最大变化率(如±10ppb/天,加电72小时后),或规定的时限内最大的总频率变化(如:±1ppm/(第一年)和±5ppm/(十年))来表示。
---- 说明:TCXO的频率老化率为:±0.2ppm~±2ppm(第一年)和±1ppm~±5ppm(十年)(除特殊情况,TCXO很少采用每天频率老化率的指标,因为即使在实验室的条件下,温度变化引起的频率变化也将大大超过温度补偿晶体振荡器每天的频率老化,因此这个指标失去了实际的意义)。OCXO的频率老化率为:±0.5ppb~±10ppb/天(加电72小时后),±30ppb~±2ppm(第一年),±0.3ppm~±3ppm(十年)。
---- 频率压控范围:将频率控制电压从基准电压调到规定的终点电压,晶体振荡器频率的最小峰值改变量。
---- 说明:基准电压为+2.5V,规定终点电压为+0.5V和+4.5V,压控晶体振荡器在+0.5V频率控制电压时频率改变量为-110ppm,在+4.5V频率控制电压时频率改变量为+130ppm,则VCXO电压控制频率压控范围表示为:≥±100ppm(2.5V±2V)。
---- 压控频率响应范围:当调制频率变化时,峰值频偏与调制频率之间的关系。通常用规定的调制频率比规定的调制基准频率低若干dB表示。
---- 说明:VCXO频率压控范围频率响应为0~10kHz。
---- 频率压控线性:与理想(直线)函数相比的输出频率-输入控制电压传输特性的一种量度,它以百分数表示整个范围频偏的可容许非线性度。
---- 说明:典型的VCXO频率压控线性为:≤±10%,≤±20%。简单的VCXO频率压控线性计算方法为(当频率压控极性为正极性时):
---- 频率压控线性=±((fmax-fmin)/ f0)×100%
---- fmax:VCXO在最大压控电压时的输出频率
---- fmin:VCXO在最小压控电压时的输出频率
---- f0:压控中心电压频率
---- 单边带相位噪声£(f):偏离载波f处,一个相位调制边带的功率密度与载波功率之比。
*****************************************************************************************
请问单片机晶震旁的2个电容有什么要求吗?
这个是晶体的匹配电容,只有在外部所接电容为匹配电容的情况下,
振荡频率才能保证在标称频率附近的误差范围内。
最好按照所提供的数据来,如果没有,一般是30pF左右。太小了不容易
起振。
在某些情况下,也可以通过调整这两个电容的大小来微调振荡频率,当然
可调范围一般在10ppm量级。