单片机实验.docx
《单片机实验.docx》由会员分享,可在线阅读,更多相关《单片机实验.docx(3页珍藏版)》请在冰豆网上搜索。
单片机实验
单片机实验
实验一 如图1-1所示,利用AT89C51单片机的P1口外接8个发光二极管,实现流水灯效果。
图1-1实验一仿真电路图 #includeunsignedcharLEDTAB={ 0xFE,0xFD,0xFB,0xF7,,0xEF,0xDF,0xBF,0x7F}; voidDelay(void){ unsignedchari,j,k;for(i=10;i>0;i--) for(j=100;j>0;j--) for(k=200;k>0;k--);} voidmain(void){ unsignedchari;while
(1) { for(i=0;i P1=LEDTAB[i]; Delay(); } }} 实验二 1、如图2-1所示,利用AT89C51单片机的P2端口外接一位共阴LED数码管,实现在 LED数码管上轮流显示0~9。
图2-1数码管显示实验内容1仿真电路图 #include unsignedcharSEGTAB={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};voidDelay(void){unsignedchari,j,k;for(i=10;i>0;i--) for(j=100;j>0;j--) for(k=200;k>0;k--);}voidmain(void){ unsignedchari; while
(1) { for(i=0;i Delay();}} } 2、如图2-2所示,利用AT89C51单片机的P2和P0端口分别驱动2位共阴LED数码管 的笔段和位选段,利用动态显示原理实现LED数码管上显示00~99的自动计数加1数值。
图2-2数码管显示实验内容2仿真电路图 #includeunsignedcharSEGTAB={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};unsignedcharDIGTAB={ 0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};unsignedcharLEDBuffer[2];unsignedcharLEDPointer;voidDelay(void){ unsignedchari,j; for(i=10;i>0;i--) for(j=100;j>0;j--);}voidmain(void){unsignedcharCnt=0;unsignedcharmsCnt=0; while
(1){ P2=SEGTAB[LEDBuffer[LEDPointer]]; P0=DIGTAB[LEDPointer]; if(++LEDPointer==sizeof(LEDBuffer))LEDPointer=0; Delay(); if(++msCnt==200){ msCnt=0; if(++Cnt==100)Cnt=0; LEDBuffer[0]=Cnt_; LEDBuffer[1]=Cnt/10;}}} 实验三 如图3-1所示,利用AT89C51单片机的P3口外接一个4X4矩阵键盘,矩阵键盘的4根行线分别连接在~引脚上,4根列线分别连接在~引脚上。
AT89C51单片机的P2驱动一个8位共阴LED数码管,实现在矩阵键盘的16个按键识别,并将对应的按键编号显示在LED数码管上。
图3-1 矩阵键盘实验内容1仿真原理图 #include unsignedcharSEGTAB={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,}; unsignedcharKEYTAB={ 0xEE,0xED,0xEB,0xE7,0xDE,0xDD,0xDB,0xD7,0xBE,0xBD,0xBB,0xB7,0x7E,0x7D,0x7B,0x77,}; voidDelay10mS(void){ unsignedchari,j;for(i=10;i>0;i--) for(j=100;j>0;j--);} voidmain(void){ unsignedcharKeyValue;unsignedchari,temp;while
(1){ P3=0xF0; if(0xF0!
=(P3&0xF0)) { Delay10mS(); if(0xF0!
=(P3&0xF0)) { temp=P3&0xF0; P3=0x0F; temp|=(P3&0x0F); for(i=0;i 实验四 1、如图4-1所示,利用AT89C51单片机的引脚外接一个轻触按钮“BUTTON”,用 中断方式实现按键计数加1,并通过P2和P0端口驱动的两个共阴LED数码管显示00~99的计数值。
其中P2端口驱动显示数字的十位数,P0端口驱动显示数字的个位数。
图4-1 #include unsignedcharSEGTAB={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,}; unsignedcharKeyCnt=0;voidmain(void){ P2=SEGTAB[KeyCnt/10];P0=SEGTAB[KeyCnt_]; IT0=1;EX0=1;EA=1; while
(1){ ;}} voidINT0_ISR(void)interrupt0{ if(0==P3_2) { 实验内容1仿真电路图 if(++KeyCnt==100)KeyCnt=0; P2=SEGTAB[KeyCnt/10]; P0=SEGTAB[KeyCnt_];}} 2、如图4-2所示,利用AT89C51单片机的P1端口外接8个LED发光二极管,实现流 水灯,流水灯的速度为~1秒之间可调,步进为,外接在和引脚上的两个轻触开关实现调慢和调快功能,速度的档位通过P2端口外接的一个8位共阴LED数码管显示。
#include unsignedcharLEDTAB={ 0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,}; unsignedcharSEGTAB={ 0x3F,0x06,0x5B,0x4F,0x66,0X6D,0x7D,0x07,0x7F,0x6F,}; voidDelay10mS(unsignedchart){ unsignedchari,j; do { for(i=100;i>0;i--) for(j=100;j>0;j--); } while(--t);} unsignedcharSpeed=20;voidmain(void){ unsignedchari; P2=SEGTAB[Speed/20];IT0=1;EX0=1;IT1=1;EX1=1;EA=1; while
(1){ for(i=0;i voidINT0_ISR(void)interrupt0{ if(0==P3_2){ Speed+=20;if(Speed>100)Speed=100;P2=SEGTAB[Speed/20];}} voidINT1_ISR(void)interrupt2{ if(0==P3_3){ Speed-=20;if(Speed 实验五 1、如图5-1所示,利用AT89C51单片机的定时器T0产生1KHz的方波信号引脚 输出,通过连接到“OSCILLOSCOPE”虚拟示波器上查看显示的波形图。
#includevoidmain(void){ TMOD|=0x01; TH0=(65536-500)/256;TL0=(65536-500)%6;TR0=1; while
(1) { if(1==TF0){ TF0=0; TH0=(65536-500)/256; TL0=(65536-500)%6; P3_7=~P3_7;}}} 2、如图5-2所示,利用AT89C51单片机的定时器T0产生1ms的动态数码管显示扫描 时间,驱动接在P2和P0端口上的4位共阴LED数码管,其中P2用于驱动共阴LED数码管的笔段A~H,P0用于驱动共阴LED数码管的位选端;采用定时器T0的溢出中断实现1ms定时。
数码上显示自己的班号和学号的后2位数字,显示方式为“X-YY”,X为班号,YY为学号。
并且显示的“-”闪烁频率为秒。
#include unsignedcharSEGTAB={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,}; unsignedcharDIGTAB={ 0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,}; unsignedcharLEDBuffer[2];unsignedcharLEDPointer;voidDelay(void){ unsignedchari,j; for(i=10;i>0;i--) for(j=100;j>0;j--);} voidINT0_ISR(void)interrupt0{ if(0==P3_2) { P2=SEGTAB[LEDBuffer[LEDPointer]]; P0=DIGTAB[LEDPointer];} } voidmain(void){unsignedcharCnt=99;unsignedcharmsCnt=0;
LEDBuffer[0]=Cnt_;LEDBuffer[1]=Cnt/10;IT0=1; EX0=1; EA=1;while
(1){ P2=SEGTAB[LEDBuffer[LEDPointer]]; P0=DIGTAB[LEDPointer]; if(++LEDPointer==sizeof(LEDBuffer))LEDPointer=0; Delay(); if(++msCnt==200) { msCnt=0; if(--Cnt==(-1))Cnt=99; LEDBuffer[0]=Cnt_; LEDBuffer[1]=Cnt/10; }}}实验六 1、实验内容1 如图6-1,利用AT89C51单片机的和外接一个74HC164驱动1个8位共阴LED数码管,实现0~9的轮流显示, #include unsignedcharSEGTAB={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F, }; voidDelay(void){ unsignedchari,j,k;for(i=10;i>0;i--) for(j=100;j>0;j--) for(k=100;k>0;k--);} voidmain(void){ unsignedchari;SCON=0x00;while
(1) { for(i=0;i 2、实验内容2 如图6-2,在U1和U2的P1端口分别接一个8位共阴LED数码管,引脚上分别接有一个轻触开关。
U1的连接到U2的,U1的连接到U2的,通过串行口进行双机通信,实现在U1上按下按键实现计数加1,通过U2的LED数码管显示,同样U2上按下按键实现计数加1,通过U1的LED数码管显示,双机通信的波特率为9600。
#include unsignedcharSEGTAB={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,}; voidmain(void){ unsignedcharKeyCnt=0; PCON|=0x80;SCON=0x50;TH1=0xFD;TL1=0xFD;TR1=1;ES=1;EA=1; while
(1) { if(0==P3_2) { if(++KeyCnt==10)KeyCnt=0; SBUF=KeyCnt; while(0==TI); TI=0; while(0==P3_2); } }} voidSerial_ISR(void)interrupt4{ unsignedchartemp; if(1==RI) { RI=0; temp=SBUF; P1=SEGTAB[temp]; }}