ImageVerifierCode 换一换
格式:DOC , 页数:22 ,大小:8.15MB ,
资源ID:3770161      下载积分:10 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/3770161.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(巡回检测报警系统控制设计.doc)为本站上传会员【天****】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

巡回检测报警系统控制设计.doc

1、巡回检测报警控制系统设计 序 随着电子测量技术与计算机技术的发展,而对各种检测对象和大量的测试点,需要利用数据采集系统将多路被测量转换成数字量,在经过单片机或微型计算机进行数据处理,实现实时测控。 在工业生产中,往往也需要对各种生产过程参数进行控制,而要进行控制的前提条件是必须对各参数进行数据采集。数据采集系统一般具有定时采样(A/D转换)、数据转换、参数显示、超限报警等功能。 在本次课设中,将设计一个多路数据采集测控系统,采用单片机为核心器件,配合相应的外围电路、ADC0809模/数转换器、LED数码管及发光二极管等组成单片机数据采集系统。 第一部分 系统设计要求

2、 一、设计的性质与目的 该设计是在我们学完《单片机原理及应用》和电子学相关课程的基础上,综合运用所学知识,进行单片机测控系统设计,进一步加强对所学知识的理解,使学生掌握单片机测控系统开发的方法、步骤,具备一定的设计能力、动手能力。 二、设计任务和要求 根据题目要求,设计一个单片机应用系统,完成相应的控制和显示功能。完成该单片机应用系统的硬件原理图,设计相应的控制软件,实现硬件及软件的调试。 三、巡回检测报警控制系统设计要求 设计一个多路数据采集测控系统,具有控制及显示功能: 1、对多路模拟信号进行采集,将采集到的电压值通过LED显示出来。 2、设置被测量的阈值,对被测量进行临控,

3、当达到阈值时,启动报警(如指示灯)或启动相应的设备(如直流电机)。 3、键盘可以控制在LED上显示哪一路被测量的值。 第二部分 系统设计 一、设计思路 根据题目要求,程序需要实现以下几个功能: 1、可以通过LED显示电压值。 2、可以通过键盘控制当前显示何路电压。。 3、对采集来的电压值进行阈值判断,在超出范围的情况下启动相应的报警程序。 4、可以实时监控电压的变化。 有以上几种功能,可以知道程序中需要包括以下几个子程序及对应的功能: 1、A/D转换子程序,对四路模拟电压作循环转换。 2、阈值判断子程序,分别对四路电压进行对应的阈值判断。 3、报警子程序,当输

4、入电压超出阈值范围时调用此程序,使程序可以输出不同的报警信号。 4、显示通道选择子程序,用于判断当前需要显示何路电压值。 5、电压值转换至显示用BCD码子程序,用于将A/D转换所得的电压值转换所得的电压值转换为对应BCD码,以使得LED显示的电压值更直观。 6、显示子程序,用于将转换后的BCD码在LED上显示出来,同时显 示所选择的通道数。 根据程序设计思路,可知需要用到的器件除8051外,还需要用A/D转换器件AD0809,可编程键盘显示接口HD7279,小键盘,LED数码管,LED发光二极管,以及其它附属器件。各器件间需要进行I/O扩展及硬件的联接。 二、硬件系统框图

5、 系统核心是89C51与ADC0809组成的数据采集系统,外部控制输入与显示主要是通过HD7279来与8051进行数据的输入与输出,HD7279相当于一个外部中断,当有键按下时。HD7279向CPU提出中断,80C51响应中断,读入键盘数据,做出相应的控制反应。实现了键盘间接控制和向CPU输入信号的目的。同时也会输出显示指令,让HD7279控制各数码管,从而得到所要的显示。 三、软件系统组成框图 四、硬件原理图(连线图) 注:P3.4接LED10作为高电平报灯,P3.5接LED9作为低电平报警灯。 注:在实验之前,应将8单

6、元的U7(7406)和U6(74LS245)芯片取下,因7279已经有直接驱动数码管的能力,如果另外放置驱动芯片,反而会影响数码管的显示效果。 五、子程序设计与调试 1、A/D转换子程序(带报警)[IN0] ①.相关知识 模/数转换器ADC0809的认识 虽然单片机可以对各种数字数据做快速而精确的处理,但是人类在日常生活中所遇到的各种物理量(例如温度、亮度、质量)都是模拟的,因此若令单片机处理模拟信号,必须将模拟信号转换成数字信号再送入单片机。 A/D转换器(analog to digital converter)的功能是将输入的模拟信号转换成数字信号输出。本次课设采用ADC080

7、9. 8位A/D转换器芯片ADC0809 ADC0809是典型的8位8通道逐次逼近式A/D转换器,采用CMOS工艺制造。 ADC0809芯片为28引脚双列直插式封装,其引脚排列见下图。 (1)IN7~IN0:模拟量输入通道。(2)ADDA、ADDB、ADDC:模拟通道地址线。(3)ALE:地址锁存信号。(4)START:转换启动信号。 (5)D7~D0:数据输出线。(6)OE:输出允许信号。(7)CLK:时钟信号。 ADC0809的内部逻辑结构如下图所示。 ③. 程序流程图 ④.程序调试及说明 ADC0809是8位逐次逼近型A/D转换器,带8

8、个模拟量输入通道,芯片内带通道地址译码锁存器,输出带三态数据锁存器,启动信号为脉冲启动方式,每一通道的转换大约100us。因此模拟量转化为数字量不能马上输出,转换过程要延时。 如:delay(10) void delay(unsigned int t) { unsigned int i; for(i=0;i

9、 ②. 电路原理图 ③.程序结果说明 初始显示为 0000087; 按下“1”时,显示111111;按下“2”时,显示222222; 按下“3”时,显示333333;按下“4”时,显示444444; 按下“5”时,显示555555;按下“6”时,显示666666; 按下“7”时,显示777777;按下“8”时,显示888888; 按下“9”时,显示999999;按下“0”时,显示000000; ④.程序流程图 五、总程序 1、程序软件流程图 2、总程序调试及说明 数码显示不能实时跟随模拟电压的变化,当电压改变时,需要重新运行程序才能显示变化后的电压

10、值,解决办法是改变主函数中程序的运行方式,改为无条件的死循环。而锁程序的死循环必需嵌套在主函数中的无条件的死循环内,只有这样才能实现功能。 程序运行结果说明如下: 按下1时,显示1通道、A、-及其电压值; 按下2时,显示2通道、b、-及其电压值; 按下3时,显示3通道、C、-及其电压值; 按下4时,显示4通道、d、-及其电压值; 按下0时,锁程序; 按下#时,解锁程序,并保持上一个按键状态; 如果电压值超过4伏特,则LED10亮; 如果电压值低于1伏特,则LED9亮; 改变输入电压的值,电压显示能实时跟踪输入电压的值而变化,并在LED上显示。 第三部分 收获、体会及改

11、进建议 通过本次的单片机课程设计,使我们第一次把硬件与软件结合起来开发一个完整的系统,不但把书本上的理论知识与实际操作相结合,而且也提高了我们的动手能力,是一次非常好的宝贵的锻炼机会。 本次课程设计,使我对单片机系统有了更深的了解,并能将所学到的知识用于实践,灵活应用单片机中断,包括定时器中断和外部中断。对A/D转换的应用——ADC0809芯片,以及HD7279控制键盘的显示,基本掌握并熟悉。 对于单片机学习的收获与体会具体如下: 1.在程序设计之前,要对所用单片机的内部结构有一个系统的了解, 知道该单片机片内有哪些资源及其能实现的功能。 2.设计程序采要有一个清晰的思路和一个

12、完整的软件流程图. 3.设计程序时,不能企图一次就将整个程序设计好,“由子程序到总程序,反复修改,不断改进"是程序设计的必经之路. 采用子程序设计,可以使程序有条理,简洁清楚。 4.要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,还应该直观,便于理解,同时也为资料的保存和交流提供了方便. 5.在设计程序过程中会遇到很多问题,我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。 建议如下: 该系统是对四路模拟电压进行采样监控,如果要是硬件条件允许的条件下,可在此基础上扩展至八路模拟电压的采样监控;还可以加入变阈值电压的子程序及循环显示四路模拟电压值的子程

13、序;还有当高报警时,将数据锁存一定时间让人们知道便于采取防备措施;在显示上也可以采用hd61202液晶显示。 第四部分 参考书目 一、《单片机的C语言应用程序设计》 马忠梅、籍顺心、张凯、马岩编著 北京航空航天大学出版社 二、《单片机C语言编程与实例》 赵亮、侯国锐著 人民邮电出版社 三、《C程序设计》 谭浩强著 清华大学出版社 附录: 1、A/D转换子程序(带报警)[IN0] #include #include unsigne

14、d char chADData[20]; unsigned char ADC(unsigned char channel); void AD(); void delay(unsigned int t); void init(); sbit P3_4=P3^4; sbit P3_5=P3^5; unsigned int timecount=0; unsigned char xdata *pADAdrr; void time0int(); main() { init(); AD(); } void AD() { int i; do {

15、 for(i=0;i<1;i++) { chADData[i]=ADC(i); P1=chADData[i]; if(chADData[i]>0xcc) P3_4=0; else P3_4=1; if(chADData[i]<0x33) P3_5=0; else P3_5=1; } }while(1); } void init() { TMOD=0x01; TH0=0x3C; TL0=0xB0; ET0=1;

16、TR0=1; EA=1; } void time0int() interrupt 1 using 1 { TH0=0x3C; TL0=0xB0; timecount++; } unsigned char ADC(unsigned char channel) { unsigned char chADResult; pADAdrr=0x0800+channel; *pADAdrr=0; delay(10); chADResult=*pADAdrr; return(chADResult); } void delay(un

17、signed int t) { unsigned int i; for(i=0;i #define CMD_RESET 0xa4 #define CMD_TEST 0xbf #define DECODE0 0x80 #define DECODE1 0xc8 #define CMD_READ 0x15 #define UNDECODE 0x90 #define RTL_CYCLE 0xa3 #define RTR_CYCLE 0xa2 #define RTL_UNC

18、YL 0xa1 #define RTR_UNCYL 0xa0 #define ACTCTL 0x98 #define SEGON 0xe0 #define SEGOFF 0xc0 #define BLINKCTL 0x88 void init(); void keyint(); void long_delay(void); void short_delay(void); void write7279(unsigned char cmd, unsigned char dta); unsigned char read7279(unsigned char command);

19、 void send_byte(unsigned char out_byte); unsigned char receive_byte(void); void display(); //*** I/O *** sbit cs=P1^0; sbit dat=P1^1; sbit clk=P1^2; sbit key=P3^2; //****** HD7279A ****** unsigned char chKey; bit bNewKey; unsigned char dispdata[6]={7,8,0,0,0,0}; main() { un

20、signed char i; bit bt; bt=dat; init(); bNewKey=0; display(); while(1) { if(bNewKey) { for(i=0;i<6;i++) { dispdata[i]=chKey; } display(); bNewKey=0; } } } void init() { PX0=0; /*外部中断0优先级*/ IT0=0; /*外部中断0,低电平触发*/ IE0=0;

21、/*外部中断0中断申请标志位*/ EX0=1; /*允许外部中断0*/ EA=1; send_byte(CMD_RESET); } //1:0x04;2:0x05;3:0x06;4:0x0c;5:0x0d;6:0x0e;7:0x14;8:0x15;9:0x0x16;*:0x1c;0:0x1d;#:0x1e void keyint() interrupt 0 using 1 { unsigned char temp; temp=read7279(0x15); switch(temp) { case 0x04: c

22、hKey=3; break; case 0x05: chKey=2; break; case 0x06: chKey=1; break; case 0x0c: chKey=6; break; case 0x0d: chKey=5; break; case 0x0e: chKey=4; break; case 0x14: chKey=9; break; case 0x15:

23、 chKey=8; break; case 0x16: chKey=7; break; case 0x1d: chKey=0; break; case 0x1c: chKey=10; break; case 0x1e: chKey=11; break; } bNewKey=1; } void display() { unsigned char j; for(j=0;j<6;j++) {

24、 write7279((0x80+j),dispdata[j]); } } void send_byte( unsigned char out_byte) { unsigned char i; // EA=0; clk=0; long_delay(); for (i=0;i<8;i++) { if (out_byte&0x80) { dat=1; } else { dat=0;

25、 } clk=1; short_delay(); clk=0; short_delay(); out_byte=out_byte*2; } dat=0; // EA=1; } unsigned char receive_byte(void) { unsigned char i, in_byte; dat=1; // long_delay(); for (i=0;i<8;i++) { clk=1

26、 short_delay(); in_byte=in_byte*2; if (dat) { in_byte=in_byte|0x01; } clk=0; short_delay(); } dat=0; return (in_byte); } void long_delay(void) { unsigned char i; for (i=0;i<0x30;i++); } void

27、short_delay(void) { unsigned char i; for (i=0;i<8;i++); } void write7279(unsigned char cmd, unsigned char dta) { cs=0; long_delay(); send_byte(cmd); send_byte(dta); cs=1; } unsigned char read7279(unsigned char command) { cs=0; send_byte(command); re

28、turn(receive_byte()); cs=1;} 3、总程序及注释 #include #include //绝对地址访问头文件 unsigned char chADData[8];//存放转换结果的数组 unsigned char ADC(unsigned char channel); //转换程序 void AD();//开启转换及报警程序 void delay(unsigned int t); //短延时程序

29、 unsigned char xdata *pADAdrr; #define CMD_RESET 0xa4 //复位命令 #define CMD_TEST 0xbf //测试命令 #define DECODE0 0x80 //译码方式0 #define DECODE1 0xc8 //译码方式1 #define C

30、MD_READ 0x15 //读键盘命令 #define UNDECODE 0x90 //非译码方式 #define RTL_CYCLE 0xa3 //循环左移 #define RTR_CYCLE 0xa2 //循环右移

31、 #define RTL_UNCYL 0xa1 //左移 #define RTR_UNCYL 0xa0 //右移 #define ACTCTL 0x98 //消隐控制 #define SEGON 0xe0 //段点亮

32、 #define SEGOFF 0xc0 //段关闭 #define BLINKCTL 0x88 //闪烁控制 void init(); //初始化程序 void keyint(); //键盘中断服务程序

33、 void long_delay(void); //长延时程序 void short_delay(void); //短延时程序 void write7279(unsigned char cmd, unsigned char dta); // 往HD7279A中写命令 unsigned char read7279(unsigned char command);// 从HD7279A中读键值

34、 void send_byte(unsigned char out_byte); //往HD7279A中写入一个字节 unsigned char receive_byte(void); //从HD7279A中读出一个字节 void display();//显示程序 void dispcode(unsigned char chData); //形成显示代码

35、 //*** I/O *** sbit cs=P1^0; //片选信号接P1.0 sbit dat=P1^1; //DATA信号接P1.1 sbit clk=P1^2; //CLK信号接P1.2 sbit key=P3^2; //键盘中断信号接P3.2 sbit P3_4=P3^4; sbit P3_

36、5=P3^5; //****** HD7279A ****** unsigned int chtemp[6]={0,0,0,0,0,0},chKey,keep,in; unsigned char dispdata[6]; main() { unsigned char i; init(); display(); while(1) { AD(); while(in){};//死循环 switch(chKey) { case 1:

37、 chtemp[5]=chKey; chtemp[4]=0x0a;//显示A(译码方式1) chtemp[3]=0x0a;//显示-(译码方式0) dispcode(chADData[0]); break; case 2: chtemp[5]=chKey; chtemp[4]=0x0b;//显示b

38、 chtemp[3]=0x0a; dispcode(chADData[1]); break; case 3: chtemp[5]=chKey; chtemp[4]=0x0c;//显示C chtemp[3]=0x0a; dispcode(chADData[2]); break; case 4: c

39、htemp[5]=chKey; chtemp[4]=0x0d;//显示d chtemp[3]=0x0a; dispcode(chADData[3]); break; } for(i=0;i<6;i++) //在显示器中显示出键值 { dispdata[i]=chtemp[i]; } display();//显示 } } void init() { PX0=0; /*外部中断0优先级*

40、/ IT0=0; /*外部中断0,低电平触发*/ IE0=0; /*外部中断0中断申请标志位*/ EX0=1; /*允许外部中断0*/ EA=1; /*开总中断*/ send_byte(CMD_RESET);//HD7279A复位 } //显示程序 void display() { unsigned char j; for(j=0;j<6;j++) { if((j<3||j==4)||(j==5)) write7279((0xc8+j),dispdata[

41、j]);//译码方式1 else write7279((0x80+j),dispdata[j]);//译码方式0 } } //1:0x06;2:0x05;3:0x04;4:0x0e;5:0x0d;6:0x0c;7:0x16;8:0x15;9:0x14;*:0x1e;0:0x1d;#:0x1c void keyint() interrupt 0 using 1 { unsigned char temp; temp=read7279(0x15); //读出键值 switch(temp) { case 0x06:

42、 chKey=1; break; case 0x05: chKey=2; break; case 0x04: chKey=3; break; case 0x0e: chKey=4; break; case 0x1d://锁 in=1; keep=chKey; break;

43、 case 0x1c: in=0;//解锁 chKey=keep;//保持上一个按键状态 break; } } //显示一个3位数,将8位数据转换成AD采样电压值显示出来。参数为AD采样值 void dispcode(unsigned char chData) { unsigned int nTemp,t; float fAdreault; fAdreault=((float)chData/255)*5;//将AD采样值转换成对应的电压值 nTemp=fAd

44、reault*100; //先转换成整数,变成0~500之间 chtemp[2]=nTemp/100|0x80; //得到百位数 t=nTemp/100; chtemp[1]=(nTemp-t*100)/10; //得到十位数 chtemp[0]=nTemp-t*100-chtemp[1]*10; //得到个位数 }

45、//往HD7279A中写入一个字节. void send_byte( unsigned char out_byte) { unsigned char i; // EA=0; clk=0;//CLK变低电平 long_delay(); for (i=0;i<8;i++) { if (out_byte&0x80)//得到要输出的数据位,高位在先 { dat=1; } else { da

46、t=0; } clk=1; //CLK变高电平,这一位写入HD7279A寄存器 short_delay();//延时 clk=0;//CLK变低,为下一次写入数据作准备 short_delay();//延时 out_byte=out_byte*2;//数据左移一位 } dat=0; // EA=1; } //从HD7279A中读出一个字节. unsigned char receive_byte(void) { unsigned cha

47、r i, in_byte; unsigned char intemp; dat=1; //DATA=1;单片机要读入引脚状态先输出1。 long_delay(); for (i=0;i<8;i++) { clk=1; //时钟CLK变高电平,它变成高电平以后,HD7279延时T6才输出数据 short_delay(); in_byte=in_byte*2;//读入数据左移一位,因为是高位先出 intemp=P1; dat=(intemp&0x04); if (da

48、t)//读DATA引脚的状态 { in_byte=in_byte|0x01;//读入数据,数据引脚接在P1.0 } clk=0;//CLK变低电平 short_delay(); //延时T7 } dat=0; return (in_byte);//返回键值 } void long_delay(void) { unsigned char i; for (i=0;i<0x30;i++); } void short_delay(void)

49、 { unsigned char i; for (i=0;i<8;i++); } //往HD7279A中写入一个双字节命令 void write7279(unsigned char cmd, unsigned char dta) { cs=0; long_delay(); send_byte(cmd);//写入命令 send_byte(dta);//写入数据 cs=1; } //从HD7279A中读出键值。 unsigned char read7279(unsigned char command) { cs=

50、0; send_byte(command); //写入命令 return(receive_byte()); //读取键值 cs=1; } //*** *** void AD() { switch(chKey) { case 1: chADData[0]=ADC(0); P1=chADData[0]; if(chADData[0]>0xcc)//上阈值判断 { P3_4=0;} //报警

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服