当前位置:文档之家› 单片机实验报告(简易报警器)

单片机实验报告(简易报警器)

简易报警器
一、本次根据单片机课程设计题目与要求,我选择的是设计一个简易报警器。

二、课程设计要求:自制一个单片机最小系统,包括串口下载、复位电路,采用两路外部中断输入门禁和红外探测两路信号(采用两个小按键模拟),中断信号输入后能将报警信息在四位一体数码管上显示,并输出声光报警信号。

三、设计所需的硬件:0.1uF的无极性电容五个;10uF的极性电容两个;发光二极管两个;三极管9013四个;4.7千欧的排阻一个;100,1k,10k的电阻若干;芯片插座若干;11.0592MHz的晶振一个;单片机STC89C54RD芯片一块;MAX232串口芯片一块;导线若干;
四、课程设计要求是用按键红外探测和输入门禁。

但是由于实验室设备的条件,我采用的是红绿两个二极管代替红外探测的发光显示和输入门禁的报警装置。

五、总体设计思想

按键模块
振荡器是数字钟的核心。

振荡器的稳定度及频率的精确度决定了数字钟计时的准确程度,通常选用石英晶体构成振荡器电路。

石英晶体振荡器的作用是产生时间标准信号。

因此,一般采用石英晶体振荡器经过分频得到这一时间脉冲信号。

七、按键模块
鉴于使用中断电路会增加硬件电路的复杂度,本电路采用独立按键的方法,只需在程序中加入扫描程序即可。

其中P2.0接按键光标移位,P2.1接按键时间加数,P2.2接按键时间减数,P3.2接按键模拟红外探测,P3.3接按键模拟输入门禁,。

九、SPEAKER电路
报警器装置的原理就是利用P3.7出来的高低电平交换使得扬声器发出声音。

但是由于实验室的器材有限,所以我们改用了发光二极管来代替SPEAKER电路。

十、实验仿真程序如下:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table_data[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0 x00};
uchar code table_select[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar table_buffer[]={0,0};
uchar count0,count1;
sbit LEDREDCON=P0^0;
sbit LEDGREENCON=P0^1;
sbit spe=P0^2;
sbit Kint0=P3^2;
sbit Kint1=P3^3;
sbit RS=P3^7;
sbit RW=P3^6;
sbit E=P3^5;
uchar FRQ=0x00;
void delay(uint ms)
{
uchar i;
while(ms--)
{
for(i=0;i<120;i++);
}
}
void check_busy() //判断LCD忙,要不停的检测,所以需要有个大循环
{
while(1)
{
E=0; //当RS=0和RW=1时,可以读忙信号。

delay(3);
RS=0;
delay(3);
RW=1;
delay(3);
E=1;
delay(3);
if((P1&0x80)==0)
{
break;
}
E=0;
}
}
void write_command(uchar tempdata)
{
E=0; //当RS=0和RW=0时,可以写入指令或者显示地址。

delay(3);
RS=0;
delay(3);
RW=0;
P1=tempdata;
delay(3);
E=1; //此处高电平是将数据锁存起来
delay(3);
E=0;
check_busy();
}
void init_1602() //LCD1602的初始化子函数
{
write_command(0x38);//写指令
write_command(0x0c);//显示开和光标位置
write_command(0x01);//显示清屏
write_command(0x06);//显示光标移动设置
}
void write_data(uint j) //向LCD1602液晶显示器写数据
{
E=0; //当RS=1和RW=0时,可以写入数据。

delay(3);
RS=1;
delay(3);
RW=0;
P1=j;
delay(3);
E=1; //此处高电平是将数据锁存起来
delay(3);
E=0;
check_busy();
}
void init() //初始化子函数
{
TMOD = 0x11;
TH0 = 0x00;
TL0 = 0xff;
IT0 = 1;
IT1 = 1;
IE = 0x8f;//EA=1;ET1=1;EX1=0;ET0=1;EX0=1;
IP = 0x05;
TR0 = 0;
TR1 = 0;
}
void main()
{
init();
init_1602();
while(1)
{
FRQ++;
delay(10);
}
}
void external_int0() interrupt 0
{
write_command(0x01); LEDGREENCON=1; count1++;
if(count1==1)
{
if(LEDREDCON==1)
{
LEDREDCON=0;
}
else
{
LEDREDCON=1;
}
if(Kint0==0)
{
while(!Kint0);
delay(5);
LEDREDCON=0;
write_data('0');
spe=1;
}
}
if(count1==2)
{
count1=0;
LEDREDCON=1;
write_command(0x01);
}
}
void external_int1() interrupt 2 {
write_command(0x01);
LEDREDCON=1;
count0++;
if(count0==1)
{
if(LEDGREENCON==1)
{
LEDGREENCON=0;
}
else
{
LEDGREENCON=1;
}
if(Kint1==0)//低电平有效
{
while(!Kint1);
delay(5);
LEDGREENCON=0;
write_data('1');//显示数据
spe=1;
}
}
if(count0==2)
{
count0=0;
LEDGREENCON=1;
write_command(0x01);
}
}
void timer0() interrupt 1
{
TH0=0xfe;
TL0=FRQ;
spe=~spe;
}
void timer1() interrupt 3
{
TH0=-5000/256;
TL0=-5000%256;
LEDGREENCON=_crol_(LEDGREENCON,1);
LEDREDCON =_crol_(LEDREDCON,1);
}
十一、实验仿真图如下:
十二、硬件焊接及检测
在电脑上操作完成之后,我们开始硬件实现。

我按照设计好的电路图的将芯片槽口焊好,并用万能表进行检测。

电路的焊接是否虚焊,是否短路,地和电源分配。

在检查过程中,出现一个问题。

我是将芯片插好后检测,结果万能表一直报错。

我将线路一个个的排查,最后才发现原来是芯片内部出现短路。

这次的焊接,我明白了,在检测过程中如果采用分部份进行查找,检测错误的效率会大大提高。

十三、软件下载
将编好的实验程序烧到ATC89C54芯片中。

加上电源,出现实验要求的结果。

十四、课程设计的心得体会
本次实验是在上学期的单片机课程学习后的一次实践。

单片机课程主要是采用汇编语言进行编写程序,而这次我是用c语言进行编写实验程序的。

为此我在课程设计过程中,对c语言在单片机应用上花了一些时间,搞清楚了如何使用c语言编写单片机程序。

在实验仿真过程中,需要知道相关芯片的功能,这使我对一些芯片有了初步的了解,并能很好的使用这些芯片实现相关的功能。

在此次焊接板子之前,我已有过几次的焊接经验了,但每次都有不同的收获。

就这次来说吧,我认为焊接可以将一个整体分为几个模块,在一个模块焊好后就开始检验线路。

这样可以在当整体焊好之后,检查更加有效,并减小出错的概率。

相关主题