单片机程序设计实验报告姓名:学号:专业班级:第二节课:实验一:1357,2468位置的灯交替闪烁一实验要求1357,2468位置的灯交替闪烁。
二硬件连接图与结果三原理简述程序直接控制LED各位置的灯亮灭,时间间隔简单的用了一个延时的语句。
四程序#include<reg51.h>main (){int i;P0=0XAA; //1357四个灯亮for (i=0;i<=25000;i++); //延时程序P0=0X55; //2468四个灯亮for (i=0;i<=25000;i++); //延时程序}五所遇问题与解决方式程序比较简单,没有遇到问题。
实验二:流水灯一实验要求流水灯,一个接一个的灯亮,亮到最后一个后,全部的灯亮,然后重头开始。
二硬件连接图与结果三原理简述程序定义第一个位置的灯亮,通过一个时间间隔,运用一个循环移位程序转移到下一个灯,移位7次后全部的灯亮,最后定义整个循环。
时间间隔简单的用了一个延时的语句。
因为移位时是直接补0,发送低电平不亮,所以直接移位达到要求。
四程序//流水灯#include<reg51.h>main (){int i,j;while(1){P0=0X01; //第1个灯亮for (i=0;i<=30000;i++); //延时程序for(j=0;j<=7;j++) //移位循环程序{P0=P0<<1; //移位for (i=0;i<=30000;i++); //延时程序}P0=0xff; //全亮for (i=0;i<=30000;i++); //延时程序}}五所遇问题与解决方式程序比较简单,没有遇到问题。
实验三:跑马灯一实验要求一个接一个的灯亮,前面亮过的等依旧亮,直到最后一个灯,最后重新开始,循环。
二硬件连接图与结果三原理简述程序定义第一个位置的灯亮,通过一个时间间隔,运用一个循环移位程序转移到下一个灯,移位7次后全部的灯亮,最后定义整个循环。
时间间隔简单的用了一个延时的语句。
因为移位时是直接补0,为了使之前的灯依旧亮,所以我们用了一个取反,让新补入的0位保持灯亮,达到要求。
四程序#include<reg51.h>main (){int i,j,m;while(1){m=0Xfe;P0=~m; //第1个灯亮for (i=0;i<=30000;i++); //延时程序for(j=0;j<=7;j++) //移位循环程序 {m=m<<1; //移位P0=~m;for (i=0;i<=30000;i++); //延时程序}P0=0xff; //全亮for (i=0;i<=30000;i++); //延时程序}}五所遇问题与解决方式程序比较简单,没有遇到问题。
第三节课:实验四:矩阵按键控制数码管显示数字一实验要求通过矩阵键盘控制数码管的显示对应数字。
二硬件连接图与结果三原理简述通过程序定义键位码,对应到显示数码管的位。
然后通过扫描程序得出键盘键码,通过程序让数码管显示数字。
四程序#include<reg51.h>#define uchar unsigned char#define unit unsigned intvoid dlms(void);uchar kbscan(void);unsigned char i;unsigned char code out[16]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};unsigned char tab[16]={0xdb,0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};//主程序void main (void){uchar key;while(1){ key=kbscan();dlms();for(i=0;i<16;i++){if(key==tab[i]){P0=out[i];}}}}//延时程序void dlms (void){uchar i;for (i=200;i>0;i--){}}//扫描程序uchar kbscan(void){uchar sccode,recode;P2=0xf0; //高四位输入1,低四位输入0if ((P2&0xf0)!=0xf0) //有按键时{dlms();if((P2&0xf0)!=0xf0){sccode=0xfe;while ((sccode&0x10)!=0){ P2=sccode;if((P2&0xf0)!=0xf0){ recode=P2&0xf0;sccode=sccode&0x0f;return(sccode+recode);}elsesccode=(sccode<<1)|0x01;}}}return(0);}五所遇问题与解决方式程序比较简单,没有遇到问题。
第四节课实验五:数码管显示停电了,做的是数码管的程序,由于下个实验的时候也用了数码管,在数码管的基础上进行的,所以没有补做。
第五节课实验六:独立按键控制灯的亮灭一实验要求通过独立按键来控制LED灯的亮灭,用中断程序控制。
二硬件连接图与结果(控制单个灯的图丢了,所以用了后面加深实验的图)三原理简述中断程序定义一个等待,通过独立按键发送信号,执行程序,控制灯的亮灭。
四程序//K1中断程序控制LED灯亮灭#include <reg51.h>sbit led=P0^5;int0()interrupt 0{led=~led;}main(){led=1;IT0=0;EA=1;EX0=1;while(1);}五所遇问题与解决方式问题:按键会抖动接触不太好,总是不能每次人工按下时只变化一次。
解决方式:在程序里加了延时程序,让它在延时时间后再重新执行中断程序,这样可保证每次按下时不会跳变。
实验七:通过数码管显示按键次数一实验要求利用中断程序,写出按键程序,用数码管显示所按次数。
二硬件连接图与结果三原理简述中断程序定义一个等待,通过独立按键发送信号,执行数码管的显示程序,程序计数每按一次加1,数码管显示。
四程序//数码管计数中断次数#include <reg51.h>char i=0;int j;unsigned char code tab[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88};int0()interrupt 2{i=i+1;if(i<11){P2=tab[i];for(j=0;j<=30000;j++);}else{i=0;P2=0x3F;}}main(){IT1=0;EA=1;EX1=1;while(1);}五所遇问题与解决方式问题:按键会抖动接触不太好,总是不能每次人工按下时只变化一次。
解决方式:在程序里加了延时程序,让它在延时时间后再重新执行中断程序,这样可保证每次按下时不会跳变。
第6节课实验八:定时器控制LED灯1S闪烁一实验要求利用定时程序计时,控制小灯每隔1S闪烁。
二硬件连接图与结果三原理简述通过定时程序写一个定时时间,每到一次计时直接控制LED灯亮灭。
四程序//定时器控制LED灯1S闪烁#include<reg51.h>#define uchar unsigned charuchar num = 0;sbit led = P1^0;void main(){TMOD = 0x01;TH0 = (65536-50000)/256;TL0 = (65536-50000)%256;EA=1;ET0=1;TR0=1;led = 1;while(1){if(num == 20){num = 0;led = ~led;}}}void T0_time()interrupt 1{TH0 = (65536-50000)/256;TL0 = (65536-50000)%256;num++;}五所遇问题与解决方式验证程序,问题不多。
实验九:定时器控制两个灯以不同周期闪烁一实验要求用定时器1工作方式1控制两个LED以不同周期。
说明:设计一个LED以200ms为周期闪烁,另一个为800ms闪烁,设计定时器1每50ms产生一次中断,由两个变量分别对中断次数计数,其中一个变量计数两次,即100ms,控制LED亮灭,另一个变量计数8次即400ms,控制LED亮灭。
二硬件连接图与结果三原理简述通过定时程序写一个50ms的定时,一个灯运行计时2遍变化一次,另一个灯在上一个灯的计时基础上计数4次再变化,从而控制LED灯亮灭。
四程序//用定时器1工作方式1控制两个LED以不同周期//说明:设计一个LED以200ms为周期闪烁,另一个为800ms闪烁//设计定时器1每50ms产生一次中断,由两个变量分别对中断次数计数,//其中一个变量计数两次,即100ms,控制LED亮灭//另一个变量计数8次即400ms,控制LED亮灭#include<reg51.h>#define uchar unsigned charuchar num = 0; //4uchar n = 0; //16sbit led1 = P1^0;sbit led2 = P1^2;void main(){TMOD = 0x01;TH0 = (65536-50000)/256;TL0 = (65536-50000)%256;EA=1;ET0=1;TR0=1; //计时开始led1 = 1;led2 = 1;while(1){if(num==2){num = 0;led1 = ~led1;n++;}if(n==4){led2=~led2;n=0;}}}void T0_time()interrupt 1 {TH0 = (65536-50000)/256;TL0 = (65536-50000)%256;num++;}五所遇问题与解决方式问题:第一次执行的时候闪烁频率太高。
解决方式:重新检查了工作方式并定义。