《微计算机与单片机原理及应用》第12章 单片机应用系统设计_第1页
《微计算机与单片机原理及应用》第12章 单片机应用系统设计_第2页
《微计算机与单片机原理及应用》第12章 单片机应用系统设计_第3页
《微计算机与单片机原理及应用》第12章 单片机应用系统设计_第4页
《微计算机与单片机原理及应用》第12章 单片机应用系统设计_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第12章单片机应用系统设计

本章重点:单片机应用系统的一般设计流程;数显定时器和数字温度计的设计与实现。本章难点:单片机应用系统的可靠性设计。12.1单片机应用系统设计方法

12.1.1单片机应用系统的结构特点单片机应用系统的一般结构

12.1.2应用系统设计的基本原则不论单片机应用系统具体如何实现,都必须完全达到设计目标规定的各项要求。设计目标来自用户需求,其中既包括功能需求,也包括使用环境、可靠性、安全性、实时性、体积、成本、功耗等诸多方面的具体要求。开发人员必须认真领会用户需求,反复推敲设计方案,方案确定后,尽快展开硬件、软件的具体设计与系统调试,务求在规定的期限内,开发出满足各项要求的目标系统。12.1.3应用系统设计的一般流程

1.需求分析设计任何一个应用系统,首先必须对设计目标(用户需求)进行认真分析,明确各项具体要求,不允许出现任何偏差和遗漏,否则,就可能造成难以弥补的损失。

2.总体设计总体设计的任务是根据设计目标的要求,确定一套最优的、合理的、切实可行的实现方案。

(1)软硬件功能划分硬件实现的好处是速度快,可简化软件设计,减少存储器开销,但硬件接线复杂,批量成本较高。用软件实现则刚好相反。(2)单片机选型单片机选型是否合理、恰当,对整个系统的成本和各项指标的实现有很大影响。单片机选型的主要考虑包括:

①片内资源的种类、数量和性能应与设计目标要求相匹配。

②单片机本身的性价比要高,以提高整个系统的性价比。

③货源要稳定,以利于批量生产和售后服务。

④有较完善的开发工具支持。

⑤选用加密性能相对较好的单片机,以利于保护自有知识产权。

⑥尽量选用熟悉的单片机型号或系列,以缩短研制周期,降低开发风险。

(3)确定系统总体结构总体设计的结果通常包括硬件结构框图、软件结构框图、状态转换图和相应的文字说明。3.硬件设计(1)单片机最小系统设计最小系统是保证单片机程序运行的基本硬件条件。(2)单片机外围电路设计(3)PCB设计(4)可靠性设计4.软件设计(1)基于模块的功能分解根据总体设计阶段确定的软件总体框架,将软件系统向下分解为不同层次的支持模块,明确各模块的输入、输出及相互调用关系。(2)定义数据结构数据是程序代码的操作对象。软件系统中的数据有些是局部的,可以封装在模块内部,还有一些是全局性的,可为不同模块共享。(3)流程图设计对于复杂且又难以分解的模块,应当用流程图进一步表示其程序结构,特别是使用汇编语言时。(4)编写源程序单片机程序设计可使用汇编语言或C语言。C语言还可以通过嵌入汇编语句进一步提高执行效率。目前,使用C语言开发单片机程序已成为一种趋势。(5)可靠性设计相对通用的可靠性措施包括开机自检、看门狗、软件陷阱、数字滤波、越界报警、超时退出、数据缓冲、校验、备份与自动恢复等。5.系统调试系统调试需借助必要的开发、测试仪器,其中以万用表最为常用。近年来,单片机广泛采用在线编程(有ISP和IAP两种方式)和在线调试(ICD)技术,将单片机1~4根相关口线通过信号转换、驱动电路连接到PC机的串口或并口,便可进行在线下载或仿真调试,省去了昂贵的仿真器和编程器,大大降低了开发门槛。单片机应用系统的调试包括硬件调试、软件调试和软硬件联合调试。软件调试是在没有实际硬件支持下借助PC软件环境(如KeilC51、Proteus等)模拟运行单片机应用程序,以排除可能存在的逻辑错误。联合调试就是将完整的应用程序加载到单片机(包括支持在线调试的单片机)或仿真器,以连续、单步、断点等方式控制程序运行,通过人机交互和外设动作的状况,找出软件或硬件方面存在的问题,直到系统工作正常为止。6.现场测试所设计的目标系统最终需要在用户规定的环境条件下运行,因此,必须将实验室调好的样机拿到现场进行测试,验证其运行效果。另外,某些性能指标(如抗静电、抗脉冲干扰)还必须通过认证测试。从整体方案到具体设计(硬件、软件),所有可以提升和优化的地方都要认真考虑,加以改进,以求最终实现各项功能和性能指标。7.文档整理规范、完整的技术文档(方案论证报告、原理图、流程图、带注释的源程序清单、测试报告、设计总结、操作手册等)不仅有利于系统的维护与升级,为以后的设计工作提供借鉴,也是系统验收、成果鉴定、专利申请、软件登记等工作的重要支撑材料。单片机应用系统设计的一般流程

12.2数显定时器的设计

12.2.1设计目标与要求设计一个最长为99分钟的数显可调定时器。具体功能如下:通电时两位数码管显示为“99”,以后每分钟自动减一,减到零时,蜂鸣器持续发出“嘀嘀…嘀嘀…”的闹铃声,并通过I/O引脚输出相应的控制信号。按下两个控制键中的任一个可停止闹铃及控制输出,此后任何时刻再按任一键又重新开始新一轮定时。可通过两个控制键上下动态调整定时时间。12.2.2设计方案论证

数显定时器总体结构

12.2.3硬件设计数显定时器硬件原理图

串口电平转换电路

12.2.4软件设计

1.主控模块主控模块的流程

2.定时中断处理模块定时中断处理模块的流程

3.数码显示模块数码显示模块的流程

4.键盘扫描模块键盘扫描模块的流程

12.2.5系统调试首先按图进行电路焊接与装配,用万用表进行检测,确认连接无误后,先分别编写与数码管、蜂鸣器、按键有关的测试程序,利用KeilC51集成开发软件生成代码并下载到单片机运行,以确认各硬件单元都能正常工作。接下来,编写完整的数显定时器程序,生成代码后下载到单片机连续运行或在线调试。发现问题时,应从多方面查找原因。每次修改源程序后,都必须重新生成代码并下载到单片机,再次进行调试,直到系统完全正常工作。12.2.6数显定时器的完整程序(C51)/***********************头文件声明*********************/#include<reg51.h>/*****************符号常量及口线分配声明****************/#defineDISP_SEGP0sbitDISP_D1=P2^7;sbitDISP_D2=P2^6;sbitCTRL_OUT=P2^0;sbitBUZZ=P1^0;sbitKEY1=P1^2;sbitKEY2=P1^4;#defineKEY_NULL0#defineKEY1_PRESSED1#defineKEY2_PRESSED2/**********************函数原型声明********************/voidInitTimer();unsignedcharScanKey();voidDisplayTime();voidDiDi();voidDelay(intms);voidDelay1ms();/****************常量数组(段码表)声明****************/unsignedcharcodeSegCode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};/********************全局变量声明*********************/unsignedintCount50ms=0;unsignedcharMinute=99;void(*codeRESET)()=0x0000;//函数指针RESET指向复位入口/*******************中断服务函数**********************/voidT0ISR(void)interrupt1{TH0=(65536-50000)>>8;//重装T0定时初值(50ms@12Mhz)

TL0=(65536-50000)&0xFF;if(++Count50ms<1200)return;//未满1分钟的话直接返回

Count50ms=0;//1分钟已到,Count50ms清0Minute--;//Minute减1}/**********************主函数*********************/voidmain(){unsignedchari,KeyPress;

InitTimer();//定时器初始化

while(1)//无限循环

{

Delay(10);//延时10ms

DisplayTime();//显示分钟值

if(Minute==0)//分钟值是否已减到0?

{TR0=0;//定时时间已到,T0停止

CTRL_OUT=0;//输出控制信号

while(1){

DiDi();//蜂鸣器发声

for(i=0;i<70;i++) { Delay(10);

if(ScanKey()!=KEY_NULL) {CTRL_OUT=1;//有键按下,关闭控制输出

while(ScanKey()!=KEY_NULL);//等待按键释放

while(ScanKey()==KEY_NULL);//等待有键按下

while(ScanKey()!=KEY_NULL);//等待按键释放

(*RESET)();//重新启动系统

} }} }

if((KeyPress=ScanKey())!=KEY_NULL)//是否有键按下

{

if(KeyPress==KEY1_PRESSED){

if(Minute<99)Minute++;//KEY1按下,分钟值加1}elseif(KeyPress==KEY2_PRESSED){

if(Minute>1)Minute--;//KEY2按下,分钟值减1 }

while(ScanKey()!=KEY_NULL)DisplayTime();//等待按键释放

Count50ms=0;//Count50ms清0}}}/********************定时器初始化函*********************/voidInitTimer(){TMOD=0x01;//设T0为定时方式1(16位方式)

TH0=(65536-50000)>>8;//设T0定时初值(50ms@12Mhz)

TL0=(65536-50000)&0xFF;TR0=1;//启动T0ET0=1;//允许T0中断

EA=1;}/******************键盘扫描函数*********************/unsignedcharScanKey(){if(KEY1==1&&KEY2==1)returnKEY_NULL;//无键按下,返回KEY_NULLDelay(10);//消抖

if(KEY1==1&&KEY2==1)returnKEY_NULL;//无键按下,返回KEY_NULLif(KEY1==0)returnKEY1_PRESSED;//KEY1按下,返回KEY1_PRESSEDif(KEY2==0)returnKEY2_PRESSED;//KEY2按下,返回KEY2_PRESSEDreturnKEY_NULL;//无键按下,返回KEY_NULL}/******************时间显示函数*********************/voidDisplayTime(){

DISP_SEG=SegCode[Minute/10];//输出分钟值十位的段码

DISP_D1=0;//高位数码管显示

DISP_D2=1;//低位数码管熄灭

Delay1ms();//延时1ms//DISP_SEG=SegCode[Minute%10];//输出分钟值个位的段码

DISP_SEG=SegCode[Minute%10]&((Count50ms/10%2)==0?0x7f:0xff);DISP_D1=1;//高位数码管熄灭

DISP_D2=0;//低位数码管显示

Delay1ms();//延时1msDISP_D2=1; //低位数码管熄灭}/******************蜂鸣器发声函数*******************/voidDiDi(){unsignedchari;

for(i=0;i<2;i++)//蜂鸣器响两声

{BUZZ=0;//蜂鸣器通电50msDelay(50);BUZZ=1;//蜂鸣器断电100msDelay(100);}} /*******************延时函数*******************/voidDelay(intms){do{Delay1ms();}while(--ms);}/*****************延时1ms函数*******************/voidDelay1ms(){unsignedchari;

for(i=164;i;i--);}/********************程序结束*******************/12.3数字温度计的设计

12.3.1设计目标与要求设计一个以单片机为核心的数字温度计,可在数码管上显示出温度传感器采集的数据,超过37.5℃时,由蜂鸣器给出报警提示。温度测量范围为0~99.9℃,误差在±0.5℃以内。

12.3.2设计方案论证数字温度计的总体结构

12.3.3硬件设计

数字温度计硬件原理图

12.3.4软件设计主控模块流程图

温度采集模块的流程

12.3.5系统调试数码管显示器的调试:先编写数码管动态显示的测试程序,利用KeilC51集成开发软件生成代码并加载到仿真器或直接下载到单片机观察运行效果。如果不能正常显示,可检查数码管是否用错或接错,驱动数码管公共阳极的三极管是否损坏或有连接题。DS18B20的调试:DS18B20对工作时序有严格要求,程序中与DS18B20驱动有关的延时时间可能需要多次调整后,才能与单片机进行正常的通信。有条件的话,可使用数字示波器观察延时时间是否达到要求。12.3.6数字温度计的完整程序(C51)/*******************头文件声明******************/#include<REG51.h>/******************数据类型定义*****************/typedefunsignedcharuint8;typedefunsignedintuint16;/************符号常量及口线分配声明**************/#defineDISP_SEGP0sbitDISP_D1=P2^2;sbitDISP_D2=P2^1;sbitDISP_D3=P2^0;sbitBUZZ=P1^7;sbitDS18B20_DATA=P1^0;/*******************函数原型声明**********************/voidDS18B20Init();voidDS18B20BitWrite(bitBit);bitDS18B20BitRead();voidDS18B20ByteWrite(uint8Byte);uint8DS18B20ByteRead();voidGetTemperature();voidDispTemperature();voidCheckTemperature();voidDelay(uint16ms);voidDelay1ms();/****************常量数组(段码表)声明****************/uint8codeSegCode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};/*****************全局变量声明*****************/intTemperature;/******************主函数*********************/voidmain(){while(1){

GetTemperature();//获取当前温度

DispTemperature();//显示当前温度

CheckTemperature();//超温报警处理

}} /************DS18B20初始化函数****************/voidDS18B20Init(){uint8i;while(1){DS18B20_DATA=0;i=200;while(--i!=0);//延时800usDS18B20_DATA=1;i=15;while(--i!=0);//延时60usif(DS18B20_DATA==1)continue;//重发复位脉冲

i=30;while(--i!=0);//延时120usif(DS18B20_DATA==1)break;//复位成功

}i=75;while(--i!=0);//延时300us}/*************DS18B20位写操作函数**************/voidDS18B20BitWrite(bitBit){uint8i;DS18B20_DATA=0;i=1;while(--i!=0);//延时4usDS18B20_DATA=Bit;//发送1位数到DS18B20i=14;while(--i!=0);//延时56usDS18B20_DATA=1;}/************DS18B20位读操作函数***************/bitDS18B20BitRead(){bittemp;uint8i;DS18B20_DATA=0;i=3;while(--i!=0);//延时12usDS18B20_DATA=1;temp=DS18B20_DATA;//读来自DS18B20的1位数

i=12;while(--i!=0);//延时48usreturntemp;}/****************DS18B20字节写操作函数***************/voidDS18B20ByteWrite(uint8Byte){uint8count;

for(count=0;count<8;count++)//一共发送8位

{

if((Byte&0x01)==0x01)//先发最低位

DS18B20BitWrite(1);//发送1elseDS18B20BitWrite(0);//发送0Byte>>=1;}}/************DS18B20字节读操作函数*************/uint8DS18B20ByteRead(){uint8count,temp;temp=0;

for(count=0;count<8;count++)//一共读8位

{

temp>>=1;//字节变量右移

if(DS18B20BitRead()==1)//读取1位数据并存入临时变量temp中

temp|=0x80;//temp最高位置1}returntemp;//返回读到的8位数}/*****************温度获取函数*****************/voidGetTemperature(){

uint8ADResult[2];DS18B20Init();DS18B20ByteWrite(0xcc);//跳过ROM(只有一个DS18B20)

DS18B20ByteWrite(0x44);//启动温度采集(转换)

while(DS18B20BitRead()==0)DispTemperature();//等待转换结束,期间不断刷新显示

DS18B20Init();//温度转换结束,再次初始化

DS18B20By

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论