1、单片机程序设计实验报告姓名:学号:专业班级:第二节课:实验一:1357,2468 位置的灯交替闪烁一 实验要求1357,2468 位置的灯交替闪烁。二 硬件连接图与结果三 原理简述程序直接控制 LED 各位置的灯亮灭,时间间隔简单的用了一个延时的语句。四 程序#include main ()int i;P0=0XAA;/1357 四个灯亮for (i=0;i=25000;i+); /延时程序P0=0X55;/2468 四个灯亮for (i=0;i=25000;i+); /延时程序五 所遇问题与解决方式程序比较简单,没有遇到问题。实验二:流水灯一 实验要求流水灯,一个接一个的灯亮,亮到最后一个后
2、,全部的灯亮,然后重头开始。二 硬件连接图与结果三 原理简述程序定义第一个位置的灯亮,通过一个时间间隔,运用一个循环移位程序转移到下一个灯,移位 7 次后全部的灯亮,最后定义整个循环。时间间隔简单的用了一个延时的语句。因为移位时是直接补 0,发送低电平不亮,所以直接移位达到要求。四 程序/流水灯#include main ()int i,j; while(1)P0=0X01;/第 1 个灯亮for (i=0;i=30000;i+);/延时程序for(j=0;j=7;j+)/移位循环程序P0=P01;/移位for (i=0;i=30000;i+);/延时程序P0=0xff;/全亮for (i=0
3、;i=30000;i+);/延时程序五 所遇问题与解决方式程序比较简单,没有遇到问题。实验三:跑马灯一 实验要求一个接一个的灯亮,前面亮过的等依旧亮,直到最后一个灯,最后重新开始, 循环。二 硬件连接图与结果三 原理简述程序定义第一个位置的灯亮,通过一个时间间隔,运用一个循环移位程序转移到下一个灯,移位 7 次后全部的灯亮,最后定义整个循环。时间间隔简单的用了一个延时的语句。因为移位时是直接补 0,为了使之前的灯依旧亮,所以我们用了一个取反, 让新补入的 0 位保持灯亮,达到要求。四 程序#include main ()int i,j,m;while(1)m=0Xfe;P0=m;/第 1 个灯
4、亮for (i=0;i=30000;i+);/延时程序for(j=0;j=7;j+) m=m1;P0=m;/移位循环程序/移位for (i=0;i=30000;i+);/延时程序P0=0xff;/全亮for (i=0;i=30000;i+);/延时程序五 所遇问题与解决方式程序比较简单,没有遇到问题。第三节课:实验四:矩阵按键控制数码管显示数字一 实验要求通过矩阵键盘控制数码管的显示对应数字。二 硬件连接图与结果三 原理简述通过程序定义键位码,对应到显示数码管的位。然后通过扫描程序得出键盘键码,通过程序让数码管显示数字。四 程序#include#define uchar unsigned ch
5、ar #define unit unsigned int void dlms(void);uchar kbscan(void); unsigned char i;unsigned char code out16=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f, 0x6f,0x77,0x7c,0x39, 0x5e,0x79,0x71;unsigned char tab16=0xdb,0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd, 0x7d,0xeb,0xbb,0x7b, 0xe7,0xd7,0xb7,0x77;/主程序void m
6、ain (void)uchar key; while(1) key=kbscan(); dlms(); for(i=0;i0;i-)/扫描程序uchar kbscan(void)uchar sccode,recode; P2=0xf0;四位输入 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);else scc
7、ode=(sccode1)|0x01;return(0);/高四位输入 1,低/有按键时五 所遇问题与解决方式程序比较简单,没有遇到问题。第四节课实验五:数码管显示停电了,做的是数码管的程序,由于下个实验的时候也用了数码管,在数码管的基础上进行的,所以没有补做。第五节课实验六:独立按键控制灯的亮灭一 实验要求通过独立按键来控制 LED 灯的亮灭,用中断程序控制。二 硬件连接图与结果(控制单个灯的图丢了,所以用了后面加深实验的图) 三 原理简述中断程序定义一个等待,通过独立按键发送信号,执行程序,控制灯的亮灭。四 程序/K1 中断程序控制 LED 灯亮灭#include sbit led=P05
8、;int0()interrupt 0led=led;main()led=1; IT0=0;EA=1; EX0=1;while(1);五 所遇问题与解决方式问题:按键会抖动接触不太好,总是不能每次人工按下时只变化一次。解决方式:在程序里加了延时程序,让它在延时时间后再重新执行中断程序, 这样可保证每次按下时不会跳变。实验七:通过数码管显示按键次数一 实验要求利用中断程序,写出按键程序,用数码管显示所按次数。二 硬件连接图与结果三 原理简述中断程序定义一个等待,通过独立按键发送信号,执行数码管的显示程序, 程序计数每按一次加 1,数码管显示。四 程序/数码管计数中断次数#include char
9、i=0;int j;unsignedcharcode tab11=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88;int0()interrupt 2i=i+1; if(i11)P2=tabi; for(j=0;j=30000;j+);elsei=0; P2=0x3F;main()IT1=0; EA=1; EX1=1;while(1);五 所遇问题与解决方式问题:按键会抖动接触不太好,总是不能每次人工按下时只变化一次。解决方式:在程序里加了延时程序,让它在延时时间后再重新执行中断程序, 这样可保证每次按下时不会跳变。第6节课实验八:定
10、时器控制 LED 灯 1S 闪烁一 实验要求利用定时程序计时,控制小灯每隔 1S 闪烁。二 硬件连接图与结果三 原理简述通过定时程序写一个定时时间,每到一次计时直接控制 LED 灯亮灭。四 程序/定时器控制 LED 灯 1S 闪烁#include#define uchar unsigned char uchar num = 0;sbit led = P10; 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)
11、num = 0; led = led;void T0_time()interrupt 1TH0 = (65536-50000)/256; TL0 = (65536-50000)%256;num+;五 所遇问题与解决方式验证程序,问题不多。实验九:定时器控制两个灯以不同周期闪烁一 实验要求用定时器 1 工作方式 1 控制两个 LED 以不同周期。说明:设计一个 LED 以 200ms 为周期闪烁,另一个为 800ms 闪烁,设计定时器 1 每 50ms 产生一次中断,由两个变量分别对中断次数计数,其中一个变量计数两次,即 100ms,控制 LED 亮灭,另一个变量计数 8 次即 400ms,控制
12、 LED 亮灭。二 硬件连接图与结果三 原理简述通过定时程序写一个 50ms 的定时,一个灯运行计时 2 遍变化一次,另一个灯在上一个灯的计时基础上计数 4 次再变化,从而控制 LED 灯亮灭。四 程序/用定时器 1 工作方式 1 控制两个 LED 以不同周期/说明:设计一个 LED 以 200ms 为周期闪烁,另一个为 800ms 闪烁/设计定时器 1 每 50ms 产生一次中断,由两个变量分别对中断次数计数,/其中一个变量计数两次,即 100ms,控制 LED 亮灭/另一个变量计数 8 次即 400ms,控制 LED 亮灭#include#define uchar unsigned cha
13、ruchar num= 0;/4uchar n =0;/16sbit led1= P10;sbit led2= P12;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 1TH0 = (65536-50000)/256; TL0 = (65536-
14、50000)%256;num+;巴 定时器c01 / I 用 定时器1 工作万式1 控制两个 LED 以 不 同 周期02 I I 说明: 设计一个LED 以 2 00w已 为周 期闪烁,另 一个为8 00w 已闪 烁03 I I 设计定时器 1 每5 0 ttls 产生次宁断, 由 两个 变虽分别对中断次数计数,04 I I 其中 一个变呈计数两次 , 即 l OOws , 控制 LED 亮 灭05 I I 另个变虽计数8 次即4 00w己, 控 制 LED 完 灭06 立沁 l u d巴 扛 已g5 1 . h07 /Id 芒 f i n 巴 uc har uns i g n 芒 ct c
15、har 08uchar n 屯 n = O ;I I 斗09u 巳 h ar n = O ;111610 shit ledl = P l O ;11 shit l芒d 2 = P1 2 ; 1213void ma i n ( )1415TMOD = OxOl ;16THO = ( 655 3 6- 5 0000 ) / 25 6 ;17TLO = ( 655 3 6- 5 0000 ) 各 25 6 ;18 EA = l ;19 ETO = l ;20 TR0 - 1 ;I I 计时开始21 ledl = 1 ;22l 芒 d 2 - 1 ;23 while I 1 ) 2425i :f ( n 画 2 )2627 num = O ;28 l 己 d l = l e d l ;29n +;30I.;干 , - |fl I五 所遇问题与解决方式问题:第一次执行的时候闪烁频率太高。解决方式:重新检查了工作方式并定义。