基于Protues和C的单片机系统开发实验

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1基于Protues和C的单片机系统开发实验实验一按钮控制LED实验原理51单片机的一个I/O口接按钮,再通过另一个I/O口控制LED的亮、灭。主要器件以及电路图单片机——AT89C51,上拉电阻——pullup,按钮button,发光二极管——LED。按钮控制LED汇编程序源码ORG0START:MOVP1,#0;LED不亮2MOVP0,#0FFH;P0口准备读数ST1:JBP0.0,$;等待按钮抬起JNBP0.0,$;等待按钮按下;以上两句使得只有按一下按钮才可能执行下面的语句CPLP1.0;LED状态改变SJMPST1;返回ENDBAT112VC110000uR11kR2100SW1SW-SPDTD1LED-RED+88.8Volts+88.8Volts+88.8Amps+88.8Amps3实验二流水灯——51单片机的Proteus实验实验原理通过个51单片机的一个I/O口送不同的数字,实现8个LED的流水灯。本实验为移动一个不亮的LED。通过修改送给I/O口送的数字可以实现不同方式的流水灯。主要器件以及电路图单片机——AT89C51,8排电阻——RESPACK-8(RX8),发光二极管——LED。流水灯汇编程序源码org0sjmpstartorg30hstart:movP1,#1;P1.0为1,不亮movP1,#2;P1.1为1,不亮movP1,#4;以下原理同上movP1,#8movP1,#10h4movP1,#20hmovP1,#40hmovP1,#80hsjmpstartdelay:nopnopnopnopretend5实验三数码显示管——51单片机的Proteus实验实验原理51单片机的一个I/O口接4个开关,再通过另一个I/O口控制7段数码显示管显示想要的数字。主要器件以及电路图单片机——AT89C51,共地的7段数码显示管——7SEG-COM-AN-GRN,开关——SW-SPST,8排电阻——RESPACK-8(RX8)。汇编程序源码汇编后139字节。org0sjmpSTARTorg30hSTART:movP1,#0FFh;LED不亮st1:movP2,#0FFh;准备读数(开关状态)movA,P2;读数anlA,#0Fh;取低四位acallSEG7;调用显示码子程序movP1,A;将得到的显示码送数显管显示sjmpst1;循环SEG7:incA;该子程序实现将数字转换为显示码movcA,@A+pcretDB0c0h,0F9h,0a4h,0b0h6DB99h,92h,82h,0F8hDB80h,90h,88h,83hDB0c6h,0a1h,86h,8ehendC语言程序源码用C语言写了一下实现同样功能的程序,编译后1.39K,代码如下:#includereg51.hintmain(){P1=0xff;while(1){P2=0xff;ACC=P2;ACC&=0xf;switch(ACC){case0:P1=0xc0;break;case1:P1=0xf9;break;case2:P1=0xa4;break;case3:P1=0xb0;break;case4:P1=0x99;break;case5:P1=0x92;break;case6:P1=0x82;break;case7:P1=0xf8;break;case8:P1=0x80;break;case9:P1=0x90;break;case10:P1=0x88;break;case11:P1=0x83;break;case12:P1=0xc6;break;case13:P1=0xa1;break;case14:P1=0x86;break;case15:P1=0x8e;break;}}while(1);}用数组实现,更大(1.51K),代码如下:7#includereg51.hintmain(){intledNum[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};P1=0xff;while(1){P2=0xff;ACC=P2;ACC&=0xf;P1=ledNum[ACC];}while(1);}8实验四蜂鸣器实验实验原理51单片机的一个I/O口接7个按钮,再通过另一个I/O口控制蜂鸣器发出声音。主要器件以及电路图单片机——AT89C51,蜂鸣器——speaker,按钮button。汇编程序源码晶振12M,已在Proteus下测试,听起来声音差不多。ORG0SJMPSTARTDLY:MOVR2,#20;延时程序D1:MOVR3,#248DJNZR3,$DJNZR2,D1RETORG30H9START:MOVTMOD,#1;定时器0方式1MOVP3,#0FFH;P3准备读数JNBP3.0,DODOACALLDLYJNBP3.1,REREACALLDLYJNBP3.2,MIMIACALLDLYJNBP3.3,FAFAACALLDLYJNBP3.4,SOSOACALLDLYJNBP3.5,LALAACALLDLYJNBP3.6,XIXIACALLDLYJNBP3.7,DO2DO2ACALLDLYSJMPSTARTDODO:LJMPDORERE:LJMPREMIMI:LJMPMIFAFA:LJMPFASOSO:LJMPSOLALA:LJMPLAXIXI:LJMPXIDO2DO2:LJMPDO2DO:MOVTH0,#0FBHMOVTL0,#44HSETBTR0;开启定时器JNBTF0,$;等待定时到CLRTF0;清除中断CPLP2.7;喇叭JNBP3.0,DO10CLRTF0SJMPSTARTRE:MOVTH0,#0FBHMOVTL0,#88HSETBTR0JNBTF0,$CLRTF0CPLP2.7JNBP3.1,RECLRTF0SJMPSTARTMI:MOVTH0,#0FBHMOVTL0,#0CCHSETBTR0JNBTF0,$CLRTF0CPLP2.7JNBP3.2,MICLRTF0SJMPSTARTFA:MOVTH0,#0FCHMOVTL0,#00HSETBTR0JNBTF0,$CLRTF0CPLP2.7JNBP3.3,FACLRTF0LJMPSTARTSO:MOVTH0,#0FCHMOVTL0,#44HSETBTR0JNBTF0,$CLRTF0CPLP2.7JNBP3.4,SOCLRTF0LJMPSTARTLA:MOVTH0,#0FCH11MOVTL0,#88HSETBTR0JNBTF0,$CLRTF0CPLP2.7JNBP3.5,LACLRTF0LJMPSTARTXI:MOVTH0,#0FCHMOVTL0,#0CCHSETBTR0JNBTF0,$CLRTF0CPLP2.7JNBP3.6,XICLRTF0LJMPSTARTDO2:MOVTH0,#0FDHMOVTL0,#00HSETBTR0JNBTF0,$CLRTF0CPLP2.7JNBP3.7,DO2CLRTF0LJMPSTARTEND附上蜂鸣器发声的简单程序1.汇编ORG0START:CPLP2.7;蜂鸣器LCALLDELAYLJMPSTARTDELAY:MOVR7,#0FFHDJNZR7,$RETEND122.C语言#includereg51.hvoiddelay(unsignedintz);//声明延时函数sbitbeep=P2^7;voidmain()数{while(1){beep=0;//蜂鸣器响delay(1);//调用1ms延时beep=1;//蜂鸣器不响delay(1);//调用1ms延时}}voiddelay(unsignedintz)//1ms延时,通过z值改变延时{unsignedintx;for(;z0;z--)for(x=110;x0;x--);}13实验五蜂鸣器演奏祝你平安实验原理51单片机的一个I/O口控制speaker发声,演唱祝你平安歌曲。主要器件以及电路图单片机——AT89C51,蜂鸣器——speaker。汇编程序源码晶振12M,已在Proteus下测试,好像有点失真。程序是从网上照的,感觉不是很对劲,删除了一部分之后还是没有变化。部分注释是我后加上去的。;------------------------------------;蜂鸣器演奏--祝你平安;功能:蜂鸣器-蜂鸣器奏乐-祝你平安;------------------------------------SPKbitP2.7;以后SPK就是speaker了ORG0000HLJMPSTARTORG000BHINC20H;T0中断服务,中断计数器加1MOVTH0,#0D8HMOVTL0,#0EFH;12M晶振,形成10毫秒中断RETISTART:MOVTH0,#0D8HMOVTL0,#0EFH14MOVTMOD,#01HMOVIE,#82H;10000010B——开T0中断MUSIC0:NOPMOVDPTR,#DAT;表头地址送DPTRMOV20H,#00H;中断计数器清0MUSIC1:NOPCLRAMOVCA,@A+DPTR;查表取代码JZEND0;是00H,则结束CJNEA,#0FFH,MUSIC5;只要A不等于FF,一直执行MUSIC5LJMPMUSIC3;当A到FF的时候,执行MUSIC3MUSIC5:NOPMOVR6,A;代码送R6INCDPTRMOVCA,@A+DPTR;取节拍代码送R7MOVR7,ASETBTR0;启动计数MUSIC2:NOPCPLSPKMOVA,R6;按R6(代码)延时MOVR3,A;LCALLDEL;利用代码(R6)来调用延时CJNEA,20H,MUSIC2;中断计数器(20H)=R7否?不等,则继续循环MOV20H,#00H;等于,则取下一代码INCDPTRLJMPMUSIC1MUSIC3:NOPCLRTR0;休止100毫秒MOVR2,#0DHMUSIC4:NOPMOVR3,#0FFHLCALLDELDJNZR2,MUSIC4INCDPTRLJMPMUSIC1END0:NOP15MOVR2,#64H;歌曲结束,延时1秒后继续MUSIC6:MOVR3,#00HLCALLDELDJNZR2,MUSIC6LJMPMUSIC0DEL:;DEL子程序利用R3来延时一定时间NOPDEL3:MOVR4,#02HDEL4:NOPDJNZR4,DEL4NOPDJNZR3,DEL3RETNOPDAT:;祝你平安db26h,20h,20h,20h,20h,20h,26h,10h,20h,10h,20h,80h,26h,20h,30h,20hdb30h,20h,39h,10h,30h,10h,30h,80h,26h,20h,20h,20h,20h,20h,1ch,20hdb20h,80h,2bh,20h,26h,20h,20h,20h,2bh,10h,26h,10h,2bh,80h,26h,20hdb30h,20h,30h,20h,39h,10h,26h,10h,26h,60h,40h,10h,39h,10h,26h,20hdb30h,20h,30h,20h,39h,10h,26h,10h,26h,80h,26h,20h,2bh,10h,2bh,10hdb2bh,20h,30h,10h,39h,10h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,20hdb20h,10h,20h,10h,2bh,10h,26h,30h,30h,80h,18h,20h,18h,20h,26h,20hdb20h,20h,20h,40h,26h,20h,2bh,20h,30h,20h,30h,20h,1ch,20h,20h,20hdb20h,80h,1ch,20h,1ch,20h,1ch,20h,30h,20h,30h,60h,39h,10h,30h,10hdb20h,20h,2bh,10h,26h,10h,2bh,10h,26h,10h,26h,10h,

1 / 23
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功