《51单片机实验报告.pdf》由会员分享,可在线阅读,更多相关《51单片机实验报告.pdf(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、.51 单片机实验报告.实验一点亮流水灯实验现象Led 灯交替亮,间隔大约10ms。实验代码#include void Delay10ms(unsigned int c);void main()while(1)P0=0 x00;Delay10ms(50);P0=0 xff;Delay10ms(50);.void Delay10ms(unsigned int c)unsigned char a,b;for(;c0;c-)for(b=38;b0;b-)for(a=130;a0;a-);实验原理While(1)表示一直循环。循 环 体 内 首 先 将P0的 所 有 位 都 置 于 零,然 后 延 时
2、 约50*10=500ms,接着 P0 位全置于 1,于是 LED全亮了。接着循环,直至关掉电源。延迟函数是通过多个for 循环实现的。实验 2 流水灯(不运用库函数)实验现象起初 led 只有最右面的那一个不亮,半秒之后从右数第二个led.也不亮了,直到最后一个也熄灭,然后led 除最后一个都亮,接着上述过程#include#include void Delay10ms(unsigned int c);main()unsigned char LED;LED=0 xfe;while(1)P0=LED;Delay10ms(50);LED=LED 0;c-)for(b=38;b0;b-)for(a
3、=130;a0;a-);实验原理这里运用了 C语言中的位运算符,位运算符左移,初始值的二进制为 1111 1110,之后左移一次变成1111 1100,当变成 0000 0000 时通过 if 语句重置 1111 11110.延迟函数在第一个报告已经说出了,不再多说。实验 3 流水灯(库函数版)实验现象最开始还是最右边的一个不亮,然后不亮的灯转移到最右边的第二个,此时第一个恢复亮度,这样依次循环。实验代码#include .#include void Delay10ms(unsigned int c);void main(void)unsigned char LED;LED=0 xFE;whi
4、le(1)P0=LED;Delay10ms(50);LED=_crol_(LED,1);void Delay10ms(unsigned int c)unsigned char a,b;for(;c0;c-)for(b=38;b0;b-)for(a=130;a0;a-);.实验原理利用头文件中的函数,_crol_(,),可以比位操作符更方便的进行2 进制的移位操作,比位操作符优越的是,该函数空位补全时都是用那个移位移除的数据,由此比前一个例子不需要if 语句重置操作。数码管实验实验现象单个数码管按顺序显示0-9 和 A-F。#include void Delay10ms(unsigned int
5、 c);unsigned char code DIG_CODE16=0 x3F,0 x06,0 x5B,0 x4F,0 x66,0 x6D,0 x7D,0 x07,0 x7F,0 x6F,0 x77,0 x7C,0 x39,0 x5E,0 x79,0 x71;void main(void)unsigned char i=0;while(1)P0=DIG_CODEi;.i+;if(i=16)i=0;Delay10ms(50);void Delay10ms(unsigned int c)/?2?0us unsigned char a,b;for(;c0;c-)for(b=38;b0;b-)for(
6、a=130;a0;a-);实验原理根据数码管的点亮原理,依次找到代表0-9,A-F 的位码,用循环和延迟函数就可以达到要求了。.实验 动态数码管#include#define GPIO_DIG P0#define GPIO_PLACE P1 unsigned char code DIG_PLACE8=0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf,0 xbf,0 x7f;unsigned char code DIG_CODE17=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 x77,0 x7c
7、,0 x39,0 x5e,0 x79,0 x71;unsigned char DisplayData8;void DigDisplay();void main(void)unsigned char i;for(i=0;i8;i+)DisplayDatai=DIG_CODEi;while(1)DigDisplay();.void DigDisplay()unsigned char i;unsigned int j;for(i=0;i8;i+)GPIO_PLACE=DIG_PLACEi;GPIO_DIG=DisplayDatai;j=10;while(j-);GPIO_DIG=0 x00;实验原理
8、依然找到相应数字和字母的编码,由于必须通过快速扫描利用视觉暂留来实现数码管的显示,分段码和位码,不断扫描。最后如果更换数字的话,需要消隐操作,防止数码管重复显示所带来的不清楚。实验 外部中断实验现象.每按一下独立按键,就会在数码管显示屏上+1。#include#include sbit LS138A=P22;sbit LS138B=P23;sbit LS138C=P24;unsigned int LedNumVal_1,LedNumVal_2,LedOut8;Unsigned char code Disp_Tab=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7
9、d,0 x07,0 x7f,0 x6f,0 x40;void delay(unsigned int i)char j;for(i;i 0;i-)for(j=200;j 0;j-);void main(void)unsigned char i;P0=0 xff;P1=0 xff;P2=0 xff;IT0=1;EX0=1;.IT1=1;EX1=1;EA=1;while(1)LedOut0=Disp_TabLedNumVal_1%10000/1000;LedOut1=Disp_TabLedNumVal_1%1000/100|0 x80;LedOut2=Disp_TabLedNumVal_1%100/
10、10;LedOut3=Disp_TabLedNumVal_1%10;LedOut4=Disp_TabLedNumVal_2%10000/1000;LedOut5=Disp_TabLedNumVal_2%1000/100;LedOut6=Disp_TabLedNumVal_2%100/10;LedOut7=Disp_TabLedNumVal_2%10;for(i=0;i8;i+)P0=LedOuti;switch(i)case 0:LS138A=0;LS138B=0;LS138C=0;break;case 1:LS138A=1;LS138B=0;LS138C=0;break;case 2:LS1
11、38A=0;LS138B=1;LS138C=0;break;case 3:LS138A=1;LS138B=1;LS138C=0;break;case 4:LS138A=0;LS138B=0;LS138C=1;break;.case 5:LS138A=1;LS138B=0;LS138C=1;break;case 6:LS138A=0;LS138B=1;LS138C=1;break;case 7:LS138A=1;LS138B=1;LS138C=1;break;delay(150);void counter0(void)interrupt 0 using 1 EX0=0;LedNumVal_1+;EX0=1;void counter1(void)interrupt 2 using 2 EX1=0;LedNumVal_2+;EX1=1;实验原理对于数码管的显示采用138 译码器,通过switch 语句与数字一一对应,通过P3.2 P3.3 外部中断接口使数码管成功计数。外部.中断函数为 INT0 与 INT1。