1、实验内容一
1.1、问题一:
用单位杜邦线将某一位I/O口与发光二极管相连,利用定时/计数器使发光二极管闪烁(定
时时间到,I/O口输出取反,定时时间取1s)。用中断方式和查询方式分别实现之。
1.2、问题一的代码:
1.2.1中断方式代码:
#include <reg51.h>#include <absacc.h>int flag = 0;sbit P1_2 = P1^2;void main(){ TMOD = 0x10; TH1 = -50000 / 256; TL1 = -50000 % 256; P1_2 = 0; EA = 1; ET1 = 1; TR1 = 1; for (;;) ;}void int1() interrupt 3{ TH1 = -50000 / 256; TL1 = -50000 % 256; flag++; if (flag == 20) { P1_2 = !P1_2; flag = 0; }}
1.2.2 查询方式代码
#include <reg51.h>#include <absacc.h>int flag = 0;sbit P1_2 = P1^2;void time_over();void main(){ TMOD = 0x10; TH1 = -50000 / 256; TL1 = -50000 % 256; P1_2 = 0; EA = 1; ET1 = 1; TR1 = 1; for (;;) { if (TF1 == 1) { time_over(); } }}void time_over(){ TH1 = -50000 / 256; TL1 = -50000 % 256; TF1 = 0; flag++; if(flag == 20) { P1_2 = !P1_2; flag = 0; }}
1.3、问题一的结果和现象:
发光二极管每隔1秒进行闪烁一次,即亮灭的周期为2秒。
2、实验内容二
2.1、问题二:
利用定时计数器1的计数功能实现每五次按下独立按键(按下独立按键触发计数脉冲),发光二极管LED1亮灭取反。
2.2、问题二的代码:
#include <reg51.h>#include <absacc.h>sbit P1_2 = P1^2;void main(){ TMOD = 0x60; TH1 = 251; TL1 = 251; P1_2 = 0; EA = 1; ET1 = 1; TR1 = 1; for (;;) ;}void int1() interrupt 3{ P1_2 = !P1_2;}
2.3、问题二的实验结果和现象:
理论上每按下五次独立按键,发光二极管LED1亮灭取反。但由于实际操作中有按键时产生的抖动,所以会产生按键不足五次时也会产生亮灭取反。
3、实验内容三
3.1、问题三:
使用定时器和数码管模拟倒计时红绿灯原理 。P1口连接至LED用于显示红黄绿灯,P0口用于连接2位数码管显示倒计时时间。(红灯倒计时30S,黄灯倒计时3S,绿灯倒计时27S,实现如下循环交替。
3.2、问题三的代码:
#include <reg51.h>#include <absacc.h>int Tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};int flag = 0;int second = 29;sbit P2_2 = P2^2;sbit P2_3 = P2^3;int shiwei;int gewei;int red = 1;int yellow = 0;int green = 0;void timer();void delay();void main(){ TMOD = 0x10; TH1 = -50000 / 256; TL1 = -50000 % 256; EA = 1; ET1 = 1; TR1 = 1; P0 = 0x3f; while (1) { shiwei = Tab[second/10]; gewei = Tab[second%10]; P1 = 0xbf; P2_2 = 1; P2_2 = 0; P1 = shiwei; P2_3 = 1; P2_3 = 0; delay(); P1 = 0x7f; P2_2 = 1; P2_2 = 0; P1 = gewei; P2_3 = 1; P2_3 = 0; delay(); }}void int1() interrupt 3{ TH1 = -50000 / 256; TL1 = -50000 % 256; flag++; if (flag == 20) { flag = 0; second--; if (second == -1) { if (red) { P0 = 0xf3; second = 26; red = 0; green = 1; } else if (green) { P0 = 0xcf; second = 2; green = 0; yellow = 1; } else { P0 = 0x3f; second = 29; yellow = 0; red = 1; } } }}void delay() { int y; for(y=300;y>0;y--);}
3.3、问题三的实验结果和现象:
在数码管上先显示“29”,此时对应的二极管为红灯亮。当数码管显示到“00”时,隔1秒后数码管的数字转换为“26”,此时对应的二极管为绿灯亮。当绿灯时间到后,隔1秒后数码管显示“00”,然后数码管显示“02”。然后循环点亮下去,对应数码管的时间依次对应。