1、单片机实验指导书专科黄大君单片机原理(专科)实验指导书系别 班级 姓名 学号 计算机科学与技术系2012年8月实验一:流水灯实验一、 实验目的:通过对P3口地址的操作控制8位LED流水点亮,从而认识单片机的存储器。实验原理图实验参考电路图如下:二、 参考实验程序/流水灯实验#include /包含单片机寄存器的头文件sfr x=0xb0; /P3口在存储器中的地址是b0H, 通过sfr可定义8051内核单片机 /的所有内部8位特殊功能寄存器,对地址x的操作也就是对P1口的操作/*函数功能:延时一段时间*/void delay(void) unsigned char i,j; for(i=0;i
2、250;i+) for(j=0;j250;j+) ; /利用循环等待若干机器周期,从而延时一段时间 /*函数功能:主函数 */void main(void) while(1) x=0xfe; /第一个灯亮 delay(); /调用延时函数 x=0xfd; /第二个灯亮 delay(); /调用延时函数 x=0xfb; /第三个灯亮 delay(); /调用延时函数 x=0xf7; /第四个灯亮 delay(); /调用延时函数 x=0xef; /第五个灯亮 delay(); /调用延时函数 x=0xdf; /第六个灯亮 delay(); /调用延时函数 x=0xbf; /第七个灯亮 delay
3、(); /调用延时函数 x=0x7f; /第八个灯亮 delay(); /调用延时函数 三、 实验思考题:修改程序使LED灯为18灯亮27灯亮36灯亮45灯亮,再将LED灯亮的顺序倒过来既:45灯亮36灯亮27灯亮18灯亮,连续运行。实验二:数码显示实验(LED)一、实验目的:掌握共阳极、共阴极7段LED数码管的显示方法。二、实验原理图实验参考电路图如下:步骤三、参考实验程序/数码秒表设计#include unsigned char code tab10=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; void delay(void) un
4、signed char i,j; for(i=0;i250;i+) for(j=0;j250;j+) ;void main(void) unsigned char i=0; P2=0x00; while(1) P2=tabi; i=(i+1)%10; delay(); 实验三:播放声音实验一、实验目的:学习如何让单片机播放简单的音乐。二、实验原理图实验参考电路图如下:三、参考实验程序/*/ /*我这有一个程序,你参考一下 */ /* function:唱生日快乐 */ / */ /*/ #include #include #include #define uint unsigned int #
5、define uchar unsigned char #define led RD #define key_rec T1 sbit BUZZER=P37;/发声音口 uchar code T0_H16=0xFF,0xFB,0xFB,0xFC,0xFC,0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE; uchar code T0_L16=0xF1,0x4,0x90,0xC,0x44,0xAC,0x9,0x34,0x82,0xC8,0x06,0x22,0x56,0x85,0x9A,0xC1; uchar code music32=8,0
6、,8,9,8,0xB,0xA,0,8,0,8,9,8,0xC,0xB,0,8,0,8,0xF,0xD,0xB,0xA,9,0xE,0,0xE,0xD,0xB,0xC,0xB,0x0; uchar code music_L32=2,1,1,4,4,4,4,4,2,1,1,4,4,4,4,4,2,1,1,4,4,4,4,4,2,1,1,4,4,4,4,4; uchar a,b; uint second,minute; long t0count; void delay_music(uint v) while(v!=0) v-; void delay_music1(uint j) while(j!=0
7、)j-;delay_music(200); void delay_music2(uint j) while(j!=0)j-;delay_music1(80); main() /uint i; uchar k,n,m; delay_music(100); TMOD=0x11; TH0=0xfc; TL0=0x66; t0count=0; EA=1; ET0=0; TR0=0; ET1=0; TR1=0; while(1) ET1=1; TR1=1; for(k=0;k32;k+) n=musick; m=music_Lk; a=T0_Hn; b=T0_Ln; delay_music2(m); t
8、ime0() interrupt 1 using 1 TH0=0xFC; TL0=0x66; t0count=t0count+1; if (t0count=1000) second+; if (second=60) minute+; if (minute=60) minute=0; second=0; t0count=0; time1 () interrupt 3 using 3 TH1=a; TL1=b; BUZZER=!BUZZER; 实验四:键盘扫描一、 实验目的、要求设计一个4X4的矩阵键盘,键盘的号码015,要求编写出一个键盘输入扫描程序,要求单片机能根据键盘排列顺序,能将按下去键盘
9、号正确识别出来,并采用两个数码管分别键盘号码的个位和十位。二、 实验原理三、源程序清单或实验步骤1.设计电路,并按照电路接线2.编写调试程序:#include /包含51单片机寄存器定义的头文件sbit P14=P14; sbit P15=P15; sbit P16=P16; sbit P17=P17; unsigned char code Tab =0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; /数字09的段码unsigned char keyval; /*函数功能:数码管动态扫描延时*/void led_delay(void) uns
10、igned char j; for(j=0;j200;j+) ; /*函数功能:按键值的数码管显示子程序*/ void display(unsigned char k) P2=0xbf; P0=Tabk/10; led_delay(); P2=0x7f; P0=Tabk%10; led_delay(); /*函数功能:软件延时子程序*/ void delay20ms(void) unsigned char i,j; for(i=0;i100;i+) for(j=0;j60;j+) ; /*函数功能:主函数*/ void main(void) EA=1; ET0=1; TMOD=0x01; TH
11、0=(65536-500)/256; TL0=(65536-500)%256; TR0=1; keyval=0x00; while(1) display(keyval); /*函数功能:定时器0的中断服务子程序,进行键盘扫描,判断键位*/ void time0_interserve(void) interrupt 1 using 1 TR0=0; P1=0xf0; if(P1&0xf0)!=0xf0) delay20ms(); if(P1&0xf0)!=0xf0) P1=0xfe; if(P14=0) keyval=1; if(P15=0) keyval=2; if(P16=0) keyval
12、=3; if(P17=0) keyval=4; P1=0xfd; if(P14=0) keyval=5; if(P15=0) keyval=6; if(P16=0) keyval=7; if(P17=0) keyval=8; P1=0xfb; if(P14=0) keyval=9; if(P15=0) keyval=10; if(P16=0) keyval=11; if(P17=0) keyval=12; P1=0xf7; if(P14=0) keyval=13; if(P15=0) keyval=14; if(P16=0) keyval=15; if(P17=0) keyval=16; TR
13、0=1; TH0=(65536-500)/256; TL0=(65536-500)%256; 四、实验结果经过调试:矩阵键盘上的输入按键的键号能够正常显示在LED数码管上。实验五:定时器中断实验一、 实验目的、要求目的:通过对P3.2、P3.3引脚的电平控制,实现外部中断处理,从而控制输出口P1的输出效果变化。要求:自行设计一个外部中断实验,要求:两个外部中断全部用上;实验能体现不同中断优先级的中断源的相应情况;不同中断处理程序能输出不同的响应效果二、 实验原理三、源程序清单或实验步骤1.设计电路,并按照电路接线2.编写调试程序:#include /包含51单片机寄存器定义的头文件sbit S
14、=P32; /将S位定义为P3.2,/*函数功能:主函数*/ void main(void) EA=1; /开放总中断 EX0=1; /允许使用外中断 IT0=1; /选择负跳变来触发外中断 P1=0xff; while(1) ; /无限循环, 防止程序跑飞 /*函数功能:外中断T0的中断服务程序*/void int0(void) interrupt 0 using 0 /外中断0的中断编号为0 P1=P1; /每产生一次中断请求,P1取反一次。 /*函数功能:延时一段时间*/void delay(void) unsigned char i,j; for(i=0;i250;i+) for(j=
15、0;j250;j+) ; /利用循环等待若干机器周期,从而延时一段时间 四、实验结果、实验过程原始记录(数据、图表、计算等)经过调试:在外部中断输入信号的控制下,P1口的灯能够按照要求闪烁修改程序和电路后,能够反映出两个外部中断之间的优先级和中断屏蔽等功能,并能按照中断处理程序的要求完成显示。1.通过改变外部中断源输入信号能够控制P0P3口。2.89C51的两个外部中断源能够按照控制字的要求实现屏蔽和优先级显示。实验六:串行口实验一、 实验目的、要求通过实验掌握89C51的工作原理,学会串行通信程序的编写要求:完成单片机U1通过其串行口TXD向计算机发送一个字节数据“,将单片机的输出信号转化成
16、计算机能够识别的信号。二、 实验原理图(1)单片机发送和接受数据实验参考电路图三、源程序清单或实验步骤1.设计电路,并按照电路接线2.编写调试程序:数据发送程序:#include /包含单片机寄存器的头文件unsigned char code Tab =0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F;/流水灯控制码,该数组被定义为全局变量/*函数功能:向PC发送一个字节数据*/void Send(unsigned char dat) SBUF=dat; while(TI=0); TI=0;void init()TMOD=0x20; /TMOD=0010 0000
17、B,定时器T1工作于方式2 SCON=0x40; /SCON=0100 0000B,串口工作方式1 PCON=0x00; /PCON=0000 0000B,波特率9600 TH1=0xfd; /根据规定给定时器T1赋初值 TL1=0xfd; /根据规定给定时器T1赋初值 TR1=1;/*函数功能:延时约150ms*/ void delay(unsigned char z) unsigned char m,n; for(m=0;mz;m+) for(n=0;n250;n+) ; /*函数功能:主函数*/void main(void) unsigned char i; init(); while(
18、1) for(i=0;i8;i+) /模拟检测数据 Send(Tabi); /发送数据i delay(200); /50ms发送一次检测数据 数据接收程序:#include /包含单片机寄存器的头文件/*函数功能:接收一个字节数据*/ unsigned char Receive(void) unsigned char dat; while(RI=0) /只要接收中断标志位RI没有被置“1” ; /等待,直至接收完毕(RI=1) RI=0; /为了接收下一帧数据,需将RI清0 dat=SBUF; /将接收缓冲器中的数据存于dat return dat;/*函数功能:主函数*/void main(
19、void) TMOD=0x20; /定时器T1工作于方式2 SCON=0x50; /SCON=0101 0000B,串口工作方式1,允许接收(REN=1) PCON=0x00; /PCON=0000 0000B,波特率9600 TH1=0xfd; /根据规定给定时器T1赋初值 TL1=0xfd; /根据规定给定时器T1赋初值 TR1=1; /启动定时器T1 REN=1; /允许接收 while(1) P1=Receive(); /将接收到的数据送P1口显示 四、实验结果、实验过程原始记录(数据、图表、计算等)经过调试:通过发送的单片机送出的字符能按要求正常在接收的机器上显示。实验七:数码秒表实
20、验一、 实验目的、要求通过实验掌握89C51的工作原理,学会LED动态扫描程序的编写要求:用单片机控制一个秒表的显示二、 实验原理三、源程序清单或实验步骤1.设计电路,并按照电路接线2.编写调试程序:#include / 包含51单片机寄存器定义的头文件 /将D1位定义为P2.0引脚unsigned char second,Countor;sbit gewei=P20;sbit shiwei=P21; /设置全局变量,储存定时器T0中断次数/*函数功能:主函数*/unsigned char Tab =0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x
21、6f,0x00;/共阴极段码void delay(void) unsigned char i; for(i=0;i200;i+) ;void main(void) second=0; EA=1; /开总中断 ET0=1; /定时器T0中断允许 TMOD=0x01; /使用定时器T0的模式1 TH0=(65536-46083)/256; /定时器T0的高8位赋初值 TL0=(65536-46083)%256; /定时器T0的高8位赋初值 TR0=1; /启动定时器T0 Countor=0; /从0开始累计中断次数 while(1)/无限循环等待中断 shiwei=1; gewei=0; P0=Tabsecond/10; delay(); gewei=1 ; shiwei=0; P0=Tabsecond%10; delay(); /*函数功能:定时器T0的中断服务程序*/void Time0(void) interrupt 1 using 0 /interrupt声明函数为中断服务函数 /其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1