精品推荐电子科技大学实验报告Word版 可编辑Word文件下载.docx
《精品推荐电子科技大学实验报告Word版 可编辑Word文件下载.docx》由会员分享,可在线阅读,更多相关《精品推荐电子科技大学实验报告Word版 可编辑Word文件下载.docx(17页珍藏版)》请在冰豆网上搜索。
选亮数码管采用动态扫描显示。
所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的。
原理图
(一)
蜂鸣器工作原理:
蜂鸣器是一种一体化结构的电子讯响器,本文介绍如何用单片机驱动蜂鸣器,他广泛应用于计算机、打印机、复印机、报警器、电话机等电子产品中作发声器件。
蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。
电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。
接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。
压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。
多谐振荡器由晶体管或集成电路构成,当接通电源后(~15V直流工作电压),多谐振荡器起振,输出~的音频信号,阻抗匹配器推动压电蜂鸣片发声。
原理图
(二)
I2C工作原理:
在I2C总线上每传输一位数据,都有一个时钟脉冲相对应,其逻辑“0”和“1”的信号电平取决于该点的正端电源VDD的电压。
I2C总线数据传输时,在时钟线高电平期间数据线上必须保持有稳定的逻辑电平状态,高电平为数据1,低电平为数据0。
只有在时钟线为低电平时,才允许数据线上的电平变化。
I2C总线数据传送时有两种时序状态被分别定义为起始信号和终止信号。
起始信号:
在时钟线保持高电平期间,数据线在由高电平到低电平变化时启动I2C总线,为I2C总线的起始信号。
终止信号:
在时钟线保持高电平期间,数据线在由低电平到高电平变化时将停止I2C总线的数据传送,为I2C总线的终止信号。
起始信号和终止信号都是由主控制器产生。
总线上带有I2C总线接口的器件很容易检测到这些信号。
但是对于不具备这些硬件接口的单片机来说,为了能准确地检测到这些信号,必须保证在总线的一个时钟周期内对数据线至少进行两次采样。
原理图(三)
LM75特征及应用:
LM75温度传感器包含一个模数转换器和一个数字过热检测器。
主机可通过器件的I2C接口读取温度数据。
当超出设置的温度门限时漏极开路的过热输出吸收电流。
OS输出具体2种模式,比较器或中断模式。
主机控制报警触触发门限和带回温度,低于带回温度报警条件无效。
主机可读写LM75的TOS和THYST寄存器,器件上电时进入比较器模式,默认条件下TOS=+80且THYST=75。
原理图(四)
电机驱动原理:
步进电机为一四相步进电机,采用单极性直流电源供电。
只要对步进电机的各相绕组
按合适的时序通电,就能使步进电机步进转动。
四相步进电机按照通电顺序的不同,可分为单四拍、双四拍、八拍三种工作方式。
单四拍与双四拍的步距角相等,但单四拍的转动力矩小。
八拍工作方式的步距角是单四拍与双四拍的一半,因此,八拍工作方式既可以保持较高的转动力矩又可以提高控制精度。
原理图(五)
3、软件设计
(完成程序框图)
(三)思考题
设定温度的按键改用外部中断模式,电路如何修改(画示意图)?
程序如何修改,写出中断服务程序。
一、总结及心得体会
通过一个星期的学习和实践,我从只能点亮一个LED灯到可以按照实验要求完成流水灯。
在每一个小小的实现项目的完成,感觉自己都在一步一步的成长,虽然有的时候非常烦躁,实验结果老是出不来,而且找不到原因,并且被老师骂的一塌糊涂。
但是,我还是坚持下来了。
坚持着完成一个个小项目,这样自己的信心也一步一步增加。
使得我很快就完成了实验。
在此,需要谢谢老师的谆谆教导。
二、对本实验过程及方法、手段的改进建议
无
三、附录
综合实验程序:
#include<
>
sbitKEY1=P2^0;
sbitKEY2=P2^1;
sbitPWM=P2^6;
sbitCS=P3^5;
sbitDAT=P3^6;
sbitCLK=P3^7;
unsignedcharKeyScan()
{
unsignedchark='
\0'
;
if(KEY1==0)k='
+'
if(KEY2==0)k='
-'
returnk;
}
//定义显示缓冲区(由定时中断程序自动扫描)
unsignedcharDispBuf[8];
unsignedchartemp;
unsignedcharSpeed;
//预设的电机转速值,范围20~250
bitSWTR;
//软件定时器运行标志
bitSWTF;
//软件定时器溢出标志
unsignedintSWTV;
/*
函数:
T1INTSVC()
功能:
定时器T1的中断服务函数
*/
voidT1INTSVC()interrupt3
codeunsignedcharcom[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
staticunsignedcharn=0;
staticunsignedchart=0;
//扫描数码管
P0=0xFF;
//暂停显示
XBYTE[0xE800]=~DispBuf[n];
//更新扫描数据
P0=~com[n];
//重新显示
n++;
n&
=0x07;
//产生PWM方波,驱动电机
t++;
if(t<
Speed)
{
PWM=1;
}
else
PWM=0;
//模拟一个软件定时器
if(SWTR)
if(--SWTV==0)SWTF=1;
DispClear()
清除数码管的所有显示
voidDispClear()
unsignedchari;
for(i=0;
i<
8;
i++)
DispBuf[i]=0x00;
DispChar()
在数码管上显示字符
参数:
x:
数码管的坐标位置(0~7)
c:
要显示的字符(仅限16进制数字和减号)
dp:
是否显示小数点,0-不显示,1-显示
voidDispChar(unsignedcharx,unsignedcharc,bitdp)
codeunsignedcharTab[]=
{//定义09AbCdEF的数码管字型数据
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71
};
unsignedchart;
//临时变量
//防止显示位置超出范围
x&
x=7-x;
//分析字符c,取得对应的数码管字型数据
if(c=='
)
t=0x40;
t=toint(c);
//toint()为库函数,详见C:
\Keil\C51\HLP\
if(t<
16)//如果是16进制字符
{
t=Tab[t];
//查表,取得数码管字型数据
}
else
t=0x00;
//如果是其它字符则显示为空白
//检查是否显示小数点
if(dp)
t|=0x80;
t&
=0x7F;
//送到显示缓冲区显示
DispBuf[x]=t;
DispStr()
在数码管上显示字符串
显示的起始位置(0~7)
*s:
要显示的字符串(内容仅限16进制数字和减号)
voidDispStr(unsignedcharx,unsignedcharidata*s)
unsignedcharc;
for(;
)
c=*s++;
if(c=='
)break;
DispChar(x++,c,0);
ByteToStr()
字节型变量c转换为十进制字符串
voidByteToStr(unsignedcharidata*s,unsignedcharc)
codeunsignedcharTab[]={10,1};
2;
t=c/Tab[i];
*s++='
0'
+t;
c-=t*Tab[i];
*s++='
+c;
*s='
DispInit()
数码管扫描显示初始化
voidDispInit()
DispClear();
//初始为全灭
EA=0;
/*
TMOD&
=0x0F;
TMOD|=0x10;
TH1=0xFC;
TL1=0x66;
*/
TR1=1;
ET1=1;
EA=1;
Delay()
延时~
t>
0时,延时(t*s
t=0时,延时
说明:
晶振用
voidDelay(unsignedintt)
SWTV=t;
//软件定时器赋初值
SWTR=1;
//启动软件定时器
while(!
SWTF);
//等待溢出
SWTR=0;
//停止软件定时器
SWTF=0;
//清除溢出标志
unsignedcharMeasureSpeed()
TH0=TL0=0;
//清除计数器T0
TR0=1;
//启动计数器T0
Delay(2500);
//延时250ms(因为直流电机转盘上正好有4个槽)
TR0=0;
//停止计数
TF0=0;
//清除(可能的)溢出标志
returnTL0;
//返回结果(单位:
转/秒;
已知电机转速不会超过100)
SysInit()
系统初始化
voidSysInit()
=0xF0;
TMOD|=0x01;
//设置定时器T0为16位定时器
DispInit();
//数码管扫描显示初始化
//数码管初始化为全灭
Speed=35;
//设置电机初始转速
SWTV=0;
TMOD|=0x20;
//设置T1为8位定时器,自动重装
TH1=TL1=0xA4;
//设置T1初值,对应100μs
//使能T1中断
//启动T1
//使能总中断
TMOD|=0x05;
unsignedcharReadAdc()
unsignedchard;
unsignedcharn;
CS=0;
n=5;
while(--n!
=0);
n=8;
do
d<
<
=1;
if(DAT)d++;
CLK=1;
CLK=0;
}while(--n!
CS=1;
returnd;
voidmain()
{
codeunsignedchars[]="
"
codeunsignedcharw[]="
21"
unsignedcharx;
unsignedchark;
unsignedcharspd;
unsignedcharr[3];
unsignedcharv;
unsignedcharSW;
unsignedcharGW;
bitdp;
SysInit();
dp=0;
//TMOD&
//TMOD|=0x01;
for(;
temp=0x00000001;
k=KeyScan();
if(k=='
)
break;
for(i=0;
P1=~temp;
temp<
=1;
k=KeyScan();
for(x=0;
x<
x++)
{
DispChar(x,'
dp);
k=KeyScan();
}
DispChar(7-i,s[i],dp);
k=KeyScan();
Delay(5000);
P1=~(temp&
0x00000000);
for(;
for(x=0;
DispChar(7-x,w[x],dp);
DispChar(1,5+'
1);
DispChar(0,0+'
0);
for(x=4;
x>
=0;
x--)
{
for(i=9;
i>
i--)
spd=MeasureSpeed();
SW=spd/10;
GW=spd%10;
DispChar(3,GW+'
DispChar(4,SW+'
Delay(1000);
DispChar(1,x+'
DispChar(0,i+'
if(i==0)break;
if(x==0)break;
if(x==0)break;
SysInit();
spd=MeasureSpeed();
SW=spd/10+'
GW=spd%10+'
DispChar(6,GW,0);
DispChar(7,SW,0);
v=ReadAdc();
//读取ADC值
SW=v/100;
GW=(v-100*SW)/10;
DispChar(1,SW+'
DispChar(0,GW+'
Speed=32+v/10;
k=KeyScan();
if(k!
='
}