第11章 单片机应用系统设计实例1.ppt_第1页
第11章 单片机应用系统设计实例1.ppt_第2页
第11章 单片机应用系统设计实例1.ppt_第3页
第11章 单片机应用系统设计实例1.ppt_第4页
第11章 单片机应用系统设计实例1.ppt_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

第11章单片机应用系统设计实例 11 1单片机电子时钟的设计 通常通过用单片机设计电子时钟有两种方法 1 通过单片机内部的定时器 计数器 这种方法硬件线路简单 采用软件编程实现时钟计数 一般称为软时钟 系统的功能一般与软件设计相关 通常用在对时间精度要求不高的场合 2 采用时钟芯片 它的功能强大 功能部件集成在芯片内部 自动产生时钟等相关功能 硬件成本相对较高 软件编程简单 通常用在对时钟精度要求较高的场合 11 1 1软时钟的基本原理 软时钟是利用单片机内部的定时器 计数器来实现 它的处理过程如下 首先设定单片机内部的一个定时器 计数器工作于定时方式 对机器周期计数形成基准时间 如50ms或10ms 然后用另一个定时器 计数器或软件计数的方法对基准时间计数形成秒 对50ms记数20次或10ms计数100次 秒计60次形成分 分计60次形成小时 小时计24次则计满一天 然后通过数码管把它们的内容在相应位置显示出来即可 11 1 2系统硬件电路的设计 共阳极 阴极 驱动取反 AT89C52 11 1 3系统软件程序的设计 电子时钟的软件系统由主程序和子程序组成 主程序程序包含初始化参数设置 按键处理 数码管显示模块等 在设计时各个模块都采用子程序结构设计 在主程序中调用 由于定时器 计数器采用中断方式处理 因此还要编写定时器 中断服务子程序 在定时器 计数器中断服务程序中对时钟进行调整 一 主程序主程序执行流程如图 主程序先对显示单元和定时器 计数器初始化 然后重复调用数码管显示模块和按键处理模块 当有键按下 则转入相应的功能程序 二 数码管显示模块本系统共用8个数码管 从右到左依次显示秒个位 秒十位 横线 分个位 分十位 横线 时个位和时十位 数码管显示的信息用8个内存单元存放 这8个内存单元称为显示缓冲区 其中秒个位和秒十位 分个位和分十位 时个位和时十位分别由秒数据 分数据和小时数据分拆得到 在本系统中数码管显示采用软件译码动态显示 在存储器中首先建立一张显示信息的字段码表 显示时 先从显示缓冲区中取出显示的信息 然后通过查表程序在字段码表中查出所显示的信息的字段码 从P0口输出 同时在P2口将对应的位选码输出选中显示的数码管 就能在相应的数码管上显示显示缓冲区的内容 三 定时器 计数器T0中断服务程序定时器 计数器T0用于时间计时 选择方式1 重复定时 定时时间设为50ms 定时时间到则中断 在中断服务程序中用一个计数器对50ms计数 计20次则对秒单元加1 秒单元加到60则对分单元加1 同时秒单元清0 分单元加到60则对时单元加1 同时分单元清0 时单元加到24则对时单元清0 标志一天时间计满 在对各单元计数的同时 把它们的值放到存储单元的指定位置 定时器 计数器T0中断服务程序流程图如图 定时器 计数器T0中断服务程序 四 按键处理模块按键处理设置为 如没有按键 则时钟正常走时 当按下K0按键时 进入调分状态 时钟停止走动 按K1可K2按键可进行加1或减1操作 继续按K0键可分别进行分和小时的调整 最后按K0键将退出调整状态 时钟开始计时运行 五 汇编语言源程序清单 ORG0000HLJMPSTARTORG000BHLJMPINTT0 主程序START MOVR0 70HMOVR7 0CHINIT MOV R0 00HINCR0DJNZR7 INIT 70H 7CH全部清0MOVTMOD 01H T0工作在方式1MOVTL0 0B0H T0定时50msMOVTH0 3CHSETBEASETBET0SETBTR0START1 LCALLSCAN 调用显示子程序LCALLKEYSCAN 调用键盘子程序SJMPSTART1 延时1ms子程序DL1MS MOVR6 14H 1 sDL1 MOVR7 19H 1 sDL2 DJNZR7 DL2 25次 2 s 50 sDJNZR6 DL1 2 sRET 2 s1 s 25次 2 s 3 s 20次 2 s 1063 s 1 063ms 1ms 延时20ms子程序DL20MS ACALLSCANACALLSCANACALLSCANRET 1T1T2T2T2T 数码管显示程序SCAN MOVA 78H 秒MOVB 0AHDIVAB A 商 B 余数MOV71H A 秒十位MOV70H B 秒个位MOVA 79H 分MOVB 0AHDIVABMOV74H AMOV73H BMOVA 7AH 时MOVB 0AHDIVABMOV77H AMOV76H BMOVR1 70H 循环扫描8位显示MOVR5 0FEH 位选码初值MOVR6 08H 8位显示 SCAN1 MOVA R5MOVP2 AMOVA R1MOVDPTR TABMOVCA A DPTR 远程查表MOVP0 A 段选码MOVA R5LCALLDL1MSINCR1MOVA R5RRAMOVR5 ADJNZR6 SCANMOVP2 0FFHMOVP0 0FFHRETTAB DB0C0H 0F9H 0A4H 0B0H 99H 92H 82H 0F8H 80H 90H 0BFH 0 9 的七段共阳极字段码 定时器 计数器T0中断服务程序INTT0 PUSHACC 现场保护PUSHPSWCLRET0CLRTR0MOVTL0 0B0H T0定时50msMOVTH0 3CHSETBTR0INC7BH 50ms定时到记数MOVA 7BHCJNEA 14H OUTT0 计20次 即1s MOV7BH 00INC78H 秒加1MOVA 78HCJNEA 3CH OUTT0 计60s MOV78H 00INC79H 分加1MOVA 79HCJNEA 3CH OUTT0 不等跳 计60分MOV79H 00INC7AH 时加1MOVA 7AHCJNEA 18H OUTT0 计24时MOV7AH 00OUTT0 SETBET0RETI 按键处理程序KEYSCAN CLREAJNBP1 0 KEYSCAN0 为0跳JNBP1 1 KEYSCAN1JNBP1 2 KEYSCAN2KEYOUT SETBEARETKEYSCAN0 LCALLDL20MS K0去抖JBP1 0 KEYOUT 为1跳WAIT0 JNBP1 0 WAIT0 P1 0 0跳INC7CH K0松开后7CH加1CLRET0CLRTR0CJNEA 03H KEYOUT 不等跳 K0按1下或2下返回 按3下7CH清0 不能调秒MOV7CH 00SETBET0SETBTR0SJMPKEYOUT KEYSCAN1 LCALLDL20MS K1键去抖JBP1 1 KEYOUTWAIT1 JNBP1 1 WAIT1 P1 1 0跳 等待松开K1MOVA 7CHCJNEA 02H KSCAN11 不等跳 K0按2下 调整分INC79H 分加1MOVA 79HCJNEA 3CH KEYOUT 为60分吗 MOV79H 00SJMPKEYOUTKSCAN11 INC7AH 时加1MOVA 7AHCJNEA 18H KEYOUT 为24时吗 MOV7AH 00SJMPKEYOUT 按1下调时 按2下调分 KEYSCAN2 LCALLDL20MS K2去抖JBP1 2 KEYOUT P1 2 1跳WAIT2 JNBP1 2 WAIT2 松开K2MOVA 7CHCJNEA 02H KSCAN21 K2按2下吗 按2下调整分DEC79H 分减1MOVA 79HCJNEA 0FFH KEYOUTMOV79H 3BH 计59分SJMPKEYOUTKSCAN21 DEC7AH 时减1MOVA 7AHCJNEA 0FFH KEYOUTMOV7AH 17H 计23时SJMPKEYOUTEND 六 C语言源程序清单 采用8位LED软件译码动态显示程序 使用AT89C51单片机 12MHz晶振 P0口输出字段码 P2口输出位选码 用共阳极LED数码管 key0为调时位选择键 key1为加1键 key2为减1键 include reg51 h definecharunsignedcharcharcodedis 7 12 0 xc0 0 xf9 0 xa4 0 xb0 0 x99 0 x92 0 xb2 0 xf8 0 x80 0 x90 0 xff 0 xbf 共阳极LED数码管 0 9 灭 和 的字段码chardatascan con 8 0 xfe 0 xfd 0 xfb 0 xf7 0 xef 0 xdf 0 xbf 0 x7f 位选择码chardatadis 8 0 x00 0 x00 0 x0b 0 x00 0 x00 0 xb0 0 x00 0 x00 显示缓冲区 时 分 秒初始为0 0 x0b为 的编码chardatatimedata 3 0 x00 0 x00 0 x00 分别为秒 分和小时的值chardatams50 0 x00 con 0 x00 con1 0 x00 con2 0 x00 计数次数初值sbitkey0 P1 0 sbitkey1 P1 1 sbitkey2 P1 2 1ms延时函数delay1ms intt inti j for i 0 i 3 con 0 TR0 1 ET0 1 if con 0 if key1 0 delay1ms 10 K1去抖 while key1 0 timedata con if con 2 con1 24 elsecon1 60 if timedata con con1 timedata con 0 if con 0 if key2 0 delay1ms 10 K2去抖while key2 0 timedata con if con 2 con2 23 elsecon2 59 if timedata con 0 timedata con con2 EA 1 数码管显示函数scan chark dis 0 timedata 0 10 dis 1 timedata 0 10 秒dis 3 timedata 1 10 dis 4 timedata 1 10 分dis 6 timedata 2 10 dis 7 timedata 2 10 时for k 0 k 8 k P0 dis 7 dis k P2 scan con k delay1ms 1 P2 0 xff 主函数main TH0 0 x3c TL0 0 xb0 T0定时50msTMOD 0 x01 ET0 1 TR0 1 EA 1 while 1 scan keyscan 定时器 计数器T0中断服务函数voidtime intt0 void interrupt1 ET0 0 TR0 0 TH0 0 x3c TL0 0 xb0 TR0 1 ms50 If ms50 20 循环20次 计1s ms50 0 x00 timedata 0 秒 1if timedata 0 60 timedata 0 0 timedata 1 分 1if timedata 1 60 timedata 1 0 timedata 2 小时 1if timedata 2 24 timedata 2 0 ET0 1 11 2多路数字电压表的设计 11 2 1多路数字电压表的原理及功能 多路数字式电压表应用系统主要利用A D转换器 处理过程如下 先用A D转换器对各路电压值进行采样 得到相应的数字量 再按数字量与模拟量成正比关系运算得到对应的模拟电压值 然后把模拟值通过显示器显示出来 设计时假设待测的输入电压为8路 电压值的范畴为0 5V 要求能在四位LED数码管上轮流显示或单路选择显示 测量的最小分辨率为0 019V 测量误差为 0 02V 根据系统的功能要求 控制系统采用AT89C52单片机 A D转换器采用ADC0809 ADC0809是8位的A D转换器 当输入电压为5 00V时 输出的数据值为255 0FFH 因此最大分辨率为0 0196V 5 255 ADC0809的具有8路模拟量输入端口 通过3位地址输入端能从8路中选择一路进行转换 如每隔一段时间轮流依次改变3位地址输入端的地址 就能依次对8路输入电压进行测量 LED数码管显示采用软件译码动态显示 通过按键选择可8路循环显示 也可单路显示 单路显示可通过按键选择显示的通道数 11 2 2系统硬件电路的设计 2分频 共阳极 2MHz 1MHz 11 2 3系统软件程序的设计 一 主程序主程序包含初始化部分 调用A D转换子程序和调用显示程序 如下图 初始化包含存放通道数据的缓冲区初始化和显示缓冲区初始化 另外 对于单路显示和循环显示 系统设置了一个标志位00H控制 初始化时00H位设置为0 默认为循环显示 当它为1时改变为单路显示控制 00H位通过单路 循环按键控制 LED数码管采样软件译码动态扫描方式 在显示子程序中包含多路循环显示程序和单路显示程序 多路循环显示程序把8个存储单元的数值依次取出送到四个数码管上显示 每一路显示1秒 单路显示程序只对当前选中的一路数据进行显示 每路数据显示时需经过转换变成十进制BCD码 放于四个数码管的显示缓冲区中 单路或循环显示通过标志位00H控制 在显示控制程序中加入了对单路或循环按键和通道选择按键的判断 二 A D转换子程序 A D转换子程序用于对ADC0809八路输入模拟电压进行A D转换 并将转换的数值存入8个相应的存储单元中 如下图 A D转换子程序每隔一定时间调用一次 也即隔一段时间对输入电压采样一次 三 显示子程序 四 汇编语言源程序清单 测量电压最大值为5V 显示最大值为5 00V 使用AT89C52单片机 12MHz晶振 P0口读入A D值 P2口为A D转换控制口 数码管为共阳极连接 P1口为字段码口 P3口为位选口 P3 5为单路 循环显示转换按键 P3 6为单路显示时当前通道选择按键 70H 77H存放采样的8个数据 78H 7BH为显示缓冲区 分别为个位 十位 百位和当前通道值 00H位为单路 循环显示控制位 当为0时循环显示 为1时单路显示 主程序入口ORG0000HLJMPSTART 主程序START CLRAMOVP2 AMOVR0 70HMOVR2 0DHLOOPMEM MOV R0 AINCR0DJNZR2 LOOPMEMMOV20H 00H 00H位在20H字节中MOVA 0FFHMOVP0 A 数据口MOVP1 A 段码口MOVP3 A 字位口MAIN LCALLTEST 调用A D转换程序LCALLDISPLAY 调用显示程序 显示子程序DISPLAY JB00H DISP11 为1跳DISP11MOVR3 08H 00H位 0循环显示MOVR0 70H 首地址MOV7BH 00H 选中0通道DISLOOP1 LCALLTUNBCDMOVR2 0FFHDISLOOP2 LCALLDISPLCALLKEYWORK1DJNZR2 DISLOOP2 延时INCR0INC7BH 循环选中8通道DJNZR3 DISLOOP1RET DISP11 MOVA 7BH 00H位 1跳来 实现单路显示SUBBA 01HMOV7BH AADDA 70HMOVR0 ADISLOOP11 LCALLTUNBCDMOVR2 0FFHDISLOOP22 LCALLDISPLCALLKEYWORK2DJNZR2 DISLOOP22 延时INC7BH 通道号加1RET 显示数据转换为3位BCD码子程序TUNBCD MOVA R0MOVB 51DIVAB A 商 B 余数MOV7AH A 7AH 百位MOVA B A 余数CLRF0SUBBA 1AHMOVF0 C 余数 26 F0 C 0 余数 26 F0 C 1MOVA 10MULAB B 余数 余数 10 BAMOVB 51DIVAB 低字节 51JBF0 LOOP2 F0 1跳 余数 26 ADDA 5LOOP2 MOV79H A 79H 十位 MOVA B 余数处理CLRF0SUBBA 1AHMOVF0 CMOVA 10MULABMOVB 51DIVABJBF0 LOOP3ADDA 5LOOP3 MOV78H A 78H 个位RET LED扫描显示子程序DISP MOVR1 78H 个位显示MOVR5 0FEH 位选初值 显示个位 PLAY MOVP1 0FFHMOVA R5ANLP3 AMOVA R1MOVDPTR TABMOVCA A DPTR 远程查表MOVP1 A 输出字段口JBP3 2 PLAY1 为1跳 整数位不亮 CLRP1 7 点亮小数点 PLAY1 LCALLDL1MSINCR1 十位显示MOVA P3JNBACC 3 ENDOUT 通道号位为0跳RLAMOVR5 AMOVP3 0FFHENDOUT MOVP3 0FFHMOVP1 0FFHRETTAB DB0C0H 0F9H 0A4H 0B0H 99H 92H 82H F8H 80H 90H 0FFH 共阳极七段字段码表 延时子程序DL10MS MOVR6 0D0H 1 sDL1 MOVR7 10H 12 sDL2 DJNZR7 DL2 16次 2 s 32 sDJNZR6 DL1 2 sRET 2 sDL1MS MOVR4 0FFH 1 sDL3 DJNZR4 DL3 255次 2 s 510 sMOVR4 0FFH 1 sDL4 DJNZR4 DL4 510 sRET 2 s 1T1T2T2T2T 1T2T1T2T2T A D转换子程序TEST CLRAMOVP2 AMOVR0 70H 通道号地址MOVR7 08H 8个通道LCALLTESTARTWAIT JBP3 7 MOVD EOC P3 7 1跳AJMPWAITTESTART SETBP2 3 ALE 1NOPNOPCLRP2 3SETBP2 4 START 1NOPNOPCLRP2 4NOPNOPNOPNOPRET MOVD SETBP2 5 OE 1MOVA P0MOV R0 ACLRP2 5INCR0 指向下一通道MOVA P2INCA 地址加1MOVP2 ACJNEA 08H TESTENDTESTEND JCTESTCON C 1跳CLRAMOVP2 AMOVA 0FFHMOVP0 AMOVP1 AMOVP2 ARETTESTCON LCALLTESTARTLJMPWAIT 查询方式 读取结果 启动转换 按键检测子程序KEYWORK1 JNBP3 5 KEY1 K1 P3 5 0跳KEY1KEYOUT RETKEY1 LCALLDISP 按下K1后调用显示程序JBP3 5 KEYOUT K1 1跳 松开 WAIT11 JNBP3 5 WAIT12 K1 0跳CPL00H K1松开后切换显示方式MOVR2 0AHMOVR3 01HRETWAIT12 LCALLDISP 按K1后调用显示AJMPWAIT11 KEYWORK2 JNBP3 5 KEY1 按K1后跳JNBP3 6 KEY2 K2 0跳KEY2RETKEY2 LCALLDISP 刷新显示JBP3 6 KEYOUT K2 1跳KEYOUTWAIT22 JNBP3 6 WAIT21 K2 0跳WAIT21INC7BH K2 1 通道号 1MOVA 7BHCJNEA 08H KEYOUT11KEYOUT11 JCKEYOUT1 C 1跳KEYOUT1MOV7BH 00H 通道号 8 7BH清0KEYOUT1 RETWAIT21 LCALLDISP 刷新显示AJMPWAIT22END 五 C语言源程序清单 测量电压最大值为5V 显示最大值为5 00V 使用AT89C52单片机 12MHz晶振 P0口读入A D值 P2口为A D转换控制口 数码管为共阳极连接 P1口为字段码口 P3口为位选口 KEY1 P3 5 为单路 循环显示转换按键 KEY2 P3 6 为单路显示时当前通道选择按键 FLAG为单路 循环显示控制位 当为0时循环显示 为1时单路显示 include reg52 h include intrins h 调用 nop 延时函数 definead conP2 ADC0809的控制口 defineaddataP0 ADC0809的数据口 definedisdataP1 数码管的字段码输出口 defineucharunsignedchar defineuintunsignedintucharnumber 0 x00 存放单通道显示时的当前通道数sbitALE P2 3 ADC0809的地址锁存信号sbitSTART P2 4 ADC0809的启动信号sbitOE P2 5 ADC0809的允许信号sbitEOC P3 7 ADC0809的转换结束信号sbitKEY1 P3 5 循环或单路显示选择按键sbitKEY2 P3 6 通道选择按键sbitDISX disdata 7 小数点位sbitFLAG PSW 0 循环或单路显示标志位 ucharcodedis 7 11 0 xC0 0 xF9 0 xC0 0 xF9 0 xC0 0 xF9 0 xC0 0 xF9 LED的七段数码管的字段码 0 9 灭 ucharcodescan con 4 0 xfe0 0 xfd 0 xfb 0 xf7 LED数码管的位选码uchardataad data 8 0 x00 0 x00 0 x00 0 x00 0 x00 0 x00 0 x00 0 x00 ADC0809的8个通道转换数据缓冲区uintdatadis 5 0 x00 0 x00 0 x00 0 x00 0 x00 前4个为LED数码管的显示缓冲区 最后一个为暂存单元 1ms延时子函数delay1ms unitt uinti j for i 0 i t i for j 0 j 120 j 检测按键子函数keytest if KEY1 0 检测循环或单路选择按键是否按下 FL

温馨提示

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

评论

0/150

提交评论