单片机课程设计温度采集报警系统设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
机电工程学院单片机课程设计
任务书
设计(论文)名称:温度采集报警系统设计
专业:通信工程学生姓名:
指导教师:下达时间:2015年12 月7 日
一、课程设计任务:
1.加深对单片机硬件电路设计和软件编程的理解,结合实践进一步加深对单元电路基本功能的掌握和应用。
2.通过具体任务要求,掌握一种常用电子电路仿真的软件,使学生能利用所学理论知识完成实际电路的设计、仿真和制作。
3.学会利用单片机设计频率,了解单片机ADC的应用、LED数码管显示的设计等知识。
4.掌握51单片机软件开发环境,学会KEIL软件的使用和程序的调试方法。
二、课程设计的基本要求:
1.设计51单片机最小系统。
2.完成至少4路温度信号采集。
3.能实时显示各路温度信号值。
4.具有温度上、下限报警功能。
5.可设定系统报警温度上、下限。
6.撰写课程设计论文要求符合模板的相关要求,字数要求4000字以上。
目录
一、设计任务与要求 (1)
二、总体方案设计 (1)
三、单元电路设计与参数计算 (1)
四、总原理图 (6)
五、仿真与调试 (15)
六、性能测试与分析 (17)
七、结论与心得 (19)
八、参考文献 (19)
温度采集报警系统设计
一、设计任务与要求
(一)设计任务
(1) 以单片机为核心,设计一个温度采集报警系统设计;
(2) 完成至少4路温度信号采集。
(3) 能实时显示各路温度信号值。
(4) 具有温度上、下限报警功能。
(5) 可设定系统报警温度上、下限。
(二)设计要求
(1)根据功能要求选择设计方案,并进行论证;
(2)画出电路的总体方框图和电路原理图;
(3)说明系统工作原理,对系统进行调试;
(4)写出课程设计报告。
二、总体方案设计
1 总体设计思路
(1)采用单片机作为数据处理与控制单元,为了进行数据处理,单片
机控制温度传感器,把温度信号通过模数转换模块(ADC0808)从温度传感器传递到单片机.单片机进行数据处理之后发出控制信号改变报警和控制执行模块的状态,同时将当前温度信息发送到数码管进行显示.
(2)通过四个按键控制四路温度采集的切换.
(3)通过两个按键来调节温度上下限,当采集到的温度超过设定的数
值是,启动蜂鸣器发出报警信号,同时点亮发光二极管.
2 总体设计原理
八路模拟信号数值测量显示电路由A/D转换、数据处理及显示控制等组成。
三、单元电路设计与参数计算
(一)AT89C51单片机介绍
图(一)AT89C51单片机最小系统及其连接
图(二)AT89C51单片机片内结构
1 AT89C51简介
AT89C51是一种带4K字节FLASH存储器的低电压、高性能CMOS 8位微处理器,俗称单片机,AT89C51 提供以下标准功能:4k字节Flash 闪速存储器,128字节内部RAM,32个I/O 口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。
同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。
空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。
掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。
2 AT89C51单片机的并行I/O端口
(1)P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门
电流。
当P0口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。
在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须接上拉电阻。
(2)P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为低八位地址接收。
(3)P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
(4)P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
(二)ADC0808的介绍
图(三)ADC0808及其连接
ADC0808是采样分辨率为8位的、以逐次逼近原理进行模/数转换的器
件。
其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。
ADC0808是ADC0809的简化版本,功能基本相同。
一般在硬件仿真时采用ADC0808进行A/D转换,实际使用时采用ADC0809进行A/D转换。
有28条引脚,采用双列直插式封装,如图(三)所示.
(三)LED数码管简介
图(四)led数码管
LED数码管根据LED的接法不同分为共阴和共阳两类,了解LED的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。
右图是共阳极数码管及其的内部电路,它们的发光原理是一样的,只是它们的电源极性不同而已。
将多只LED的阴极连在一起即为共阴式,而将多只LED的阳极连在一起即为共阳式。
(三)温度采集电路:
图(五)温度采集电路
本系统采用铂热电阻PT100作为温度传感器,它的阻值会随着温度的变
化而改变。
PT后的100即表示它在0℃时阻值为100欧姆,在100℃欧姆。
当PT100在0摄氏度的时候他的阻值为100欧姆,它的阻值会随着温度上升而成近似匀速的增长。
Ω/℃的特性,可计算出当前的温度值。
(四)按键电路
图(五)按键电路连接
如图所示,k1,k2为四路温度采集电路的切换按键。
当无按键按下时时,第一路采集电路导通;当K1按下时,第二路采集电路导通;当K2按下时,第三路采集电路导通;当K1和K2同时按下时,第四路采集电路导通。
JIA按键为调节温度上限按键,JIAN按键为调节温度下限按键。
(五)报警电路
图(六)报警电路
当前采集到的温度如果超过或者低于设定的温度上下限,则led灯发光同时蜂鸣器发出报警信号。
四、总原理图
(一)硬件电路
图(七)整体模块
图(八)总体硬件电路图(二)软件程序
#include<reg51.h>
sbit START=P2^0; //IO口定义
sbit EOC=P2^1;
sbit OE=P2^2;
sbit adda=P2^4;
sbit addb=P2^5;
sbit addc=P2^6;
sbit buzzer=P2^3; //蜂鸣器定义
sbit led=P2^7; //LEd定义
sbit wei1=P0^3; //位选定义
sbit wei2=P0^2;
sbit wei3=P0^1;
sbit wei4=P0^0;
sbit k1=P0^4;
sbit k2=P0^5;
sbit Jia=P0^6; //加键定义
sbit Jian=P0^7; //减键定义
unsigned char ad_data,t;
char count;
unsigned char keynum;
unsigned char dis[4]={0x00,0x00,0x00,0x00};
/*用来放AD转换处理结果值*/
unsigned char code dis_7[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x 40};
/* 共阴LED段码表对应 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-" */
void delay(unsigned int t) //11微秒延时函数
{
for(;t>0;t--)
{
;
}
}
void delay10ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=5;c>0;c--)
for(b=4;b>0;b--)
for(a=248;a>0;a--);
}
void AdDisplay() //AD转换显示
{
wei4=0;P3=dis_7[dis[0]]; delay(90);wei4=1;
wei3=0;P3=dis_7[dis[1]]|0x80; delay(90);wei3=1; //加入小数点
wei2=0;P3=dis_7[dis[2]]; delay(90);wei2=1;
wei1=0;P3=dis_7[dis[3]]; delay(90);wei1=1;
}
void adc0809() //AD转换
{
P1=0xff; //读取P1口之前先给其写全1
START=0;
START=1;
START=0;
while(EOC==0);
OE=1;
ad_data=P1; //AD数据读取赋给P1口
OE=0;
}
/*---------AD转换结果处理--------*/
{
char t_temp;
unsigned char i;
ad_data=ad_data-0x83;
t_temp=ad_data*2-4;
if((t_temp>count)&&(count>0)) //大于上限设定值,则开启报警装置{
for(i=0;i<50;i++)
{
led=~led;
buzzer=~buzzer;
}
buzzer=1;
}
else
{
led=1;
buzzer=0;
}
if((t_temp<count)&&(count<0)) //小于下限设定值,则开启报警装置{
for(i=0;i<50;i++)
{
led=~led;
buzzer=~buzzer;
}
led=0;
buzzer=1;
}
else
{
led=1;
buzzer=0;
}
if(t_temp>0)
{
dis[3]=t_temp/100; //最高位
dis[2]=t_temp/10%10;
dis[1]=t_temp%10;
dis[0]=t%5*2; //最低位
}
{
t_temp=~(t_temp-1);
dis[3]=11;
dis[2]=t_temp/10;
dis[1]=t_temp%10;
dis[0]=t%5*2;
}
}
void CountDisplay() //count显示函数
{
if(count>0)
{
wei4=0;P3=dis_7[count%10]; delay(90);wei4=1;
wei3=0;P3=dis_7[count/10%10]; delay(90);wei3=1;
wei2=0;P3=dis_7[count/100]; delay(90);wei2=1;
}
else{
count=~(count-1); //将负数转变为正数
wei4=0;P3=dis_7[count%10]; delay(90);wei4=1;
wei3=0;P3=dis_7[count/10]; delay(90);wei3=1;
wei2=0;P3=dis_7[11]; delay(90);wei2=1;
count=(~count)+1; //将正数转变为负数
}
}
void keyscan()
{
unsigned char i;
if(keynum==0) //当设置限定值时,不能进入显示电路{
{
adda=0;
addb=0;
addc=0;
adc0809();
ad_compute();
AdDisplay();
}
if((k1==0)&&(k2==1)) //K1键按下,K2没按,显示第二路{
delay10ms();
if((k1==0)&&(k2==1))
{
adda=1;
ddb=0;
addc=0;
adc0809();
ad_compute();
AdDisplay();
}
}
if((k1==1)&&(k2==0)) //K1键没按下,K2按下,显示第三路
{
delay10ms();
if((k1==1)&&(k2==0))
{
adda=0;
addb=1;
addc=0;
adc0809();
AdDisplay();
}
}
if((k1==0)&&(k2==0)) //K1键按下,K2也按下,显示第四路{
delay10ms();
if((k1==0)&&(k2==0))
{
adda=1;
addb=1;
addc=0;
adc0809();
ad_compute();
AdDisplay();
}
}
}
if(Jia==0) //设置上限值(即加键)
{
delay10ms();
if(Jia==0)
{
count+=10;
keynum+=1;
if(count==200)
{count=10;}
i=0;
while((i<50)&&(!Jia)) //判断加键松开没有
{
i++;
wei4=0;P3=dis_7[count%10]; delay(90);wei4=1;
wei3=0;P3=dis_7[count/10%10]; delay(90);wei3=1;
wei2=0;P3=dis_7[count/100]; delay(90);wei2=1;
}
}
if(Jian==0) //设置下限值(即减键)
{
delay10ms();
if(Jian==0)
{
count-=10;
keynum+=1;
if(count==-60)
{count=0;}
i=0;
while((i<50)&&(!Jian)) //判断减键松开没有
{
i++;
delay10ms();
}
CountDisplay(); //显示count值
}
}
if(keynum!=0)
{
if(k2==0) //k2此时为设定值确认键(即K2按下才能结束设置)
{
delay10ms();
keynum=0;
i=0;
while((i<50)&&(!k2)) //判断K2键松开没有
{
i++;
delay10ms();
}}}
CountDisplay(); //显示count值
}}
void main() // 主程序
{count=70;
while(1)
{keyscan();
}}
五、仿真与调试
(一)第一路采集系统工作
(二)第二路温度采集系统工作(三)第三路采集系统工作
(四)第四路采集系统工作
六、性能测试与分析
把硬件电路连接完成后,进行运行,看电路连接是否正确,无开关按下时,第一路采集电路导通;当K1按下时,第二路采集电路导通;当K2按下时,第三路采集电路导通;当K1和K2同时按下时,第四路采集电路导通,再通过jia和jian调解温度上限及下限,K2充当确认值,当温度达到上限值或下限值时,LED灯点亮同时蜂鸣器发出声音。
在调试过程中主要是对程序的修改,特别是延时程序,开始延时程序较短时,数码管显示但不稳定显示温度。
通过修改程序,将延时调到适中,系统正常工作。
七、结论与心得
本次课程设计,让我受益匪浅。
对c51程序设计加深了理解和掌握,我们这次设计的要求主要单片机原理及其运用,掌握它们的初始化编程,这是一个比较全面的设计,和以前的实验相比较复杂很多,一方面要求我们设计硬件电路,另一方面需要对设计的硬件电路进行编程,这就需要软件和硬件相结合,将它们进行联调,具体的电路具体分析,让我们更加的了解
AT89C51的运用,还有如何的进行A/D转换。
在此设计中遇到了很多困难,一开始的时候,硬件电路测试都没成功,最后把所有的电路都拆了,一个一个测试,进行数据转换的时候,开始转换出来的数据都一样的,无论温度是否发生变化,经过仔细分析才知道是了一定的体会,它要求我们认真仔细的做好每个环节。
当我们接手一个课题或项目的时候,不是马上动手,而是先进行可行性论证。
首先提出方案,然后根据方案去实施,方案中的不足之处,在操作的时候进行改进,最后得到更加完美的方案。
在设计过程中,同时还加深了对单片机的了解及其运用。
将书本上的知识与实际相联合,会更好的掌握知识,学到在书本上更本学不到的内容,提高了我们的分析问题和解决问题的能力,强化了创新认识,为将来激烈的竞争打下基础,也培养了我们严肃认真的科学态度,优良的思维模式,和严谨求实的工作风。
八、参考文献
[1] 张俊谟.单片机中级教程—原理与应用. 北京航天航空大学出版社
[2] 刘大茂.智能仪器与设计.国防工业出版社
[3] 谭浩强. C程序设计. 北京:清华大学出版社
[4] 李伯成. 微型计算机原理及应用技术. 西安电子科技大学
九.课程设计进度安排
起止日期工作内容
2015年12月7日-12月8日
12月8日-6月9日
12月9日-12月11日
12月11日-12月13日题目分析,查阅资料与方案选择
原理图的绘制
编写软件程序并与仿真
撰写设计报告
十.成绩考核办法
根据学生在实习中的表现、实习报告的质量,以及各项目实习老师给予的实习鉴定综合考核评分,按按优秀、良好、中等、及格和不及格五级计分。
教研室审查意见:
教研室主任签字:
年月日二级学院意见:
主管领导签字:
年月日。