多路放大与巡回电路和教学打铃系统.docx
- 文档编号:11890780
- 上传时间:2023-06-03
- 格式:DOCX
- 页数:27
- 大小:380.30KB
多路放大与巡回电路和教学打铃系统.docx
《多路放大与巡回电路和教学打铃系统.docx》由会员分享,可在线阅读,更多相关《多路放大与巡回电路和教学打铃系统.docx(27页珍藏版)》请在冰点文库上搜索。
多路放大与巡回电路和教学打铃系统
《电子技术综合设计》
课程结题报告
题目:
多路放大与巡回测量电路
教学打铃系统
专业:
电子信息工程(防雷方向)
班级:
雷电071班
姓名:
袁蛟
贺晓曦
指导教师:
王江
评分:
2010年11月12日
1题目描述和要求
题目一:
多路放大与巡回测量电路
基本要求:
1.对八路不同的电压(0-5v)进行巡回测量
2.用按键选择输入,LED数码管显示通道号和电压值
3.路输入电压调节通过1个电位器完成。
4.测量及输出误差≤5%
扩展要求:
5.设置一路0~50mV的小信号,经放大后再采集,对应显示0~50.0。
题目二:
教学打铃系统
基本要求:
使用DS1302芯片计时,显示时、分,当设置的闹铃时间与实时时间相同,蜂鸣器定时打铃(或LED闪烁报警)。
扩展要求:
按键设置并永久保存24组定时数据。
1.1对功能及指标的理解
题目一要求对八路不同的电压进行巡回测量,并将通道和电压值输出显示到数码管上。
则需要8个阻值不同的电阻对5v进行分压,可产生明显的梯度;再将采集到的电压经转化后显示。
其中,小信号为小数点后三位数值,显示时只显示无小数点的两位值;其余电压信号显示三位有效数字。
题目二要求滚动显示时间、年、月、日,选用DS1302时钟芯片。
时钟显示按各个位数分别显示,最小显示单位为秒。
对按键进行复用可实现系统不同功能的选择。
1.2系统设计思路
图1-1系统框图
多路放大与巡回测量电路、数字钟系统框图如图1-1所示。
系统主要由单片机、时钟芯片DS1302、电压采集及数模转换、显示、按键几部分组成。
系统上电后,默认进入时间显示状态,显示时间。
通过按键可选择不同的模式。
其中,时钟模式下实现实时时钟读取显示、当前时间设置调整;电压采集模式下,实现通道选择、电压值显示。
2设计说明
2.1工作原理
2.1.1单片机最小系统模块
图2-1单片机最小系统
单片机最小系统是指单片机利用自身资源,用最少的辅助元件组成一个可以工作的系统。
包括电源(地),起振电路(晶振Y2=22.1184M),复位电路组成。
其中,晶振的两端分别接30pF的电容到地;复位电路先接10uF电容后在与地并联,起到滤波的作用。
晶振是为单片机提供起振时间,晶振越大,单片机处理速度越快。
本次设计选择22.1184M的晶振,一个机器周期大约是1uS,能够满足系统设计需求。
2.1.2显示模块
图2-2显示模块
为节省资源,在这里选择的数码管是4位共阴极数码管。
在上拉电阻的选择上,一般1K到10K比较合适,过大则亮度不够,过小则会烧掉数码管。
电压采集模块
将5V电源电压与一串8个10K的电阻串联再在末尾串联一个1K的电阻来调节电压。
其中第一个10K的R0电阻用于限流,防止5V的电压直接接到通道选择开关CD4051上将芯片烧毁。
从第二个电阻R1开始,将其电流流过后的一端接到通道选择开关CD4051上,R1-R7阻值取10K。
最后一路电压,即通过R7的电阻由于信号可能会太小,导致电压值的丢失,故将其放大50倍后再接到CD4051上,所以反馈电阻R8=51K,接地电阻R9=1K。
通过按键键值的改变,控制CD4051的地址端,就可以选择不同的电压值。
图2-3电压采集电路图
2.1.3模数转换模块
图2-4模数转换电路
ADC0804转换器的时序如下。
CS/=0时,允许进行转换。
WR/由低跳高时转换开始,8位逐次比较需用8×8=64个时钟周期,再加上控制逻辑操作,一次转换需要66~73个时钟周期。
当CS/与WR/同时有效时便启动转换,转换结束时产生信号INTR/,可供输出查询或中断信号。
在CS/和RD/共同控制下可以读取转换结果数据。
在转换过程中,如果再次启动转换器,则终止正在进行的转换,进入新的转换,在新的转换过程中,数据寄存器中仍保持上一次的转换结果。
0804转换器的零点无需调整,而输入电压的范围可以通过调整Vref/2端处的电压加以改变。
Vref端电压应为输入电压的1/2。
例如输入电压范围是0V至2V,则在Vref端应加1V,但当输入电压为0~+5V时,Vref端无需外加任何电压,而由内部电源分压得到
2.1.4时钟模块
图2-5时钟模块
DS1302是DALLAS公司推出的涓流充电时钟芯片,内含一个实时时钟/日历和31字节静态RAM,通过简单的串行接口与单片机进行通信。
实时时钟/日历电路提供秒、分、时、日、日期、月、年的信息,每月的天数和闰年天数可自动调整,时钟操作可通过AM/PM指示决定采用24或12小时格式。
此次设计中,选用DS1302将大大简化时钟的实现,节约单片机资源。
DS1302可实现与单片机进行简单的同步串行方式通信,仅需用到三个口线:
(1)RES(复位),
(2)I/O(数据线),(3)SCLK(串行时钟)。
时钟/RAM的读/写数据以一个字节或多达31个字节的字符组方式通信。
DS1302功耗很低,保持数据和时钟信息是功耗小于1mW。
同时,DS1302双电源管脚用于主要电源和备份电源供应,Vcc1为可编程涓流充电电源,附加七个字节存储器。
本次设计中,考虑到单片机I/O口的电压可能过低,不足以驱动DS1302,故将其三个管脚SCLK、I/O、RST接了上拉电阻。
R10、R11、R12为限流电阻,取其阻值为10K。
由于题目中要求数字钟能掉电保持,所以将DS1302的一个供电管脚Vcc1与地间接了一个电容。
当电压接通时,由Vcc2为DS1302供电;掉电时,由Vcc1为1302供电。
通过网上资料的查阅,C1取100u时,1302的掉电保持时间可达到1个小时,满足题目要求。
2.1.5按键模块
图2-6按键模块
此次设计中只用了三个按键,故需按键复用才能满足题目要求。
将三个按键开关K1、K2、K3分别接到单片机的P2.5、P2.6、P2.7。
单片机上电时,系统默认显示时间;在此模式下,K2、K3可实现年、月、日、分、秒的加和减来实现数字钟的时间设置。
如果K1按下,则进入电压采集模式;数码管会显示采到的电压值。
2.1.7元器件清单
序号
名称
数量
封装
1
LM324N
1
DIP14
2
CD4051BE
1
DIP16
3
STC89C52RC
1
DIP40
4
Adc0804
1
DIP20
5
1302
1
DIP8
6
共阴数码管
1
SEG
7
晶振22MHZ
1
CRYSTAL
8
晶振37KHZ
1
SIP2
9
三极管8050
1
Sip3
10
发光二极管
1
LED1
11
排阻
1
SIP9
12
滑动变阻器1K
1
CXYP
13
10K
15
AXIAL0.3
14
51K
1
AXIAL0.3
15
1K
3
AXIAL0.3
16
普通按键
3
KAI
17
150PF
1
RAD0.1
18
30PF
2
RAD0.1
19
10UF
1
RB.2/.4
2.2软件设计
2.2.1主流程及中断流程图
2.2.2与流程图相配的源程序及注解
////////////////////////////////////////////////////////////
/////函数名:
adc//////
/////函数功能:
ad采集//////
/////函数参数:
无//////
/////返回值:
无//////
////////////////////////////////////////////////////////////
voidadc()
{
floatx,y;
uintCurrent_Date;
uintz;
x=uT1.T;
y=uT2.T;
Current_Date=(x/y)*500;//计算采集到的电压
AD_OK=0;//设置模数转换标志归零
ADdata=ADdata+Current_Date;//每路电压值累加
if(++Mean_Num==10)//如果累加了10次
{
Mean_Num=0;//采集次数归零
ADdata/=10;//求10次平均值
if(road==0)//如果是小信号则单独处理
{
z=ADdata/5;
dispbuf[1]=z/100;//求电压值最高位
dispbuf[2]=z/10%10;//求电压值第二位
dispbuf[3]=z%10;//求电压值最低位
}//目的为了转换显示成毫伏的小信号
else//处理其他路信号
{
dispbuf[1]=ADdata/100;
dispbuf[2]=ADdata/10%10;
dispbuf[3]=ADdata%10;
}
ADdata=0;//累加电压值归零
}
}
voiddisplay()//**********两部分的显示模块******************
{
unsignedcharsect;
if(state)//显示电压值
{
seg7++;
seg7%=4;
P2|=0xf0;//消隐
if(seg7==1&road>0)P0=dispcode[dispbuf[seg7]]|0x80;
elseP0=dispcode[dispbuf[seg7]];
P2&=dispbit[seg7];
}
Else//显示时间
{
seg7++;
seg7%=4;
P2|=0xf0;
sect=(Scan_buff[1]*10+Scan_buff[0])/3;
switch(time_seting)//时间
{
case0:
{//默认显示时间
if((sect%4)==0)//显示秒0-59
{P0=dispcode[Scan_buff[seg7]];}
elseif((sect%4)==1)//显示时、分
{P0=dispcode[Scan_buff[4+seg7]];}
elseif((sect%4)==2)//显示月、日
{
if(seg7==2)
P0=dispcode[Scan_buff[8+seg7]]|0x80;
else
P0=dispcode[Scan_buff[8+seg7]];
}
elseif((sect%4)==3)//显示年
{P0=dispcode[Scan_buff[12+seg7]];}
break;
}
case1:
{P0=dispcode[Scan_buff[seg7]];break;}//显示设置秒
case2:
case3:
{P0=dispcode[Scan_buff[4+seg7]];break;}//显示设置时、分
case4:
case5:
{P0=dispcode[Scan_buff[8+seg7]];break;}//显示设置月、日
case6:
{P0=dispcode[Scan_buff[12+seg7]];break;}//显示设置年
}
P2&=dispbit[3-seg7];//位选
GetTime();
}
}
////////////////////////////////////////////////////////////
/////函数名:
DisposeKEY//////
/////函数功能:
按键处理//////
/////函数参数:
无//////
/////返回值:
无//////
/////////////////////////////////////////////////////////////
voidDisposeKEY()
{
switch(cKeyCode)
{
case6:
//键值为“6”,调整时间“加”模式
{
switch(time_seting)
{
case0:
break;
case1:
{
Scan_buff[0]+=1;//key1按下,秒加1
if(Scan_buff[0]>9){Scan_buff[0]=0;Scan_buff[1]+=1;}
break;
}
case2:
{
Scan_buff[4]+=1;//key1按下,分加1
if(Scan_buff[4]>9){Scan_buff[4]=0;Scan_buff[5]+=1;}
break;
}
case3:
{
Scan_buff[6]+=1;//key1按下,时加1
if(Scan_buff[6]>9){Scan_buff[6]=0;Scan_buff[7]+=1;}
break;
}
case4:
{
Scan_buff[8]+=1;//key1按下,日加1
if(Scan_buff[8]>9){Scan_buff[8]=0;Scan_buff[9]+=1;}
break;
}
case5:
{
Scan_buff[10]+=1;//key1按下,月加1
if(Scan_buff[10]>9){Scan_buff[10]=0;Scan_buff[11]+=1;}
break;
}
case6:
{
Scan_buff[12]+=1;//key1按下,年加1
if(Scan_buff[12]>9){Scan_buff[12]=0;Scan_buff[13]+=1;}
break;
}
}
if(state==1)adc();
nDelayKey=2000;/*按住键不动,可连续产生键值,相当于连续按键*/
break;
}
case5:
//键值为“5”,电压采集模式
{
if(state==0)time_seting=++time_seting%7;
elseroad=++road%8;
send_road();//调用发送通道函数,发送通道
if(state==1)adc();
nDelayKey=2000;
break;
}
case3:
//键值为“3”,调整时间“减模式”
{
if(time_seting>0)
{
switch(time_seting)
{
case1:
{
Scan_buff[0]-=1;//key3按下,秒减1
if(Scan_buff[0]>9){Scan_buff[0]=9;Scan_buff[1]-=1;}
break;
}
case2:
{
Scan_buff[4]-=1;//key3按下,分减1
if(Scan_buff[4]>9){Scan_buff[4]=9;Scan_buff[5]-=1;}
break;
}
case3:
{
Scan_buff[6]-=1;//key3按下,时减1
if(Scan_buff[6]>9){Scan_buff[6]=9;Scan_buff[7]-=1;}
break;
}
case4:
{
Scan_buff[8]-=1;//key3按下,日减1
if(Scan_buff[8]>9){Scan_buff[8]=9;Scan_buff[9]-=1;}
break;
}
case5:
{
Scan_buff[10]-=1;//key3按下,月减1
if(Scan_buff[10]>9){Scan_buff[10]=9;Scan_buff[11]-=1;}
break;
}
case6:
{
Scan_buff[12]-=1;//key3按下,年减1
if(Scan_buff[12]>9){Scan_buff[12]=9;Scan_buff[13]-=1;}
break;
}
}
}
elsestate=(++state)%2;//第一次执行,改变state的值
SetTime();
break;
}
display();//调用显示
cKeyCode=0;
}
voidmain()
{
TMOD=0x12;//定时/计数器做定时用
TH1=0;//给定时1器重装初始值,工作在模式1
TL1=0;
ET1=1;//允许T1中断
TR1=1;
TH0=-200;//8位自动重装定时器约每200uS中断1次,4608次为1秒
TL0=-200;
TR0=1;
ET0=1;//允许T0中断
IT0=1;//外部中断下降沿触发
IT1=1;
EA=1;//开总中断
send_road();/初始通道号码
DS1302_init();
while
(1)
{
if(cKeyCode)
{
DisposeKEY();//响应按键操作
}
}
}
voidT0_INT()interrupt1
{
nTimer++;
if(nTimer==13824)//满3秒,进行秒处理
{
nTimer=0;
road++;
road%=8;
send_road();
}
//*************************扫描按键******************
if(nDelayKey==0)
{
cKey=(P2&0x0e)>>1;//取键值P21、P22、P23
if(cKey!
=0x0e)nDelayKey=100;//设置延迟时间削颤
else
{
bStill=0;//是否松键标志,bStill=0代表松键,此时没有按键按下
cLongDelay=0;//按键长按时间
}//松键
}
else//有按键利用DelayKey按键消颤
{
nDelayKey--;
if(nDelayKey==0)
{
cKeyCode=(P2&0x0e)>>1;//取键值P21、P22、P23
if(cKey!
=cKeyCode)
{
cKeyCode=0;
}
}
}
display();//调用显示函数
}
/////////////////////////////////////////////////////////////////////////////////////
/////函数名:
SetTime//////
/////函数功能:
设置初始时间//////
/////调用:
WriteTo1302()//////
/////初始时间格式:
秒分时日月星期//////
/////函数参数:
无//////
/////返回值:
无//////
/////////////////////////////////////////////////////////////////////////////////////
voidSetTime()
{
uchari;
ucharAddr=0x80;
year=Scan_buff[13]*16+Scan_buff[12];
month=Scan_buff[11]*16+Scan_buff[10];
date=Scan_buff[9]*16+Scan_buff[8];
hour=Scan_buff[7]*16+Scan_buff[6];
min=Scan_buff[5]*16+Scan_buff[4];
sec=Scan_buff[1]*16+Scan_buff[0];
if(sec>0x59)sec=0;
if(min>0x59)min=0;
if(hour>0x24)hour=1;
if(date>0x31)date=1;
if(month>0x12)month=1;
Curtime[0]=sec;
Curtime[1]=min;
Curtime[2]=hour;
Curtime[3]=date;
Curtime[4]=month;
Curtime[5]=day;
Curtime[6]=year;
WriteTo1302(0x8e,0x00);//控制命令,WP=0,允许写操作//
for(i=0;i<7;i++)
{WriteTo1302(Addr,Curtime[i]);//秒分时日月星期年//
Addr+=2;}
WriteTo1302(0x8e,0x80);//控制命令,WP=1,写保护//
}
/////////////////////////////////////////////////////////////////////////////
/////函数名:
GetTime//////
/////函数功能:
读取DS1302当前时间//////
/////调用:
uc_R1302()///////
/////输入:
ucCurtime///////
/////函数参数:
有(写入的字节内容
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 放大 巡回 电路 教学 打铃 系统