看这里 单片及原理图
实验一:I/O口的简单运用
-
题目
LED流水灯B (花样沉积) :由左往右,第一次1个流水灯,走到最右侧停止不动;然后再从最左边一个流水灯,到最右侧倒数第二个灯位停止;依次执行,直到全部灯亮;然后全部灯熄灭,重新执行上述效果;
#include<reg52.h>
sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;
sbit LED=P0^0;
char step=7;
unsigned char last=0x00;
unsigned char temp=0x80;
unsigned char now =0x00;
void delay(unsigned int t){
while(t--);
}
void init(){
P0=0x00;
last=0x00;
step=7;
}
void config(int i)
{
now = temp>>i;
now|=last;
if (i==step){
last|=now;
}
}
void show(){
P0=~now;
delay(30000);
}
void main(){
ENLED=0;
ADDR2=1;
ADDR1=1;
ADDR0=0;
while(1){
int i;
for(i=0;i<=step;i++){
config(i);
show();
}
step--;
if(step<0){
init();
show();
}
}
}
-
演示视频如下:
实验二:定时/计数器与中断的综合使用
-
题目
定时器产生1Hz (1s周期)的方波,驱动LED闪烁;同时按键接外部中断端口,按下后LED闪烁频率变为5Hz; 5秒后,恢复之前的闪烁频率(1Hz) ;
#include <reg52.h>
bit clicked=0;
unsigned int cnt=0;
sbit P0_0 = P0^0;
sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;
void Timer0Init() //50毫秒@11.0592MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x00; //设置定时初始值
TH0 = 0x4C; //设置定时初始值
TF0 = 0; //清除TF0标志
ET0=1;
TR0 = 1; //定时器0开始计时
}
void INT0Init()
{
EX0=1;
IT0=1;
}
void main(){
ENLED=0;
ADDR3=1;
ADDR2=1;
ADDR1=1;
ADDR0=0; //配置LED
P2=0XF7; //将矩阵按键作为独立按键使用
EA=1;
Timer0Init();
INT0Init();
P0_0=0;
while(1);
}
void InterruptINT0() interrupt 0
{
clicked = 1;
}
void InterruptT0() interrupt 1
{
static unsigned int cnt5s=0;
TL0 = 0x00; //设置定时初始值
TH0 = 0x4C; //设置定时初始值
cnt++;
if (!clicked){
if(cnt>10){
P0_0= !P0_0;
cnt=0;
}
}else{
if(cnt>2){
P0_0=!P0_0;
cnt=0;
}
cnt5s++;
if(cnt5s>100){
clicked = 0;
cnt5s=0;
}
}
}
-
演示视频如下: