下载
加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 51单片机例程汇总[优质文档]

51单片机例程汇总[优质文档].doc

51单片机例程汇总[优质文档]

冷冷的北雪飘飞
2017-11-25 0人阅读 举报 0 0 暂无简介

简介:本文档为《51单片机例程汇总[优质文档]doc》,可适用于职业岗位领域

单片机例程汇总优质文档单片机例程汇总txt性格本身没有好坏乐观和悲观对这个世界都有贡献前者发明了飞机后者发明了降落伞。本文由wyq贡献pdf文档可能在WAP端浏览体验不佳。建议您优先选择TXT或下载源文件到本机查看。实验闪烁灯实验任务所示:在P端口上接一个发光二极管L使L在不停地一亮一灭如图一亮一灭的时间间隔为秒。电路原理图图系统板上硬件连线把“单片机系统”区域中的P端口用导线连接到“八路发光二极管指示模块”区域中的L端口上。程序设计内容()(延时程序的设计方法作为单片机的指令的执行的时间是很短数量大微秒级因此我们要求的闪烁时间间隔为秒相对于微秒来说相差太大所以我们在执行某一指令时插入延时程序来达到我们的要求但这样的延时程序是如何设计呢,下面具体介绍其原理:如图所示的石英晶体为MHz因此个机器周期为微秒机器周期微秒MOVR,#个D:MOVR,#个机器周期DJNZR,$个机器周期DJNZR,D个机器机器周期周期××,×,×因此上面的延时程序时间为ms。由以上可知当R,、R,时延时msR,、R,时延时ms,以此为基本的计时单位。如本实验要求秒,msms×R,ms则R,延时子程序如下:DELAY:MOVR,#D:MOVR,#D:MOVR,#DJNZR,$DJNZR,DDJNZR,DRET()(输出控制如图所示当P端口输出高电平即P,时根据发光二极管的单向导电性可知这时发光二极管L熄灭当P端口输出低电平即P,时发光二极管L亮我们可以使用SETBP指令使P端口输出高电平使用CLRP指令使P端口输出低电平。程序框图如图所示图源程序C语言源程序#includesbitL=P^voiddelays(void)延时秒子程序{unsignedchari,j,kfor(i=i>i)for(j=j>j)for(k=k>k)}voidmain(void){while(){L=delays()L=delays()}}实验模拟开关灯实验任务如图所示监视开关K(接在P端口上)用发光二极管L(接在单片机P端口上)显示开关状态如果开关合上L亮开关打开L熄灭。电路原理图图系统板上硬件连线()(把“单片机系统”区域中的P端口用导线连接到“八路发光二极管指示模块”区域中的L端口上()(把“单片机系统”区域中的P端口用导线连接到“四路拨动开关”区域中的K端口上程序设计内容()开关状态的检测过程(单片机对开关D端子上。h)把“模数转换模块”区域中的IN端子用导线连接到“三路可调电压模块”区域中的VR端子上。i)把“单片机系统”区域中的P,P用芯排线连接到“模数转换模块”区域中的DDDDDDDD端子上。j)把“单片机系统”区域中的P、P用导线分别连接到“八路发光二极管指示模块”区域中的L、L上。k)把“单片机系统”区域中的P用导线连接到“音频放大模块”区域中的SPKIN端口上。l)把“音频放大模块“区域中的SPKOUT插入音频喇叭。(汇编源程序(略)语言源程序C(C#includeunsignedcharcodedispbitcode={xfe,xfd,xfb,xf,xef,xdf,xbf,xf}unsignedcharcodedispcode={xf,x,xb,xf,x,xd,xd,x,xf,xf,x}unsignedchardispbuf={,,,,,,,}unsignedchardispcountunsignedchargetdataunsignedinttempunsignedcharisbitST=P^sbitOE=P^sbitEOC=P^sbitCLK=P^sbitLED=P^sbitLED=P^sbitSPK=P^bitlowflagbithighflagunsignedintcntaunsignedintcntbbitalarmflagvoidmain(void){ST=OE=TMOD=xTH=xTL=xTH=()TL=()TR=TR=ET=ET=EA=ST=ST=while(){if((lowflag==)(highflag==)){LED=LED=}elseif((highflag==)(lowflag==)){LED=LED=}else{LED=LED=}}}voidt(void)interruptusing{CLK=~CLK}voidt(void)interruptusing{TH=()TL=()if(EOC==){OE=getdata=POE=temp=getdata*temp=tempi=dispbuf=dispbuf=dispbuf=dispbuf=dispbuf=dispbuf=dispbuf=dispbuf=while(temp){dispbufi=temptemp=tempi}dispbufi=tempif(getdata<){lowflag=highflag=}elseif(getdata>){lowflag=highflag=}else{lowflag=highflag=}ST=ST=}P=dispcodedispbufdispcountP=dispbitcodedispcountdispcountif(dispcount==){dispcount=}if((lowflag==)(highflag==)){cntaif(cnta==){cnta=alarmflag=~alarmflag}if(alarmflag==){SPK=~SPK}}elseif((lowflag==)(highflag==)){cntbif(cntb==){cntb=alarmflag=~alarmflag}if(alarmflag==){SPK=~SPK}}else{alarmflag=cnta=cntb=}}实验(四位数数字温度计(温度传感器AD基本知识AD产生的电流与绝对温度成正比它可接收的工作电压为V,V检测的温度范围为,,它有非常好的线性输出性能温度每增加其电流增加uA。AD温度与电流的关系如下表所示摄氏温度AD电流uAuAuAuAuAuAuAuAAD引脚图经KΩ电压VVVVVVVV(实验任务利用AD温度传感器完成温度的测量把转换的温度值的模拟量送入ADC的其AD转换将转换的结果进行温度值变换之后送入数码管显示。中一个通道进行(电路原理图图(系统板上硬件连线()(把“单片机系统”区域中的P,P与“动态数码显示”区域中的ABCDEFGH端口用芯排线连接。()(把“单片机系统”区域中的P,P与“动态数码显示”区域中的SSSSSSSS端口用芯排线连接。()(把“单片机系统”区域中的P与“模数转换模块”区域中的ST端子用导线相连接。()(把“单片机系统”区域中的P与“模数转换模块”区域中的OE端子用导线相连接。()(把“单片机系统”区域中的P与“模数转换模块”区域中的EOC端子用导线相连接。()(把“单片机系统”区域中的P与“模数转换模块”区域中的CLK端子用导线相连接。()(把“模数转换模块”区域中的AAA端子用导线连接到“电源模块”区域中的GND端子上。()(把“模数转换模块”区域中的IN端子用导线连接到自制的AD电路上。()(把“单片机系统”区域中的P,P用芯排线连接到“模数转换模块”区域中的DDDDDDDD端子上。(程序设计内容()(ADC的CLK信号由单片机的P管脚提供()(由于AD的温度变化范围在,,之间经过KΩ之后采样到的电压变化在V,V之间不超过V电压所表示的范围因此参考电压取电源电压VCC(实测VCC,V)。由此可计算出经过AD转换之后的摄氏温度显示的数据为:如果(D*),则显示的温度值为,(,(D*))如果(D*)则显示的温度值为((D*),)C(C语言源程序#include#include<ctypeh>unsignedcharcodedispbitcode={xfe,xfd,xfb,xf,xef,xdf,xbf,xf}unsignedcharcodedispcode={xf,x,xb,xf,x,xd,xd,x,xf,xf,x,x}unsignedchardispbuf={,,,,,,,}unsignedchardispcountunsignedchargetdataunsignedlongtempunsignedcharibitsflagsbitsbitsbitsbitsbitsbitsbitST=P^OE=P^EOC=P^CLK=P^LED=P^LED=P^SPK=P^voidmain(void){ST=OE=TMOD=xTH=xTL=xTH=()TL=()TR=TR=ET=ET=EA=ST=ST=getdata=while(){}}voidt(void)interruptusing{CLK=~CLK}voidt(void)interruptusing{TH=()TL=()if(EOC==){OE=getdata=POE=temp=(getdata*)temp=tempif(temp<){temp=tempsflag=}else{temp=tempsflag=}i=dispbuf=dispbuf=dispbuf=if(sflag==){dispbuf=}else{dispbuf=}dispbuf=dispbuf=dispbuf=dispbuf=while(temp){dispbufi=temptemp=tempi}dispbufi=tempST=ST=}P=dispcodedispbufdispcountP=dispbitcodedispcountdispcountif(dispcount==){dispcount=}}实验(位数显频率计数器(实验任务利用ATS单片机的T、T的定时计数器功能来完成对输入的信号进行频率计数计数的频率结果通过位动态数码管显示出来。要求能够对,KHZ的信号频率进行准确计数计数误差不超过HZ。(电路原理图图(系统板上硬件连线()(把“单片机系统”区域中的P,P与“动态数码显示”区域中的ABCDEFGH端口用芯排线连接。()(把“单片机系统”区域中的P,P与“动态数码显示”区域中的SSSSSSSS端口用芯排线连接。()(把“单片机系统”区域中的P(T)端子用导线连接到“频率产生器”区域中的WAVE端子上。(程序设计内容()(定时计数器T和T的工作方式设置由图可知T是工作在计数状态下对输入的频率信号进行计数但对工作在计数状态下的T最大计数值为fOSC由于fOSC,MHz因此:T的最大计数频率为KHz。对于频率的概念就是在一秒只数脉冲的个数即为频率值。所以T工作在定时状态下每定时秒中到就停止T的计数而从T的计数单元中读取计数的数值然后进行数据处理。送到数码管显示出来。()(T工作在定时状态下最大定时时间为ms达不到秒的定时所以采用定时ms共定时次即可完成秒的定时功能。(C语言源程序#includeunsignedcharcodedispbit={xfe,xfd,xfb,xf,xef,xdf,xbf,xf}unsignedcharcodedispcode={xf,x,xb,xf,x,xd,xd,x,xf,xf,x,x}unsignedchardispbuf={,,,,,,,}unsignedchartempunsignedchardispcountunsignedcharTcountunsignedchartimecountbitflagunsignedlongxvoidmain(void){unsignedchariTMOD=xTH=TL=TH=()TL=()TR=TR=ET=ET=EA=while(){if(flag==){flag=x=Tcount*TH*TLfor(i=i<i){tempi=}i=while(x){tempi=xx=xi}tempi=xfor(i=i<i){dispbufi=tempi}timecount=Tcount=TH=TL=TR=}}}voidt(void)interruptusing{Tcount}voidt(void)interruptusing{TH=()TL=()timecountif(timecount==){TR=timecount=flag=}P=dispcodedispbufdispcountP=dispbitdispcountdispcountif(dispcount==){dispcount=}}实验(电子密码锁设计(实验任务根据设定好的密码采用二个按键实现密码的输入功能当密码输入正确之后锁就打开如果输入的三次的密码不正确就锁定按键秒钟同时发现报警声直到没有按键按下种后才打开按键锁定功能否则在秒钟内仍有按键按下就重新锁定按键秒时间并报警。(电路原理图图(系统板上硬件连线()(把“单片机系统”区域中的PAD用导线连接到“音频放大模块”区域中的SPKIN端子上()(把“音频放大模块”区域中的SPKOUT端子接喇叭和()把“单片机系统”区域中的PA,PA用芯排线连接到“四(路静态数码显示”区域中的任一个ABCDEFGH端子上()(把“单片机系统“区域中的P用导线连接到“八路发光二极管模块”区域中的L端子上()(把“单片机系统”区域中的PWR、PRD用导线连接到“独立式键盘”区域中的SP和SP端子上(程序设计内容()(密码的设定在此程序中密码是固定在程序存储器ROM中假设预设的密码为“”共位密码。()(密码的输入问题:由于采用两个按键来完成密码的输入那么其中一个按键为功能键另一个按键为数字键。在输入过程中首先输入密码的长度接着根据密码的长度输入密码的位数直到所有长度的密码都已经输入完毕或者输入确认功能键之后才能完成密码的输入过程。进入密码的判断比较处理状态并给出相应的处理过程。()(按键禁止功能:初始化时是允许按键输入密码当有按键按下并开始进入按键识别状态时按键禁止功能被激活但启动的状态在次密码输入不正确的情况下发生的。(C语言源程序C#includeunsignedcharcodeps={,,,,}unsignedcharcodedispcode={xf,x,xb,xf,x,xd,xd,x,xf,xf,x,x}unsignedcharpslen=unsignedchartemplenunsignedchardigitunsignedcharfuncountunsignedchardigitcountunsignedcharpsbufbitcmpflagbithibitflagbiterrorflagbitrightflagunsignedintsecondunsignedintaaunsignedintbbbitalarmflagbitexchangeflagunsignedintccunsignedintddbitokflagunsignedcharokaunsignedcharokbvoidmain(void){unsignedchari,jP=dispcodedigitcountTMOD=xTH=()TL=()TR=ET=EA=while(){if(cmpflag==){if(P==)functionkey{for(i=i>i)for(j=j>j)if(P==){if(hibitflag==){funcountif(funcount==pslen){funcount=cmpflag=}P=dispcodefuncount}else{second=}while(P==)}}if(P==)digitkey{for(i=i>i)for(j=j>j)if(P==){if(hibitflag==){digitcountif(digitcount==){digitcount=}P=dispcodedigitcountif(funcount==){pslen=digitcounttemplen=pslen}elseif(funcount>){psbuffuncount=digitcount}}else{second=}while(P==)}}}else{cmpflag=for(i=i}aaif(aa==){aa=P=~P}secondif(second==){second=hibitflag=errorflag=rightflag=cmpflag=P=alarmflag=bb=aa=}}if((errorflag==)(rightflag==)){P=ccif(cc<){okflag=}elseif(cc<){okflag=}else{errorflag=rightflag=hibitflag=cmpflag=P=cc=oka=okb=okflag=P=}if(okflag==){okaif(oka==){oka=P=~P}}else{okbif(okb==){okb=P=~P}}}}实验(×键盘及位数码管显示构成的电子密码锁(实验任务用×组成,数字键及确认键。用位数码管组成显示电路提示信息当输入密码时只显示“”当密码位数输入完毕按下确认键时对输入的密码与设定的密码进行比较若密码正确则门开此处用LED发光二极管亮一秒钟做为提示同时发出“叮咚”声若密码不正确禁止按键输入秒同时发出“嘀、嘀”报警声若在秒之内仍有按键按下则禁止按键输入秒被重新禁止。(电路原理图图(系统板上硬件连线()(把“单片机系统”区域中的P,P用芯排线连接到“动态数码显示”区域中的ABCDEFGH端子上。()(把“单片机系统“区域中的P,P用芯排线显示”区域中的SSSSSSSS端子上。()(把“单片机系统”连接到“动态数码区域中的P,P用芯排线连接到“×行列式键盘”区域中的RRRRCCCC端子上。()(把“单片机系统”区域中的P用导线连接到“八路发光二极管模块”区域中的L端子上。()(把“单片机系统”区域中的P用导线连接到“音频放大模块”区域中的SPKIN端子上。()(把“音频放大模块”区域中的SPKOUT接到喇叭上。(程序设计内容()(×行列式键盘识别技术:有关这方面内容前面已经讨论过这里不再重复。()(位数码显示初始化时显示“P”接着输入最大位数的密码当密码输入完后按下确认键进行密码比较然后给出相应的信息。在输入密码过程中显示器只显示“”。当数字输入超过个时给出报警信息。在密码输入过程中若输入错误可以利用“DEL”键删除刚才输入的错误的数字。()(×行列式键盘的按键功能分布图如图所示:图(C语言源程序#includeunsignedcharps={,,,,}unsignedcharcodedispbit={xfe,xfd,xfb,xf,xef,xdf,xbf,xf}unsignedcharcodedispcode={xf,x,xb,xf,x,xd,xd,x,xf,xf,x,xc,x,xe,x,x,x,x,x,xff}unsignedchardispbuf={,,,,,,,}unsignedchardispcountunsignedcharflashcountunsignedchartempunsignedcharkeyunsignedcharkeycountunsignedcharpslen=unsignedchargetpsbitkeyoverflagbiterrorflagbitrightflagunsignedintsecondunsignedintaa,bbunsignedintccbitokflagbitalarmflagbithibitflagunsignedcharoka,okbvoidmain(void){unsignedchari,jTMOD=xTH=()TL=()TR=ET=EA=while(){P=xffP=temp=Ptemp=tempxfif(temp!=xf){for(i=i>i)for(j=j>j)temp=Ptemp=tempxfif(temp!=xf){temp=Ptemp=tempxfswitch(temp){casexe:key=breakcasexd:key=breakcasexb:key=breakcasex:key=break}temp=PP=~Pif((key>=)(key<)){if(keycount<){getpskeycount=keydispbufkeycount=}keycountif(keycount==){keycount=}elseif(keycount>){keycount=keyoverflag=keyoverflow}}elseif(key==)deletekey{if(keycount>){keycountgetpskeycount=dispbufkeycount=}else{keyoverflag=}}elseif(key==)enterkey{if(keycount!=pslen){errorflag=rightflag=second=}else{for(i=i<keycounti){if(getpsi!=psi){i=keycounterrorflag=rightflag=second=gotoa}}errorflag=rightflag=a:i=keycount}}temp=tempxfwhile(temp!=xf){temp=Ptemp=tempxf}keyoverflag=}}P=xffP=temp=Ptemp=tempxfif(temp!=xf){for(i=i>i)for(j=j>j)temp=Ptemp=tempxfif(temp!=xf){temp=Ptemp=tempxfswitch(temp){casexe:key=breakcasexd:key=breakcasexb:key=breakcasex:key=break}temp=PP=~Pif((key>=)(key<)){if(keycount<){getpskeycount=keydispbufkeycount=}keycountif(keycount==){keycount=}elseif(keycount>){keycount=keyoverflag=keyoverflow}}elseif(key==)deletekey{if(keycount>){keycountgetpskeycount=dispbufkeycount=}else{keyoverflag=}}elseif(key==)enterkey{if(keycount!=pslen){errorflag=rightflag=second=}else{for(i=i<keycounti){if(getpsi!=psi){i=keycounterrorflag=rightflag=second=gotoa}}errorflag=rightflag=a:i=keycount}}temp=tempxfwhile(temp!=xf){temp=Ptemp=tempxf}keyoverflag=}}P=xffP=temp=Ptemp=tempxfif(temp!=xf){for(i=i>i)for(j=j>j)temp=Ptemp=tempxfif(temp!=xf){temp=Ptemp=tempxfswitch(temp){casexe:key=breakcasexd:key=breakcasexb:key=breakcasex:key=break}temp=PP=~Pif((key>=)(key<)){if(keycount<){getpskeycount=keydispbufkeycount=}keycountif(keycount==){keycount=}elseif(keycount>){keycount=keyoverflag=keyoverflow}}elseif(key==)deletekey{if(keycount>){keycountgetpskeycount=dispbufkeycount=}else{keyoverflag=}}elseif(key==)enterkey{if(keycount!=pslen){errorflag=rightflag=second=}else{for(i=i<keycounti){if(getpsi!=psi){i=keycounterrorflag=rightflag=second=gotoa}}errorflag=rightflag=a:i=keycount}}temp=tempxfwhile(temp!=xf){temp=Ptemp=tempxf}keyoverflag=}}P=xffP=temp=Ptemp=tempxfif(temp!=xf){for(i=i>i)for(j=j>j)temp=Ptemp=tempxfif(temp!=xf){temp=Ptemp=tempxfswitch(temp){casexe:key=breakcasexd:key=breakcasexb:key=breakcasex:key=break}temp=PP=~Pif((key>=)(key<)){if(keycount<){getpskeycount=keydispbufkeycount=}keycountif(keycount==){keycount=}elseif(keycount>){keycount=keyoverflag=keyoverflow}}elseif(key==)deletekey{if(keycount>){keycountgetpskeycount=}else{keyoverflag=}}elseif(key==)enterkeydispbufkeycount={if(keycount!=pslen){errorflag=rightflag=second=}else{for(i=i<keycounti){if(getpsi!=psi){i=keycounterrorflag=rightflag=second=gotoa}}errorflag=rightflag=a:i=keycount}}temp=tempxfwhile(temp!=xf){temp=Ptemp=tempxf}keyoverflag=}}}}voidt(void)interruptusing{TH=()TL=()flashcountif(flashcount==){flashcount=P=dispcodedispbufdispcountP=dispbitdispcountdispcountif(dispcount==){dispcount=}}if((errorflag==)(rightflag==)){bbif(bb==){bb=alarmflag=~alarmflag}if(alarmflag==)soundalarmsignal{P=~P}aaif(aa==)lightalarmsignal{aa=P=~P}secondif(second==){second=errorflag=rightflag=alarmflag=bb=aa=}}elseif((errorflag==)(rightflag==)){P=ccif(cc<){okflag=}elseif(cc<){okflag=}else{errorflag=rightflag=P=cc=oka=okb=okflag=P=}if(okflag==){okaif(oka==){oka=P=~P}}else{okbif(okb==){okb=P=~P}}}if(keyoverflag==){P=~P}}实验(带有存储器功能的数字温度计,DS技术应用(DS基本原理DS是美国DALLAS公司生产的集成了测量系统和存储器于一体的芯片。数字接口电路简单与IC总线兼容且可以使用一片控制器控制多达片的DS。其数字温度输出达位精度为。DS可工作在最低V电压下适用于低功耗应用系统。(()DS基本特性无需外围元件即可测量温度测量范围为,,精度为测量温度的结果以位数字量(两字节传输)给出测量温度的典型转换时间为秒集成了字节的EPROM非易性存储器数据的读出和写入通过一个,线(IC)串行接口完成采用脚DIP或SOIC封装如图图(()引脚描述及功能方框图其引脚描述如表所示:DS的功能结构图如图所示:图(()DS工作原理温度测量图是温度测量的原理结构图图温度测量的原理结构图DS在测量温度时使用了独有的在线温度测量技度高度敏感的振荡器决定的计数周期内对温度低敏感的振荡器时术。它通过在一个由对温钟脉冲的计数值的计算来测量温度。DS在计数器中预置了一个初值,它相当于,。如果计数周期结束之前计数器达到已预置了此初值的温度寄存器中的数字就会增加从而表明温度高于,。与此同时计数器斜坡累加电路被重新预置一个值然后计数器重新对时钟计数直到计数值为。通过改变增加的每内的计数器的计数斜坡累加电路可以补偿振荡器的非线性误差以提高精度任意温度下计数器的值和每一斜坡累加电路的值对应的计数次数须为已知。DS通过这些计算可以得到的精度温度输出为位在发出读温度值请求后还会输出两位补偿值。给出了所测的温度和输出数据的关表系。这些数据可通过线制串行口连续输出MSB在前LSB在后。表温度温度与输出数据关系表数字量输出(十六进制)DHHHHFFHEFHCH数字量输出(二进制)由于数据在总线上传输时MSB在前所以DS读出的数据可以是一个字节(分辨率为)也可以是两个字节第二个字节包含的最低位为。表是位温度寄存器中存储温度值的数据格式高八位字节低八位字节SBBBBBB表BBBBBB温度值的数据存储格式其中S,为符号位当S,时表示当前的测量的温度为正的温度当S,时表示当前的测量的温度为负的温度。B,B为当前测量的温度值。最低三位被设置为。DS工作方式DS的工作方式是由片上的配置状态寄存器来决定的如表该寄存器的定义如下:表DONE配置状态寄存器格式SHOT其中DONE为转换完成位温度转换结束时置正在进行转换时为SHOT为温度转换模式选择。SHOT为时为单次转换模式DS在收到启动温度转换命令EEH后进行一次温度转换。SHOT为时为连续转换模式此时DS将连续进行温度转换并将最近一次的结果保存在温度寄存器中。该位为非易失性的。片内字节存储器操作控制器对DS的存储器编程有两种模式:一种是字节编程模式另一种是页编程模式。在字节编程模式中主控制器发送地址和一个字节的数据到DS。在主器件发出开始(START)信号以后主器件发送写控制字节即AAA(其中RW控制位为低电平“”)指示从接收器被寻址。DS接收后应答再由主器件发送访问存储器指令(H)后DS接收后应答接着由主器件发送的下一个字节字地址将被写入到DS的地址指针。主器件接收到来自DS的另一个确认信号以后发送数据字节并写入到寻址的存储地址。DS再次发出确认信号同时主器件产生停止条件STOP启动内部写周期。在内部写周期DS将不产生确认信号。在页编程模式中如同字节写方式先将控制字节、访问存储器指令(H)、字地址发送到DS接着发N个数据字节其中以个字节为一个页面。主器件发送不多于一个页面字节的数据字节到DS这些数据字节暂存在片内页面缓存器中在主器件发送停止信号以后写入到存储器。接收每一个字节以后低。高位顺序字地址保持为常数。如果主器件在产生停止条件以前位顺序地址指针在内部加要发送多于一页字的数据地址计数器将会循环并且先接收到的数据将被覆盖。像字节写操作一样一旦停止条件被接收到则内部写周期将开始。存储器的读操作在这种模式下主器件可以从DS的EEPROM中读取数据。主器件在发送开始信号之后主器件首先发送写控制字节AAA主器件接收到DS应答之后发送访问存储器的指令(H)收到DS的应答之后接着发送字地址将被被写入到DS的地址指针。这时DS发送应答信号之后主器件并没有发送停止信号而是重新发送START开始信号接着又发送读控制字节AAA主器件接收到DS应答之后开始接收DS送出来的数据主器件每接收完一个字节的数据之后都要发送一个应答信号给DS直到主器件发送一个非应答信号或停止条件来结束DS的数据发送过程。DS的指令集数据和控制信息的写入读出是以表和表所示的方式进行的。在写入信息时主即DS)的地址同时RW位置。接收到响应位后总线上的主器件器件输出从器件(发出一个命令地址DS接收此地址后产生响应位主器件就向它发送数据。如果要对它进行读操作主器件除了发出命令地址外还要产生一个重复的启动条件和命令字节此时RW位为读操作开始。下面对它们的命令进行说明。访问存储器指令,H,:该指令是对DS的EEPROM进行访问发送该指令之后下一个字节就是被访问存储器的字地址数据。访问设置寄存器指令,ACH,:如果RW位置将写入数据到设置寄存器。发出请求后接下来的一个字节被写入。如果RW位置将读出存在寄存器中的值。读温度值指令,AAH,:即读出最后一个测温结果。DS产生两个字节即为寄存器内的结果。开始测温指令,EEH,:此命令将开始一次温度的测量不需再输入数据。在单次测量模式下可在进行转换的同时使DS保持闲置状态。在连续模式下将启动连续测温。停止测温指令,H,:该命令将停止温度的测量不需再输入数据。此命令可用来停止连续测温模式。发出请求后当前温度测量结束然后DS保持闲置状态。直到下一个开始测温的请求发出才继续进行连续测量。表IC通信开始主器件发送控制字节(DS地址和写操作)表IC通信开始主器件发送控制字节(DS地址和写操作)主机对DS写操作通信格式DS应答主器件发送访问DS的指令DS应答主器件发送的数据字节DS应答IC通信停止主机对DS读操作通信格式DS应答主器件发送访问DS的指令DS应答IC通信开始主器件发送控制字节(DS地址和读操作)DS应答数据字节主机应答数据字节主机非应答IC通信停止(实验任务用一片DS完成本地数字温度的测量并通过位数码管显示出测量的温度值。其硬件电路图如图所示(电路原理图图(系统板上硬件连线)(把“单片机系统”区域中的P,P用芯排线连接到“动态数码显示”(区域中的ABCDEFGH端子上。()(把“单片机系统”区域中的P,P用芯排线连接到“动态数码显示”区域中的SSSSSSSS端子上。()(把DS芯片插入到“二线总线模块”区域中的脚集成座上注意芯片不插反。()(把“二线总线模块”区域中的PINPIN分别用导线连接到“单片机系统”区域中的P和P端子上。()(把“二线总线模块”区域中的PINPIN“电源模块”区域中的GND端子上。PIN分别用导线连接到(程序设计内容()(由于DS是IC总线结构的串行数据传送它只需要SDA和SCL两根线完成数据的传送过程。因此我们在进行程序设计的时候也得按着IC协议来对DS芯片数据访问。有关IC协议参看有关资料这里不详述。对于ATS单片机本身没有IC硬件资源所以必须用软件来模拟IC协议过程。()(要从DS中读取温度值首先启动DS的内部温度AD开始转换对应着有相应的命令用来启动开始温度DS的指令集参考前面的叙述。一般情况下DS经过一次温度的变换转换有关需要经过秒钟左右的时间所以等待秒钟后即可读取内部的温度值对于读取的温度值仍然通过DS的指令集来完成温度的读取。但所有有数据的传送过程必须遵循IC协议。(C语言源程序#include#includeunsignedcharcodedisplaybit={xfe,xfd,xfb,xf,xef,xdf,xbf,xf}unsignedcharcodedisplaycode={xf,x,xb,xf,x,xd,xd,x,xf,xf,x,xc,x,xe,x,x,x}unsignedcharcodedotcode={,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,}sbitSDA=P^sbitSCL=P^unsignedchardisplaybuffer={,,,,,,,}unsignedchareepromdataunsignedchartemperdataunsignedchartimecountunsignedchardisplaycountbitsecondflag=unsignedcharsecondcount=unsignedcharretnunsignedintresultunsignedcharxunsignedintkunsignedintksvoiddelay(void)voiddelayms(void)voidistart(void)voidistop(void)voidiinit(void)voidiack(void)biticlock(void)bitisend(unsignedcharidata)unsignedcharireceive(void)bitstarttemperatureT(void)bitreadtemperatureT(unsignedchar*p)voiddelay(void){nop()nop()nop()nop()nop()nop()}voiddelayms(void){unsignedintifor(i=i<i){delay()}}voidistart(void){SCL=delay()SDA=delay()SCL=delay()}voidistop(void){SDA=delay()SCL=delay()SDA=delay()SCL=delay()}voidiinit(void){SCL=istop()}voidiack(void){SDA=iclock()SDA=}biticlock(void){bitsampleSCL=delay()sample=SDAnop()nop()SCL=delay()return(sample)}bitisend(unsignedcharidata){unsignedcharifor(i=i<i){SDA=(bit)(idatax)idata=idata<<iclock()}SDA=return(~iclock())}unsignedcharireceive(void){unsignedcharidata=unsignedcharifor(i=i<i){idata*=if(iclock())idata}return(idata)}bitstarttemperatureT(void){istart()if(isend(x)){if(isend(xee)){istop()delay()return()}else{istop()delay()return()}}else{istop()delay()return()}}bitreadtemperatureT(unsignedchar*p){istart()if(isend(x)){if(isend(xaa)){istart()if(isend(x)){*(p)=ireceive()iack()*p=ireceive()istop()delay()return()}else{istop()delay()return()}}else{istop()delay()return()}}else{istop()delay()return()}}voidmain(void){P=xfftimecount=displaycount=TMOD=xTH=xTL=xTR=ET=ET=EA=if(starttemperatureT())向DS发送启动AD温度转换命令成功则启动T定时s。{secondflag=secondcount=TH=TL=TR=}while(){if(secondflag==){secondflag=TR=if(readtemperatureT(temperdata))T定时s时间到读取DS的温度值{for(x=x<x){displaybufferx=}x=result=temperdata将读取的温度值进行数据处理并送到显示缓冲区while(result){displaybufferx=resultresult=resultx}displaybufferx=resultresult=temperdataresult=result>>displaybuffer=(dotcoderesult)displaybuffer=(dotcoderesult)if(starttemperatureT())温度值数据处理完毕重新启动DS开始温度转换{secondflag=secondcount=TH=TL=TR=}}}}}voidt(void)interruptusingT用于定时s时间到{secondcountif(secondcount==){secondcount=secondflag=}TH=TL=}voidt(void)interruptusingT定时ms用数码管的动态刷新{timecountif(timecount==)T定时ms到{timecount=if(displaycount==){P=(displaycodedisplaybufferdisplaycount|x)在该位同时还要显示小数点}else{P=displaycodedisplaybufferdisplaycount}P=displaybitdisplaycountdisplaycountif(displaycount==){displaycount=}}}实验(DSB数字温度计使用(DSB基本知识DSB数字温度计是DALLAS公司生产的,Wire即单总线器件具有线路简单体积小的特点。因此用它来组成一个测温系统具有线路简单在一根通信线可以挂很多这样的数字温度计十分方便。(DSB产品的特点()、只要求一个端口即可实现通信。()、在DSB中的每个器件上都有独一无二的序列号。()、实际应用中不需要外部任何元器件即可实现测温。()、测)、数字温度计的分辨率用户可以从位到量温度范围在,。C到。C之间。(位选择。()内部有温度上、下限告警设置。(DSB的引脚介绍TO,封装的DSB的引脚排列见图其引脚功能描述见表。(底视图)图表序号DSB详细引脚功能描述名称GNDDQVDD引脚功能描述地信号数据输入输出引脚。开漏单总线接口引脚。当被用着在寄生电源下也可以向器件提供电源。可选择的VDD引脚。当工作于寄生电源时此引脚必须接地。(DSB的使用方法由于DSB采用的是,Wire总线协议方式即在一根数据线实现数据的双向传输而对ATS单片机来说硬件上并不支持单总线协议因此我们必须采用软件的方法来模拟单总线的协议时序来完成对DSB芯片的访问。由于DSB是在一根IO线上读写数据因此对读写的数据位有着严格的时序要求。DSB有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始如果要求单总线器件回送数据在进行写命令后主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。DSB的复位时序DSB的读时序对于DSB的读时序分为读时序和读时序两个过程。对于DSB的读时隙是从主机把单总线拉低之后在秒之内就得释放单总线以让DSB把数据传输到单总线上。DSB在完成一个读时序过程至少需要us才能完成。DSB的写时序对于DSB的写时序仍然分为写时序和写时序两个过程。对于DSB写时序和写时序的要求不同当要写时序时单总线要被拉低至少us保证DSB能够在us到us之间能够正确地采样IO总线上的“”电平当要写时序时单总线被拉低之后在us之内就得释放单总线。(实验任务用一片DSB构成测温系统测量的温度精度达到度测量的温度的范围在,度到度之间用位数码管显示出来。(电路原理图(系统板上硬件连线()(把“单片机系统”区域中的P,P用芯排线连接到“动态数码显示”区域中的ABCDEFGH端子上。()(把“单片机系统”区域中的P,P用芯排线连接到“动态数码显示”区域中的SSSSSSSS端子上。()(把DSB芯片插入“四路单总线”区域中的任一个插座中注意电源与地信号不要接反。()(把“四路单总线”区域中的对应的DQ端子连接到“单片机系统”区域中的PRD端子上。(C语言源程序#include#includeunsignedcharcodedisplaybit={xfe,xfd,xfb,xf,xef,xdf,xbf,xf}unsignedcharcodedisplaycode={xf,x,xb,xf,x,xd,xd,x,xf,xf,x,xc,x,xe,x,x,x,x}unsignedcharcodedotcode={,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,}unsignedchardisplaycountunsignedchardisplaybuf={,,,,,,,}unsignedchartimecountunsignedcharreaddatasbitDQ=P^bitsflagbitresetpulse(void){unsignedchariDQ=for(i=i>i)DQ=for(i=i>i)return(DQ)for(i=i>i)}voidwritecommandtodsb(unsignedcharcommand){unsignedchariunsignedcharjfor(i=i<i){if((commandx)==){DQ=for(j=j>j)DQ=}else{DQ=for(j=j>j)DQ=for(j=j>j)}command=cror(command,)}}unsignedcharreaddatafromdsb(void){unsignedchariunsignedcharjunsignedchartemptemp=for(i=i<i){temp=cror(temp,)DQ=nop()nop()DQ=for(j=j>j)if(DQ==){temp=temp|x}else{temp=temp|x}for(j=j>j)}return(temp)}voidmain(void){TMOD=xTH=()TL=()ET=EA=while(resetpulse())writecommandtodsb(xcc)writecommandtodsb(x)TR=while(){}}voidt(void)interruptusing{unsignedcharxunsignedintresultTH=()TL=()if(displaycount==){P=displaycodedisplaybufdisplaycount|x}else{P=displaycodedisplaybufdisplaycount}P=displaybitdisplaycountdisplaycountif(displaycount==){displaycount=}timecountif(timecount==){timecount=while(resetpulse())writecommandtodsb(xcc)writecommandtodsb(xbe)readdata=readdatafromdsb()readdata=readdatafromdsb()for(x=x<x){displaybufx=}sflag=if((readdataxf)!=x){sflag=readdata=~readdatareaddata=~readdataresult=readdatareaddata=resultif(result>){readdata}}readdata=readdata<<readdata=readdataxx=readdatax=x>>x=xxfreaddata=readdata|xx=result=readdatawhile(result){displaybufx=resultresult=resultx}displaybufx=resultif(sflag==){displaybufx=}x=readdataxfx=x<<displaybuf=(dotcodex)displaybuf=(dotcodex)while(resetpulse())writecommandtodsb(xcc)writecommandtodsb(x)}

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/103

51单片机例程汇总[优质文档]

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利