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

上传资料

关闭

关闭

关闭

封号提示

内容

首页 单片机C语言例程模块

单片机C语言例程模块.doc

单片机C语言例程模块

以后我的那个她与我无关
2017-11-25 0人阅读 举报 0 0 暂无简介

简介:本文档为《单片机C语言例程模块doc》,可适用于IT/计算机领域

单片机C语言例程模块单片机C语言例程第页共页目录第一章ATS单片机实验及实践系统板简介第二章KeilC软件使用第三章实验及实践课题(闪烁灯(模拟开关灯多路开关状态指示(广告灯的左移右移(广告灯(利用取表方式)(报警产生器(IO并行口直接驱动LED显示(按键识别方法之一(一键多功能按键识别技术(,计数器(,秒计时器(利用软件延时)(可预置可逆位计数器(动态数码显示技术(×矩阵式键盘识别技术(定时计数器T作定时应用技术(一)(定时计数器T作定时应用技术(二)(秒马表设计(“嘀、嘀、„„”报警声(“叮咚”门铃(数字钟,,(拉幕式数码显示技术电子琴(模拟计算器数字输入及显示(XLED点阵显示技术(点阵式LED“,”数字显示技术(点阵式LED简单图形显示技术(ADCAD转换器基本应用技术(数字电压表(两点间温度控制(四位数数字温度计(位数显频率计数器(电子密码锁设计(×键盘及位数码管显示构成的电子密码锁(带有存储器功能的数字温度计,DS技术应用(DSB数字温度计使用单片机C语言例程第页共页第一章ATS单片机实验及实践系统板简介ATS单片机实验及实践系统板(以后简介系统板)集成多个硬件资源模块每个模块各自可以成为独立的单元也可以相互组合因此可以为不同阶层的单片机爱好者及单片机开发者提供不同的开发环境。每个硬件模块介绍如下:(继电器控制模块系统板上提供了路继电器控制模块分布在系统板的最左上端区域中输入信号由Realyin和Realyin端口输入分别控制两路继电器继电器控制的信号分别由最上端的两个插针输入和输出。分别称为“comopenshort”“comopenshort”由于这个两个继电器是单刀单掷控制当继电器不吸合时“com”和“short”相通“com”和“short”相通当继电器吸合时“com”和“open”相通“com”和“open”相通。其电路原理图所示。图(参考电压源模块在系统板上写有“参考电压源”区域中是由TL来完成参考电压的调节调节范围在,V之间主要为是系统板上需要参考电压芯片或是为外部设备提供参考电压由VarVrefOut端口输出。其电路原理图如图所示。图图(三路可调电压模块此模块主要是用于提供,V之间的可变的模拟电压值即可以作为参考电压源也可以作为模拟电压信号。这三路是相互独立的。分别对应着由VRVRVR端口输出。具体的电路原理图如图所示。(电源模块电源模hflag==)){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=单片机C语言例程第页共页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单片机C语言例程第页共页{alarmflag=cnta=cntb=}}(四位数数字温度计(温度传感器AD基本知识AD产生的电流与绝对温度成正比它可接收的工作电压为V,V检测的温度范围为,,它有非常好的线性输出性能温度每增加其电流增加uA。AD温度与电流的关系如下表所示摄氏温度AD电流经KΩ电压uAVuAVuAVuAVuAVuAVuAVuAVAD引脚图(有问题否)(实验任务利用AD温度传感器完成温度的测量把转换的温度值的模拟量送入ADC的其中一个通道进行AD转换将转换的结果进行温度值变换之后送入数码管显示。(电路原理图图(系统板上硬件连线()把“单片机系统”区域中的P,P与“动态数码显示”区域中的ABCDEFGH端口用芯排线连接。单片机C语言例程第页共页()把“单片机系统”区域中的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语言源程序#include<ATXH>#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={,,,,,,,}unsignedchardispcountunsignedchargetdataunsignedlongtempunsignedcharibitsflagsbitST=P^sbitOE=P^sbitEOC=P^sbitCLK=P^sbitLED=P^sbitLED=P^sbitSPK=P^voidmain(void){ST=OE=TMOD=xTH=xTL=xTH=()TL=()TR=TR=ET=ET=EA=ST=ST=getdata=while(){}}voidt(void)interruptusing单片机C语言例程第页共页{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=}}单片机C语言例程第页共页(位数显频率计数器(实验任务利用ATS单片机的T、T的定时计数器功能来完成对输入的信号进行频率计数计数的频率结果通过位动态数码管显示出来。要求能够对,KHZ的信号频率进行准确计数计数误差不超过HZ。(电路原理图图(系统板上硬件连线()把“单片机系统”区域中的P,P与“动态数码显示”区域中的ABCDEFGH端口用芯排线连接。()把“单片机系统”区域中的P,P与“动态数码显示”区域中的SSSSSSSS端口用芯排线连接。()把“单片机系统”区域中的P(T)端子用导线连接到“频率产生器”区域中的WAVE端子上。(程序设计内容()定时计数器T和T的工作方式设置由图可知T是工作在计数状态下对输入的频率信号进行计数但对工作在计数状态下的T最大计数值为f由于f,MHz因此:T的最大计数频率为KHz。对于频率的概念就是在一秒只数脉冲的个数即为频OSCOSC率值。所以T工作在定时状态下每定时秒中到就停止T的计数而从T的计数单元中读取计数的数值然后进行数据处理。送到数码管显示出来。()T工作在定时状态下最大定时时间为ms达不到秒的定时所以采用定时ms共定时次即可完成秒的定时功能。(C语言源程序#include<ATXH>unsignedcharcodedispbit={xfe,xfd,xfb,xf,xef,xdf,xbf,xf}unsignedcharcodedispcode={xf,x,xb,xf,x,xd,xd,x,xf,xf,x,x}unsignedchardispbuf={,,,,,,,}unsignedchartempunsignedchardispcountunsignedcharTcountunsignedchartimecountbitflagunsignedlongxvoidmain(void){unsignedchari单片机C语言例程第页共页TMOD=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==)单片机C语言例程第页共页{dispcount=}}(电子密码锁设计(实验任务根据设定好的密码采用二个按键实现密码的输入功能当密码输入正确之后锁就打开如果输入的三次的密码不正确就锁定按键秒钟同时发现报警声直到没有按键按下种后才打开按键锁定功能否则在秒钟内仍有按键按下就重新锁定按键秒时间并报警。(电路原理图电路如图所示。(系统板上硬件连线()把“单片机系统”区域中的PAD用导线连接到“音频放大模块”区域中的SPKIN端子上()把“音频放大模块”区域中的SPKOUT端子接喇叭和()把“单片机系统”区域中的PA,PA用芯排线连接到“四路静态数码显示”区域中的任一个ABCDEFGH端子上()把“单片机系统“区域中的P用导线连接到“八路发光二极管模块”区域中的L端子上()把“单片机系统”区域中的PWR、PRD用导线连接到“独立式键盘”区域中的SP和SP端子上(程序设计内容()密码的设定在此程序中密码是固定在程序存储器ROM中假设预设的密码为“”共位密码。()密码的输入问题:由于采用两个按键来完成密码的输入那么其中一个按键为功能键另一个按键为数字键。在输入过程中首先输入密码的长度接着根据密码的长度输入密码的位数直到所有长度的密码都已经输入完毕或者输入确认功能键之后才能完成密码的输入过程。进入密码的判断比较处理状态并给出相应的处理过程。()按键禁止功能:初始化时是允许按键输入密码当有按键按下并开始进入按键识别状态时按键禁止功能被激活但启动的状态在次密码输入不正确的情况下发生的。图(C语言源程序#include<ATXH>unsignedcharcodeps={,,,,}unsignedcharcodedispcode={xf,x,xb,xf,x,xd,xd,x,xf,xf,x,x}unsignedcharpslen=unsignedchartemplen单片机C语言例程第页共页unsignedchardigitunsignedcharfuncountunsignedchardigitcountunsignedcharpsbufbitcmpflagbithibitflagbiterrorflagbitrightflagunsignedintsecondunsignedintaaunsignedintbbbitalarmflagbitexchangeflagunsignedintccunsignedintddbitokflagunsignedcharokaunsignedcharokbvoidmain(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==)单片机C语言例程第页共页{if(hibitflag==){digitcountif(digitcount==){digitcount=}P=dispcodedigitcountif(funcount==){pslen=digitcounttemplen=pslen}elseif(funcount>){psbuffuncount=digitcount}}else{second=}while(P==)}}}else{cmpflag=for(i=i<psleni){if(psi!=psbufi){hibitflag=i=pslenerrorflag=rightflag=cmpflag=second=gotoa}}cc=errorflag=rightflag=hibitflag=a:cmpflag=}}}voidt(void)interruptusing{TH=()TL=()if((errorflag==)(rightflag==)){bbif(bb==){bb=单片机C语言例程第页共页alarmflag=~alarmflag}if(alarmflag==){P=~P}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{单片机C语言例程第页共页okbif(okb==){okb=P=~P}}}}(×键盘及位数码管显示构成的电子密码锁(实验任务用×组成,数字键及确认键。用位数码管组成显示电路提示信息当输入密码时只显示“”当密码位数输入完毕按下确认键时对输入的密码与设定的密码进行比较若密码正确则门开此处用LED发光二极管亮一秒钟做为提示同时发出“叮咚”声若密码不正确禁止按键输入秒同时发出“嘀、嘀”报警声若在秒之内仍有按键按下则禁止按键输入秒被重新禁止。(电路原理图图(系统板上硬件连线()把“单片机系统”区域中的P,P用芯排线连接到“动态数码显示”区域中的ABCDEFGH端子上。()把“单片机系统“区域中的P,P用芯排线连接到“动态数码显示”区域中的SSSSSSSS端子上。()把“单片机系统”区域中的P,P用芯排线连接到“×行列式键盘”区域中的RRRRCCCC端子上。()把“单片机系统”区域中的P用导线连接到“八路发光二极管模块”区域中的L端子上。()把“单片机系统”区域中的P用导线连接到“音频放大模块”区域中的SPKIN端子上。()把“音频放大模块”区域中的SPKOUT接到喇叭上。(程序设计内容()×行列式键盘识别技术:有关这方面内容前面已经讨论过这里不再重复。单片机C语言例程第页共页()位数码显示初始化时显示“P”接着输入最大位数的密码当密码输入完后按下确认键进行密码比较然后给出相应的信息。在输入密码过程中显示器只显示“”。当数字输入超过个时给出报警信息。在密码输入过程中若输入错误可以利用“DEL”键删除刚才输入的错误的数字。()×行列式键盘的按键功能分布图如图所示:图(C语言源程序#include<ATXH>unsignedcharps={,,,,}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=xff单片机C语言例程第页共页P=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{单片机C语言例程第页共页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=P单片机C语言例程第页共页P=~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}单片机C语言例程第页共页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=单片机C语言例程第页共页}}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:单片机C语言例程第页共页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)单片机C语言例程第页共页{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<){单片机C语言例程第页共页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封装如图所示。()引脚描述及功能方框图其引脚描述如表所示:单片机C语言例程第页共页图DS的功能结构图如图所示:图()DS工作原理温度测量图是温度测量的原理结构图图温度测量的原理结构图DS在测量温度时使用了独有的在线温度测量技术。它通过在一个由对温度高度敏感的振荡器决定的计数周期内对温度低敏感的振荡器时钟脉冲的计数值的计算来测量温度。DS在计数器中预置了一个初值,它相当于,。如果计数周期结束之前计数器达到已预置了此初值的温度寄存器中的数字就会增加从而表明温度高于,。与此同时计数器斜坡累加电路被重新预置一个值然后计数器重新对时钟计数直到计数值为。通过改变增加的每内的计数器的计数斜坡累加电路可以补偿振荡器的非线性误差以提高精度任意温度下计数器的值和每一斜坡累加电路的值对应的计数次数须为已知。DS通过这些计算可以得到的精度温度输出为位在发出读温度值请求后还会输出两位补偿值。表给出了所测的温度和输出数据的关系。这些数据可通过线制串行口连续输出MSB在前LSB在后。表温度与输出数据关系表温度数字量输出(二进制)数字量输出(十六进制)DHH单片机C语言例程第页共页HHFFHEFHCH由于数据在总线上传输时MSB在前所以DS读出的数据可以是一个字节(分辨率为)也可以是两个字节第二个字节包含的最低位为。表是位温度寄存器中存储温度值的数据格式高八位字节低八位字节SBBBBBBBBBBBB表温度值的数据存储格式其中S,为符号位当S,时表示当前的测量的温度为正的温度当S,时表示当前的测量的温度为负的温度。B,B为当前测量的温度值。最低三位被设置为。DS工作方式DS的工作方式是由片上的配置状态寄存器来决定的如表该寄存器的定义如下:表配置状态寄存器格式DONESHOT其中DONE为转换完成位温度转换结束时置正在进行转换时为SHOT为温度转换模式选择。SHOT为时为单次转换模式DS在收到启动温度转换命令EEH后进行一次温度转换。SHOT为时为连续转换模式此时DS将连续进行温度转换并将最近一次的结果保存在温度寄存器中。该位为非易失性的。片内字节存储器操作控制器对DS的存储器编程有两种模式:一种是字节编程模式另一种是页编程模式。在字节编程模式中主控制器发送地址和一个字节的数据到DS。AA(其中RW控制位为低电平“”)。指示从接收器被寻在主器件发出开始(START)信号以后主器件发送写控制字节即A址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保持闲置状态。直到下一个开始测温的请求发出才继续进行连续测量。表主机对DS写操作通信格式C主器件发I主器件发IC通送控制字主器件发通DS应送访问DS应DS应信开节(DS送的数据信答DS的答答始地址和写字节停指令操作)止表主机对DS读操作通信格式IC主器件发DS主器件DSIC主器件DS数主I通送控制字发送访通发送控数据主机据机C信节(DS应问应信制字节应字节应答字非通开地址和写答DS答开(DS答节应信单片机C语言例程第页共页始操作)的指令始地址和答停读操作)止(实验任务用一片DS完成本地数字温度的测量并通过位数码管显示出测量的温度值。其硬件电路图如图所示(电路原理图电路图如图所示(系统板上硬件连线()把“单片机系统”区域中的P,P用芯排线连接到“动态数码显示”区域中的ABCDEFGH端子上。()把“单片机系统”区域中的P,P用芯排线连接到“动态数码显示”区域中的SSSSSSSS端子上。()把DS芯片插入到“二线总线模块”区域中的脚集成座上注意芯片不插反。()把“二线总线模块”区域中的PINPIN分别用导线连接到“单片机系统”区域中的P和P端子上。()把“二线总线模块”区域中的PINPINPIN分别用导线连接到“电源模块”区域中的GND端子上。(程序设计内容C总线结构的串行数据传送它只需要SDA和SCL两根线完成数据的传送过程。因此我们在进行程序设计的时候()由于DS是I也得按着IC协议来对DS芯片数据访问。有关IC协议参看有关资料这里不详述。对于ATS单片机本身没有IC硬件资源所以必须用软件来模拟IC协议过程。()要从DS中读取温度值首先启动DS的内部温度AD开始转换对应着有相应的命令用来启动开始温度转换有关DS的指令集参考前面的叙述。一般情况下DS经过一次温度的变换需要经过秒钟左右的时间所以等待秒钟后即可读取内部的温度值对于读取的温度值仍然通过DS的指令集来完成温度的读取。但所有有数据的传送过程必须遵循IC协议。图(C语言源程序#include<ATXH>#include<INTRINSH>unsignedcharcodedisplaybit={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^单片机C语言例程第页共页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()单片机C语言例程第页共页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)单片机C语言例程第页共页{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()}}单片机C语言例程第页共页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=}}}}}单片机C语言例程第页共页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产品的特点(a)只要求一个端口即可实现通信。(b)在DSB中的每个器件上都有独一无二的序列号。(c)实际应用中不需要外部任何元器件即可实现测温。。。(d)测量温度范围在,C到C之间。(e)数字温度计的分辨率用户可以从位到位选择。(f)内部有温度上、下限告警设置。、DSB的引脚介绍TO,封装的DSB的引脚排列见图其引脚功能描述见表。图(底视图)表DSB详细引脚功能描述序号名称引脚功能描述GND地信号数据输入输出引脚。开漏单总线接口引脚。当被用着在寄生电源下也可以向器件提DQ供电源。VDD可选择的VDD引脚。当工作于寄生电源时此引脚必须接地。(DSB的使用方法单片机C语言例程第页共页由于DSB采用的是,Wire总线协议方式即在一根数据线实现数据的双向传输而对ATS单片机来说硬件上并不支持单总线协议因此我们必须采用软件的方法来模拟单总线的协议时序来完成对DSB芯片的访问。由于DSB是在一根IO线上读写数据因此对读写的数据位有着严格的时序要求。DSB有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始如果要求单总线器件回送数据在进行写命令后主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。DSB的复位时序DSB的读时序对于DSB的读时序分为读时序和读时序两个过程。对于DSB的读时隙是从主机把单总线拉低之后在秒之内就得释放单总线以让DSB把数据传输到单总线上。DSB在完成一个读时序过程至少需要us才能完成。DSB的写时序对于DSB的写时序仍然分为写时序和写时序两个过程。对于DSB写时序和写时序的要求不同当要写时序时单总线要被拉低至少us保证DSB能够在us到us之间能够正确地采样IO总线上的“”电平当要写时序时单总线被拉低之后在us之内就得释放单总线。(实验任务用一片DSB构成测温系统测量的温度精度达到度测量的温度的范围在,度到度之间用位数码管显示出来。(电路原理图单片机C语言例程第页共页(系统板上硬件连线()把“单片机系统”区域中的P,P用芯排线连接到“动态数码显示”区域中的ABCDEFGH端子上。()把“单片机系统”区域中的P,P用芯排线连接到“动态数码显示”区域中的SSSSSSSS端子上。()把DSB芯片插入“四路单总线”区域中的任一个插座中注意电源与地信号不要接反。()把“四路单总线”区域中的对应的DQ端子连接到“单片机系统”区域中的PRD端子上。(C语言源程序#include<ATXH>#include<INTRINSh>unsignedcharcodedisplaybit={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)单片机C语言例程第页共页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=单片机C语言例程第页共页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|x单片机C语言例程第页共页x=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

等待寻找结果

我知道了
评分:

/316

单片机C语言例程模块

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利