关闭

关闭

关闭

封号提示

内容

首页 单片机C语言程序设计实训100例.pdf

单片机C语言程序设计实训100例.pdf

单片机C语言程序设计实训100例.pdf

yuanshik812 2011-09-19 评分 0 浏览量 0 0 0 0 暂无简介 简介 举报

简介:本文档为《单片机C语言程序设计实训100例pdf》,可适用于IT/计算机领域,主题内容包含《单片机语言程序设计实训例基于和仿真》案例CPROTEUS上海师范大学信息与机电工程学院倪继锋《单片机C语言程序设计实训例基于Proteus仿真》案符等。

《单片机语言程序设计实训例基于和仿真》案例CPROTEUS上海师范大学信息与机电工程学院倪继锋《单片机C语言程序设计实训例基于Proteus仿真》案例第篇基础程序设计闪烁的LED*名称:闪烁的LED说明:LED按设定的时间间隔闪烁*#include<regh>#defineucharunsignedchar#defineuintunsignedintsbitLED=P^延时voidDelayMS(uintx){uchariwhile(x){for(i=i<i)}}主程序voidmain(){while(){LED=~LEDDelayMS()}}从左到右的流水灯*名称:从左到右的流水灯说明:接在P口的个LED从左到右循环依次点亮产生走马灯效果*#include<regh>#include<intrinsh>#defineucharunsignedchar#defineuintunsignedint《单片机语言程序设计实训例基于和仿真》案例CPROTEUS上海师范大学信息与机电工程学院倪继锋延时voidDelayMS(uintx){uchariwhile(x){for(i=i<i)}}主程序voidmain(){P=xfewhile(){P=crol(P,)P的值向左循环移动DelayMS()}}只LED左右来回点亮*名称:只LED左右来回点亮说明:程序利用循环移位函数crol和cror形成来回滚动的效果*#include<regh>#include<intrinsh>#defineucharunsignedchar#defineuintunsignedint延时voidDelayMS(uintx){uchariwhile(x){for(i=i<i)}}主程序voidmain(){uchariP=xwhile(){《单片机语言程序设计实训例基于和仿真》案例CPROTEUS上海师范大学信息与机电工程学院倪继锋for(i=i<i){P=crol(P,)P的值向左循环移动DelayMS()}for(i=i<i){P=cror(P,)P的值向右循环移动DelayMS()}}}花样流水灯*名称:花样流水灯说明:只LED分两组按预设的多种花样变换显示*#include<regh>#defineucharunsignedchar#defineuintunsignedintucharcodePatternP={xfc,xf,xf,xe,xcf,xf,xf,xf,xff,xff,xff,xff,xff,xff,xff,xff,xe,xdb,xbd,xe,xbd,xdb,xe,xff,xe,xc,x,x,x,xc,xe,xff,xaa,x,x,xff,xf,xf,x,xff,xf,xf,xe,xc,xf,xf,xf,xf,xf,xf,xf,xf,xc,xe,xf,xf,xff,x,x,xff,xff,xf,xf,xff,xfe,xfd,xfb,xf,xef,xdf,xbf,xf,xff,xff,xff,xff,xff,xff,xff,xff,xff,xff,xff,xff,xff,xff,xff,xff,xf,xbf,xdf,xef,xf,xfb,xfd,xfe,xfe,xfc,xf,xf,xe,xc,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,xc,xe,xf,xf,xfc,xfe,x,xff,x,xff,x,xff,x,xff}ucharcodePatternP={xff,xff,xff,xff,xff,xff,xff,xfe,xfc,xf,xf,xe,xcf,xf,xf,xff,xe,xdb,xbd,xe,xbd,xdb,xe,xff,xe,xc,x,x,x,xc,xe,xff,xaa,x,x,xff,xf,xf,x,xff,xf,xf,xe,xc,xf,xf,xf,xf,xf,xf,xf,xf,xc,xe,xf,xf,xff,x,x,xff,xff,xf,xf,xff,xff,xff,xff,xff,xff,xff,xff,xff,xfe,xfd,xfb,xf,xef,xdf,xbf,xf,xf,xbf,xdf,xef,xf,xfb,xfd,xfe,xff,xff,xff,xff,xff,xff,xff,xff,xff,xff,xff,xff,xff,xff,xff,xff,xfe,xfc,xf,xf,xe,xc,x,x,x,x,xc,xe,xf,xf,xfc,xfe,xff,xff,xff,xff,xff,xff,xff,xff,《单片机语言程序设计实训例基于和仿真》案例CPROTEUS上海师范大学信息与机电工程学院倪继锋x,xff,x,xff,x,xff,x,xff}延时voidDelayMS(uintx){uchariwhile(x){for(i=i<i)}}主程序voidmain(){uchariwhile(){从数组中读取数据送至P和P口显示for(i=i<i){P=PatternPiP=PatternPiDelayMS()}}}LED模拟交通灯*名称:LED模拟交通灯说明:东西向绿灯亮若干秒黄灯闪烁次后红灯亮红灯亮后南北向由红灯变为绿灯若干秒后南北向黄灯闪烁此后变红灯东西向变绿灯如此重复。*#include<regh>#defineucharunsignedchar#defineuintunsignedintsbitREDA=P^东西向灯sbitYELLOWA=P^sbitGREENA=P^sbitREDB=P^南北向灯sbitYELLOWB=P^sbitGREENB=P^ucharFlashCount=,OperationType=闪烁次数操作类型变量《单片机语言程序设计实训例基于和仿真》案例CPROTEUS上海师范大学信息与机电工程学院倪继锋延时voidDelayMS(uintx){uchariwhile(x)for(i=i<i)}交通灯切换voidTrafficLight(){switch(OperationType){case:东西向绿灯与南北向红灯亮REDA=YELLOWA=GREENA=REDB=YELLOWB=GREENB=DelayMS()OperationType=breakcase:东西向黄灯闪烁绿灯关闭DelayMS()YELLOWA=~YELLOWAGREENA=if(FlashCount!=)return闪烁次FlashCount=OperationType=breakcase:东西向红灯南北向绿灯亮REDA=YELLOWA=GREENA=REDB=YELLOWB=GREENB=DelayMS()OperationType=breakcase:南北向黄灯闪烁次DelayMS()YELLOWB=~YELLOWBGREENB=if(FlashCount!=)returnFlashCount=OperationType=}}主程序voidmain(){while()TrafficLight()}单只数码管循环显示~《单片机语言程序设计实训例基于和仿真》案例CPROTEUS上海师范大学信息与机电工程学院倪继锋*名称:单只数码管循环显示~说明:主程序中的循环语句反复将~的段码送至P口使数字~循环显示*#include<regh>#include<intrinsh>#defineucharunsignedchar#defineuintunsignedintucharcodeDSYCODE={xc,xf,xa,xb,x,x,x,xf,x,x,xff}延时voidDelayMS(uintx){uchartwhile(x)for(t=t<t)}主程序voidmain(){uchari=P=xwhile(){P=~DSYCODEii=(i)DelayMS()}}只数码管滚动显示单个数字*名称:只数码管滚动显示单个数字说明:数码管从左到右依次滚动显示~程序通过每次仅循环选通一只数码管*#include<regh>#include<intrinsh>#defineucharunsignedchar#defineuintunsignedintucharcodeDSYCODE={xc,xf,xa,xb,x,x,x,xf,x,x}延时voidDelayMS(uintx){uchartwhile(x)for(t=t<t)《单片机语言程序设计实训例基于和仿真》案例CPROTEUS上海师范大学信息与机电工程学院倪继锋}主程序voidmain(){uchari,wei=xwhile(){for(i=i<i){P=xff关闭显示wei=crol(wei,)P=DSYCODEi发送数字段码P=wei发送位码DelayMS()}}}只数码管动态显示多个不同字符电路如上图*名称:只数码管动态显示多个不同字符说明:数码管动态扫描显示~。*#include<regh>#include<intrinsh>#defineucharunsignedchar#defineuintunsignedintucharcodeDSYCODE={xc,xf,xa,xb,x,x,x,xf,x,x}延时voidDelayMS(uintx){uchartwhile(x)for(t=t<t)}主程序voidmain(){uchari,wei=xwhile(){for(i=i<i){P=xffP=DSYCODEi发送段码wei=crol(wei,)《单片机语言程序设计实训例基于和仿真》案例CPROTEUS上海师范大学信息与机电工程学院倪继锋P=wei发送位码DelayMS()}}}只数码管闪烁显示数字串电路如上图*名称:只数码管闪烁显示数字串说明:数码管闪烁显示由~构成的一串数字本例用动态刷新法显示一串数字在停止刷新时所有数字显示消失。*#include<regh>#defineucharunsignedchar#defineuintunsignedint段码表ucharcodeDSYCODE={xc,xf,xa,xb,x,x,x,xf,x,x}位码表ucharcodeDSYIDX={x,x,x,x,x,x,x,x}延时voidDelayMS(uintx){uchartwhile(x)for(t=t<t)}主程序voidmain(){uchari,jwhile(){for(i=i<i){for(j=j<j){P=xffP=DSYCODEj发送段码P=DSYIDXj发送位码DelayMS()}}P=x关闭所有数码管并延时DelayMS()}}《单片机语言程序设计实训例基于和仿真》案例CPROTEUS上海师范大学信息与机电工程学院倪继锋只数码管滚动显示数字串电路如上图*名称:只数码管滚动显示数字串说明:数码管向左滚动显示个字符构成的数字串*#include<regh>#include<intrinsh>#defineucharunsignedchar#defineuintunsignedint段码表ucharcodeDSYCODE={xc,xf,xa,xb,x,x,x,xf,x,x,xff}下面数组看作环形队列显示从某个数开始的个数(表示黑屏)ucharNum={,,,,,,,,,,}延时voidDelayMS(uintx){uchartwhile(x)for(t=t<t)}主程序voidmain(){uchari,j,k=,m=xwhile(){刷新若干次保持一段时间的稳定显示for(i=i<i){for(j=j<j){发送段码采用环形取法从第k个开始取第j个P=xffP=DSYCODENum(kj)m=crol(m,)P=m发送位码DelayMS()}}k=(k)环形队列首支针k递增Num下标范围~故对取余}}KK控制LED移位*名称:KK控制LED移位说明:按下K时P口LED上移一位《单片机语言程序设计实训例基于和仿真》案例CPROTEUS上海师范大学信息与机电工程学院倪继锋按下K时P口LED下移一位按下K时P口LED上移一位按下K时P口LED下移一位*#include<regh>#include<intrinsh>#defineucharunsignedchar#defineuintunsignedint延时voidDelayMS(uintx){uchariwhile(x)for(i=i<i)}根据P口的按键移动LEDvoidMoveLED(){if((Px)==)P=cror(P,)Kelseif((Px)==)P=crol(P,)Kelseif((Px)==)P=cror(P,)Kelseif((Px)==)P=crol(P,)K}主程序voidmain(){ucharRecentKey最近按键P=xfeP=xfeP=xffRecentKey=xffwhile(){if(RecentKey!=P){RecentKey=P保存最近按键MoveLED()DelayMS()}}}KK按键状态显示《单片机语言程序设计实训例基于和仿真》案例CPROTEUS上海师范大学信息与机电工程学院倪继锋*名称:KK按键状态显示说明:K、K按下时LED点亮松开时熄灭K、K按下并释放时LED点亮再次按下并释放时熄灭*#include<regh>#defineucharunsignedchar#defineuintunsignedintsbitLED=P^sbitLED=P^sbitLED=P^sbitLED=P^sbitK=P^sbitK=P^sbitK=P^sbitK=P^延时voidDelayMS(uintx){uchariwhile(x)for(i=i<i)}主程序voidmain(){P=xffP=xffwhile(){LED=KLED=Kif(K==){while(K==)LED=~LED}if(K==){while(K==)LED=~LED}DelayMS()}}KK分组控制LED《单片机语言程序设计实训例基于和仿真》案例CPROTEUS上海师范大学信息与机电工程学院倪继锋*名称:KK分组控制LED说明:每次按下K时递增点亮一只LED全亮时再次按下则再次循环开始K按下后点亮上面只LEDK按下后点亮下面只LEDK按下后关闭所有LED*#include<regh>#defineucharunsignedchar#defineuintunsignedint延时voidDelayMS(uintx){uchariwhile(x)for(i=i<i)}主程序voidmain(){uchark,t,KeyStateP=xffP=xffwhile(){t=Pif(t!=xff){DelayMS()if(t!=P)continue取得位按键值由模式XXXX(X中有一位为其他均为)变为模式XXXX(X中有一位为其他均为)KeyState=~t>>k=检查所在位置累加获取按键号kwhile(KeyState!=){kKeyState>>=}根据按键号k进行种处理switch(k){case:if(P==x)P=xffP<<=DelayMS()breakcase:P=xfbreak《单片机语言程序设计实训例基于和仿真》案例CPROTEUS上海师范大学信息与机电工程学院倪继锋case:P=xfbreakcase:P=xff}}}}KK控制数码管移位显示*名称:KK控制数码管移位显示说明:按下K时加计数并增加显示位按下K时减计数并减少显示位按下K时清零。*#include<regh>#defineucharunsignedchar#defineuintunsignedint段码ucharcodeDSYCODE={xc,xf,xa,xb,x,x,x,xf,x,x,xff}位码ucharcodeDSYIndex={x,x,x,x,x,x,x,x}待显示到各数码管的数字缓冲(开始仅在位显示其他黑屏)ucharDisplayBuffer={,,,,,,,}延时voidDelayMS(uintx){uchariwhile(x)for(i=i<i)}voidShowCountONDSY(){ucharifor(i=i<i){P=xffP=DSYCODEDisplayBufferiP=DSYIndexiDelayMS()}}主程序voidmain(){uchari,KeyNO,KeyCounts=《单片机语言程序设计实训例基于和仿真》案例CPROTEUS上海师范大学信息与机电工程学院倪继锋P=xffP=xffP=xwhile(){ShowCountONDSY()P=xffKeyNO=PP口按键状态分别为KxfeKxfd,Kxfbswitch(KeyNO){casexfe:KeyCountsif(KeyCounts>)KeyCounts=DisplayBufferKeyCounts=KeyCountsbreakcasexfd:if(KeyCounts>)DisplayBufferKeyCounts=breakcasexfb:DisplayBuffer=for(i=i<i)DisplayBufferi=KeyCounts=}若键未释放则仅刷新显示不进行键扫描while(P!=xff)ShowCountONDSY()}}KK控制数码管加减演示*名称:KK控制数码管加减演示说明:按下K后加计数按下K后减计数按下K后清零。*#include<regh>#include<intrinsh>#defineucharunsignedchar#defineuintunsignedint段码ucharcodeDSYCODE={xc,xf,xa,xb,x,x,x,xf,x,x,xff}待显示的位缓冲ucharNumBuffer={,,}按键代码按键计数ucharKeyCode,KeyCounts=延时voidDelayMS(uintx){《单片机语言程序设计实训例基于和仿真》案例CPROTEUS上海师范大学信息与机电工程学院倪继锋uchariwhile(x)for(i=i<i)}显示函数voidShowCountsONDSY(){uchari,j=xNumBuffer=KeyCountsNumBuffer=KeyCountsNumBuffer=KeyCountsfor(i=i<i){j=cror(j,)P=xffP=DSYCODENumBufferiP=jDelayMS()}}主程序voidmain(){uchariP=xffP=xffP=xKeyCode=xffwhile(){ShowCountsONDSY()P=xffKeyCode=P有键按下时数码管刷新显示次该行代码同时起到延时作用if(KeyCode!=xff)for(i=i<i)ShowCountsONDSY()switch(KeyCode){casexfe:if(KeyCounts<)KeyCountsbreakcasexfd:if(KeyCounts>)KeyCountsbreakcasexfb:KeyCounts=}KeyCode=xff}《单片机语言程序设计实训例基于和仿真》案例CPROTEUS上海师范大学信息与机电工程学院倪继锋}X矩阵键盘控制条形LED显示*名称:X矩阵键盘控制条形LED显示说明:运行本例时按下的按键值越大点亮的LED越多。*#include<regh>#include<intrinsh>#defineucharunsignedchar#defineuintunsignedint矩阵键盘按键特征码表ucharcodeKeyCodeTable={x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x}延时voidDelayMS(uintx){uchariwhile(x)for(i=i<i)}键盘扫描ucharKeysScan(){ucharsCode,kCode,i,k低位置放入行P=xf若高位出现则有键按下if((Pxf)!=xf){DelayMS()if((Pxf)!=xf){sCode=xfe行扫描码初值for(k=k<k)对行分别进行扫描{P=sCodeif((Pxf)!=xf){kCode=~Pfor(i=i<i)查表得到按键序号并返回if(kCode==KeyCodeTablei)《单片机语言程序设计实训例基于和仿真》案例CPROTEUS上海师范大学信息与机电工程学院倪继锋return(i)}elsesCode=crol(sCode,)}}}return()}主程序voidmain(){uchari,PLED,PLEDucharKeyNo=按键序号表示无按键while(){KeyNo=KeysScan()扫描键盘获取按键序号KeyNoif(KeyNo!=){PLED=xffPLED=xfffor(i=i<=KeyNoi)键值越大点亮的LED越多{if(i<)PLED>>=elsePLED>>=}P=PLED点亮条形LEDP=PLED}}}数码管显示X矩阵键盘按键号*名称:数码管显示X矩阵键盘按键号说明:按下任意键时数码管都会显示其键的序号扫描程序首先判断按键发生在哪一列然后根据所发生的行附加不同的值从而得到按键的序号。*《单片机语言程序设计实训例基于和仿真》案例CPROTEUS上海师范大学信息与机电工程学院倪继锋#include<regh>#defineucharunsignedchar#defineuintunsignedint段码ucharcodeDSYCODE={xc,xf,xa,xb,x,x,x,xf,x,x,x,x,xc,xa,x,xe,x}sbitBEEP=P^上次按键和当前按键的序号该矩阵中序号范围~表示无按键ucharPreKeyNo=,KeyNo=延时voidDelayMS(uintx){uchariwhile(x)for(i=i<i)}矩阵键盘扫描voidKeysScan(){ucharTmpP=xf高位置放入行DelayMS()Tmp=P^xf按键后f变成XXXXX中一个为个仍为通过异或把个变为唯一的变为switch(Tmp)判断按键发生于~列的哪一列{case:KeyNo=breakcase:KeyNo=breakcase:KeyNo=breakcase:KeyNo=breakdefault:KeyNo=无键按下}P=xf低位置放入列DelayMS()Tmp=P>>^xf按键后f变成XXXXX中有个为三个仍为高位转移到低位并异或得到改变的值switch(Tmp)对~行分别附加起始值{case:KeyNo=breakcase:KeyNo=breakcase:KeyNo=breakcase:KeyNo=}}蜂鸣器voidBeep()《单片机语言程序设计实训例基于和仿真》案例CPROTEUS上海师范大学信息与机电工程学院倪继锋{ucharifor(i=i<i){DelayMS()BEEP=~BEEP}BEEP=}主程序voidmain(){P=xBEEP=while(){P=xfif(P!=xf)KeysScan()获取键序号if(PreKeyNo!=KeyNo){P=~DSYCODEKeyNoBeep()PreKeyNo=KeyNo}DelayMS()}}开关控制LED*名称:开关控制LED说明:开关S和S分别控制LED和LED。*#include<regh>sbitS=P^sbitS=P^sbitLED=P^sbitLED=P^主程序voidmain(){while(){LED=S《单片机语言程序设计实训例基于和仿真》案例CPROTEUS上海师范大学信息与机电工程学院倪继锋LED=S}}继电器控制照明设备*名称:继电器控制照明设备说明:按下K灯点亮再次按下时灯熄灭*#include<regh>#defineucharunsignedchar#defineuintunsignedintsbitK=P^sbitRELAY=P^延时voidDelayMS(uintms){uchartwhile(ms)for(t=t<t)}主程序voidmain(){P=xffRELAY=while(){if(K==){while(K==)RELAY=~RELAYDelayMS()}}}数码管显示拨码开关编码*名称:数码管显示拨码开关编码说明:系统显示拨码开关所设置的编码~*#include<regh>#include<intrinsh>#defineucharunsignedchar《单片机语言程序设计实训例基于和仿真》案例CPROTEUS上海师范大学信息与机电工程学院倪继锋#defineuintunsignedint各数字的数码管段码(共阴)ucharcodeDSYCODE={xf,x,xb,xf,x,xd,xd,x,xf,xf}显示缓冲ucharDSYBuffer={,,}延时voidDelayMS(uintms){uchartwhile(ms)for(t=t<t)}主程序voidmain(){uchari,m,NumP=xffP=xffwhile(){m=xfeNum=P读取拨码开关的值DSYBuffer=NumDSYBuffer=NumDSYBuffer=Numfor(i=i<i)刷新显示在数码管上{m=crol(m,)P=mP=DSYCODEDSYBufferiDelayMS()}}}开关控制报警器*名称:开关控制报警器说明:用K开关控制报警器程序控制P输出两种不同频率的声音模拟很逼真的报警效果*#include<regh>#defineucharunsignedchar#defineuintunsignedintsbitSPK=P^sbitK=P^发声函数《单片机语言程序设计实训例基于和仿真》案例CPROTEUS上海师范大学信息与机电工程学院倪继锋voidAlarm(uchart){uchari,jfor(i=i<i){SPK=~SPKfor(j=j<tj)由参数t行成不同的频率}}voidmain(){SPK=while(){if(K==){Alarm()Alarm()}}}按键发音*名称:按键发音说明:按下不同的按键会是SOUNDER发出不同频率的声音。本例使用延时函数实现不同频率的声音输出以后也可使用定时器*#include<regh>#defineucharunsignedchar#defineuintunsignedintsbitBEEP=P^sbitK=P^sbitK=P^sbitK=P^sbitK=P^延时voidDelayMS(uintx){uchartwhile(x)for(t=t<t)}按周期t发音voidPlay(uchart){《单片机语言程序设计实训例基于和仿真》案例CPROTEUS上海师范大学信息与机电工程学院倪继锋ucharifor(i=i<i){BEEP=~BEEPDelayMS(t)}BEEP=}voidmain(){P=xffBEEP=while(){if(K==)Play()if(K==)Play()if(K==)Play()if(K==)Play()}}播放音乐*名称:播放音乐说明:程序运行时播放生日快乐歌未使用定时器中断所有频率完全用延时实现*#include<regh>#defineucharunsignedchar#defineuintunsignedintsbitBEEP=P^生日快乐歌的音符频率表不同频率由不同的延时来决定ucharcodeSONGTONE={,,,,,,,,,,,,,,,,,,,,,,,,,}生日快乐歌节拍表节拍决定每个音符的演奏长短ucharcodeSONGLONG={,,,,,,,,,,,,,,,,,,,,,,,,,}延时voidDelayMS(uintx){uchartwhile(x)for(t=t<t)}播放函数voidPlayMusic(){《单片机语言程序设计实训例基于和仿真》案例CPROTEUS上海师范大学信息与机电工程学院倪继锋uinti=,j,kwhile(SONGLONGi!=||SONGTONEi!=){播放各个音符SONGLONG为拍子长度for(j=j<SONGLONGi*j){BEEP=~BEEPSONGTONE延时表决定了每个音符的频率for(k=k<SONGTONEik)}DelayMS()i}}voidmain(){BEEP=while(){PlayMusic()播放生日快乐DelayMS()播放完后暂停一段时间}}INT中断计数*名称:INT中断计数说明:每次按下计数键时触发INT中断中断程序累加计数计数值显示在只数码管上按下清零键时数码管清零*#include<regh>#defineucharunsigned

用户评论(0)

0/200

精彩专题

上传我的资料

每篇奖励 +1积分

资料评分:

/11
仅支持在线阅读

意见
反馈

立即扫码关注

爱问共享资料微信公众号

返回
顶部

举报
资料