最新版单片机课程设计报告80441144.docx
《最新版单片机课程设计报告80441144.docx》由会员分享,可在线阅读,更多相关《最新版单片机课程设计报告80441144.docx(24页珍藏版)》请在冰豆网上搜索。
![最新版单片机课程设计报告80441144.docx](https://file1.bdocx.com/fileroot1/2023-2/24/304ec86f-ff98-49c4-8a20-209d44e8e787/304ec86f-ff98-49c4-8a20-209d44e8e7871.gif)
最新版单片机课程设计报告80441144
沈阳工程学院
课程设计任务书
课程设计题目:
多功能温度巡检仪程序设计
系别班级
学生姓名学号
指导教师吕勇军职称教授
课程设计进行地点:
任务下达时间:
15年1月12日
起止日期:
15年1月12日起——至15年1月23日止
系主任年月日批准
1.设计主要内容及要求;
编写多功能温度巡检仪程序。
要求:
1)多路温度测量和显示。
2)可以设置正常温度范围,越限报警。
2.对设计论文撰写内容、格式、字数的要求;
(1).课程设计论文是体现和总结课程设计成果的载体,一般不应少于3000字。
(2).学生应撰写的内容为:
中文摘要和关键词、目录、正文、参考文献等。
课程设计论文的结构及各部分内容要求可参照《沈阳工程学院毕业设计(论文)撰写规范》执行。
应做到文理通顺,内容正确完整,书写工整,装订整齐。
(3).论文要求打印,打印时按《沈阳工程学院毕业设计(论文)撰写规范》的要求进行打印。
(4).课程设计论文装订顺序为:
封面、任务书、成绩评审意见表、中文摘要和关键词、目录、正文、参考文献。
3.时间进度安排;
顺序
阶段日期
计划完成内容
备注
1
1月12日
教师讲解题目,学生查阅相关资料
2
1月13日
查阅相关资料、进行方案论证
3
1月14日
参数计算、确定温度超限设置方法
4
1月15、16、19日
编写程序
5
1月20、21日
调试程序
6
1月22日
撰写论文
7
1月23日
验收作品、答辩
中文摘要
随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度测量就是一个典型的例子。
温度测量系统广泛应用于社会生活的各个领域 ,如家电、汽车、材料、电力电子等。
但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。
本设计以C8051F020芯片为核心,辅以必要的外围电路,设计了一个简易的多路温度巡检仪。
在硬件方面,除了CPU外,系统采用DS18B20数字温度传感器测量温度,采用1602液晶显示屏显示当前温度。
然后通过三个独立按键来设置一个正常温度的范围的最小值和最大值,当温度不在设置的正常温度范围内,用于报警的蜂鸣器就会发出响声。
在软件反面,采用C语言设计,系统能够准确测量三路温度并且显示,并且具有调整温度范围和报警的功能。
此系统严格按照要求设计,最终达到预期的效果,能够测量和显示多路温度,并且可以设置正常的温度范围,超过范围具有报警功能。
是一次比较成功的设计。
关键字:
单片机测温显示报警
1课程设计要求
1.1设计主要内容及要求
编写多功能时钟程序
要求:
1)多路温度测量和显示。
2)可以设置正常温度范围,越限报警。
1.2对设计论文撰写内容、格式及字数的要求
(1).课程设计论文是体现和总结课程设计成果的载体,一般不应少于3000字。
(2).学生应撰写的内容为:
中文摘要和关键词、目录、正文、参考文献等。
课程设计论文的结构及各部分内容要求可参照《沈阳工程学院毕业设计(论文)撰写规范》执行。
应做到文理通顺,内容正确完整,书写工整,装订整齐。
(3).论文要求打印,打印时按《沈阳工程学院毕业设计(论文)撰写规范》的要求进行打印。
(4).课程设计论文装订顺序为:
封面、任务书、成绩评审意见表、中文摘要和关键词、目录、正文、参考文献。
1.3时间进度安排
3.时间进度安排;
顺序
阶段日期
计划完成内容
备注
1
1月12日
教师讲解题目,学生查阅相关资料
2
1月13日
查阅相关资料、进行方案论证
3
1月14日
参数计算、确定温度超限设置方法
4
1月15、16、19日
编写程序
5
1月20、21日
调试程序
6
1月22日
撰写论文
7
1月23日
验收作品、答辩
2课程设计思路
本设计主要介绍单片机编程来实现系统功能,本设计由C8051F020芯片为主要核心,采用DS18B20数字温度传感器测量当前温度,采用1602液晶显示屏显示当前温度。
正常温度的设置采用三个按键,其中一个功能按键,用来选择设置后温度最小值和温度最大值,另外两个按键分别是设置温度时用来加减温度。
2.1测温和显示
数字温度传感器DS18B20,因其内部集成了A/D转换器,使得电路结构更加简单,而且减少了温度测量转换时的精度损失,使得测量温度更加精确。
数字温度传感器DS18B20只用一个引脚即可与单片机进行通信,大大减少了接线的麻烦,使得单片机更加具有扩展性。
DS18B20采用单总线的方式和单片机进行通信,通过编程,单片机可以直接从DS18B20内部读取温度值。
本次设计使用的1602液晶显示器为5V电压驱动,带背光,可显示两行,每行16个字符,不能显示汉字,内置128个字符的ASCII字符集字库。
2.2设置正常温度范围
系统采用三个按键,KEY1,KEY2,KE3设置正常的温度范围,其中,KEY1是功能选择按键,按KEY1可以在显示温度,设置正常温度最小值,设置正常温度最大值三个模式中切换。
当选择设置正常温度最小值或设置正常温度最大值模式时,液晶显示正常温度范围的最小值或者最大值,然后通过按键KEY2和KEY3可以选择让这个值增加或者减小。
2.3报警功能
报警功能的电路采用一个三极管驱动的蜂鸣器作为报警电路,在显示温度时,当测得三路温度中有任何一路的温度不在正常温度的范围内时,报警电路就开始工作,发出响声。
4各模块程序设计
4.1测温部分
DS18B20采用单总线方式与单片机之间经行通信,所以在程序中,单片机只要操作一个IO口就可以对DS18B20经行操作,完成测温的功能。
DQ0~DQ2分别对应三个DS18B20。
程序主要包括四个函数,分别说传感器初始化操作,读字节操作,写字节操作和读取温度操作。
代码如下:
/*初始化ds1820*/
/*******************************************************************/
ucharInit_DS18B20(void)
{
DQ0=1;DQ1=1;DQ2=1;//DQ复位
Delay(10);//稍做延时
DQ0=0;DQ1=0;DQ2=0;//单片机将DQ拉低
Delay(100);//精确延时大于480us
DQ0=1;DQ1=1;DQ2=1;//拉高总线
Delay(8);
presence=DQ;
Delay(100);
DQ0=1;DQ1=1;DQ2=1;//拉高总线
return(presence);//返回信号,表示初始化成功,否则表示初始化失败
}
/*读一个字节*/
/*******************************************************************/
voidReadOneChar(void)
{
unsignedchari=0;
dat0=0;dat1=0;dat2=0;
for(i=8;i>0;i--)
{
DQ0=0;DQ1=0;DQ2=0;//给脉冲信号
dat0>>=1;dat1>>=1;dat2>>=1;//用于存放数据的字节右移一位
DQ0=1;DQ1=1;DQ2=1;//给脉冲信号
Delay
(1);//稍做延时
if(DQ0)//如果总线为高,说明返回的数据时1
dat0|=0x80;//将1写入变量中,如果是0则不写,因为前面已经清零了?
if(DQ1)
dat1|=0x80;
if(DQ2)
dat2|=0x80;
Delay(6);
}
}
/*写一个字节*/
/*******************************************************************/
voidWriteOneChar(unsignedchardat)
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ0=0;DQ1=0;DQ2=0;//单片机将DQ拉低
DQ0=dat&0x01;//如果写的数据位是1,则拉高总线,否则总线保持低电平即可
DQ1=dat&0x01;
DQ2=dat&0x01;
Delay(6);
DQ0=1;DQ1=1;DQ2=1;//拉高总线
dat>>=1;//要写的数据右移一位
}
}
/*读取温度*/
/*******************************************************************/
voidRead_Temperature(void)
{
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
Init_DS18B20();//初始化DS18B20
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器
ReadOneChar();//温度低8位
wd0=dat0;//先将温度低8位存到16位的变量中
wd1=dat1;
wd2=dat2;
ReadOneChar();//温度高8位
wd0=wd0+256*dat0;//将温度的高8位也存到16位的变量中
wd1=wd1+256*dat1;
wd2=wd2+256*dat2;
wd0=wd0*0.625;//转化成实际温度,保留一位小数
wd1=wd1*0.625;
wd2=wd2*0.625;
}
4.2显示部分
1602液晶显示屏采用并口方式与单片机进行通信,单片机的P0口与液晶的数据口链接,P2.0,P2.1,P2.2分别与液晶的RS,RW,EN三个命令端相连。
通过正确的时序,单片机就可以控制1602液晶显示我们需要的字符。
程序主要包括三个函数,液晶初始化函数,写命令函数,写数据函数。
代码如下:
/******************************************************************/
/*检查LCD忙状态*/
/*lcd_busy为1时,忙,等待。
lcd-busy为0时,闲,可写指令与数据。
*/
/******************************************************************/
bitlcd_busy()
{
bitresult;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
delayNOP();
result=(bit)(P0&0x80);
LCD_EN=0;
return(result);
}
/*写指令数据到LCD*/
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。
*/
/*******************************************************************/
voidlcd_wcmd(ucharcmd)
{
while(lcd_busy());
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
_nop_();
_nop_();
P0=cmd;
delayNOP();
LCD_EN=1;
delayNOP();
LCD_EN=0;
}
/*******************************************************************/
/*写显示数据到LCD*/
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。
*/
/*******************************************************************/
voidlcd_wdat(uchardat)
{
while(lcd_busy());
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
P0=dat;
delayNOP();
LCD_EN=1;
delayNOP();
LCD_EN=0;
delay1
(1);
}
/*LCD初始化设定*/
/*******************************************************************/
voidlcd_init()
{
delay1(15);
lcd_wcmd(0x01);//清除LCD的显示内容
lcd_wcmd(0x38);//16*2显示,5*7点阵,8位数据
delay1(5);
lcd_wcmd(0x0c);//显示开,关光标
delay1(5);
lcd_wcmd(0x06);//移动光标
delay1(5);
lcd_wcmd(0x01);//清除LCD的显示内容
delay1(5);
}
4.3设置正常温度
首先通过按键KEY1选择模式,程序中一共具有三个模式,分别是测温显示模式,设置正常温度最小值模式,设置正常温度最大值模式。
在测温模式下,系统可以自动判断当前几路传感器测到的温度是否在正常温度之内,如果超过正常温度就出发报警装置报警。
设置正常温度最小值模式,设置正常温度最大值模式下,可以用个KEY2和KEY3两个按键分别对最大值和最小值经行增加和减小。
程序主要包括一个设置函数,代码如下:
/*设置函数,用于设置正常温度范围的最大值或者最小值*/
/*******************************************************************/
ucharset_tem(uchardat)
{
while
(1)
{
lcd_wcmd(0xc8);//写地址(要显示字符的地址)
lcd_wdat(dat/10+48);//显示最大值(最小值)的十位
lcd_wdat(dat%10+48);//显示最大值(最小值)的个位
if(key2==0)//如果KEY2键按下
delay1(10);//稍作延时,消抖
if(key2==0)//再次判断KEY2按下
{
while(key2==0);//等待按键释放
dat++;//最大值(最小值)加一
}
if(key3==0)//如果KEY3键按下
delay1(10);//稍作延时,消抖
if(key3==0)//再次判断KEY3按下
{
while(key3==0);//等待按键释放
dat--;//最大值(最小值)减一
}
if(key1==0)//如果KEY1按下
delay1(5);//稍作延时,消抖
if(key1==0)//如果KEY1按下,退出循环,设置完成,切换模式
{
lcd_wcmd(0x01);//清屏
break;
}
}
returndat;
}
/*主函数*/
/************************************/
voidmain()
{
ucharflage=0;
lcd_init();//液晶初始化
while
(1)//大循环
{
if(key1==0)//如果KEY1按下
{
delay1(5);//稍作延时,消抖
if(key1==0)//再次判断到KEY1按下
{
flage++;//标志位加1
if(flage==3)//标志位到3清零,保证标志位只能在012三个状态中循环,对应三个模式
flage=0;
}
}
Read_Temperature();//读传感器的温度
switch(flage)//判断标志位,进入相应的模式
{
case0:
display_tem();break;//正常测温显示模式
case1:
//设置正常温度范围最小值模式
lcd_init();
dis_string(0x80,"setmintem");
dis_string(0xc0,"mintem:
");
writetab();//自定义字符写入CGRAM
lcd_wcmd(0xca);
lcd_wdat(0x00);//显示自定义字符
min=set_tem(min);
break;
case2:
//设置正常温度范围最小值模式
lcd_init();
dis_string(0x80,"setmaxtem");
dis_string(0xc0,"maxtem:
");
writetab();//自定义字符写入CGRAM
lcd_wcmd(0xca);
lcd_wdat(0x00);//显示自定义字符
max=set_tem(max);
break;
default:
display_tem();break;//默认进入正常显示模式
}
}
}
4.3温度显示和报警
温度显示和报警的功能放在同一个函数中,在显示温度的同时,会判断每一路DS18B20是否正常工作,如果没有,则提示,ERROR,如果传感器正常工作,就显示采集的温度,并且判断是否在正常范围之内,如果不在,就触发报警功能,蜂鸣器发出响声。
程序主要有一个函数,代码如下:
/*在1602上显示温度,并且判断温度是否超过正常设定范围*/
/*******************************************************************/
voiddisplay_tem()
{
BEEP=1;
if(presence&0x01)//presence最低位为1说明0号测温度传感器没有正常工作。
dis_string(0x80,"T0ERROR");
else
{
dis_string(0x80,"T0:
");
lcd_wdat(wd0%1000/100+48);
lcd_wdat(wd0%100/10+48);
lcd_wdat('.');
lcd_wdat(wd0%10+48);
writetab();//自定义字符写入CGRAM
lcd_wcmd(0x87);
lcd_wdat(0x00);//显示自定义字符
if((wd0>max*10)|(wd0BEEP=0;
}
if(presence&0x02)//presence中间位为1说明1号测温度传感器没有正常工作。
dis_string(0x88,"T1ERROR");
else
{
dis_string(0x88,"T1:
");
lcd_wdat(wd1%1000/100+48);
lcd_wdat(wd1%100/10+48);
lcd_wdat('.');
lcd_wdat(wd1%10+48);
writetab();//自定义字符写入CGRAM
lcd_wcmd(0x8f);
lcd_wdat(0x00);//显示自定义字符
if((wd1>max*10)|(wd1BEEP=0;
}
if(presence&0x04)//presence最高位为1说明2号测温度传感器没有正常工作。
dis_string(0xc0,"T2ERROR");
else
{
dis_string(0xc0,"T2:
");
lcd_wdat(wd2%1000/100+48);
lcd_wdat(wd2%100/10+48);
lcd_wdat('.');
lcd_wdat(wd2%10+48);
writetab();//自定义字符写入CGRAM
lcd_wcmd(0x8f);
lcd_wdat(0x00);//显示自定义字符
if((wd2>max*10)|(wd2BEEP=0;
}
}
5主要元器件介绍
5.1C8051F系列单片机
C8051F020/1/2/3器件是完全集成的混合信号系统级MCU芯片,具有64个数字I/O引脚(C8051F020/2)或32个数字I/O引脚(C8051F021/3)。
下面列出了一些主要特性;
(1)高速、流水线结构的8051兼容的CIP-51内核(可达25MIPS)
(2)全速、非侵入式的在系统调试接口(片内)
(3)真正12位(C8051F020/1)或10位(C8051F022/3)、100ksps的8通道ADC,带PGA和模拟多路开关
(4)真正8位500ksps的ADC,带PGA和8通道模拟多路开关
(5)两个12位DAC,具有可编程数据更新方式
(6)64K字节可在系统编程的FLASH存储器
(7)4352(4096+256)字节的片内RAM
(8)可寻址64K字节地址空间的外部数据存储器接口
(9)硬件实现的SPI、SMBus/I2C和两个UART串行接口
(10)5个通用的16位定时器
(11)具有5个捕捉/比较模块的可编程计数器/定时器阵列
(12)片内看门狗定时器、VDD监视器和温度传感器
具有片内VDD监视器、看门狗定时器和时钟振荡器的C8051F020/1/2/3是真正能独立工作的片上系统。
所有模拟和数字外设均可由用户固件使能/禁止和配置。
FLASH存储器还具有在系统重新编程能力,可用于非易失性数据存储,并允许现场更新8051固件。
片内JTAG调试电路允许使用安装在最终应用系统上的产品MCU进行非侵入式(不占用片内资源)、全速、在系统调试。
该调试系统支持观察和修改存储器和寄存器,支持断点、