这是一篇 2017–2018 年的嵌入式学习笔记,保留当时的工具、代码和实验过程。 查看系列目录。
外部中断
原图(暂不可用)
中断
下降沿触发
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| #include <reg51.h>
#define uint unsigned int #define uchar unsigned char #define segN 4
uchar code segD[] = { 0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f, 0x00,0xf3}; uchar code segW[] = { 0xf7,0xfb,0xfd,0xfe }; uchar num[segN]; uint a=807;
void delay(uint timer) { uchar j = 124; while(timer--) { while(j--); } } void display(uint k) { uchar i; for(i=0; i<segN; i++) { int result=1; num[segN-i-1]=k/result%10; result*=10; k/=10; P2 = segW[i]; P0 = segD[num[segN-i-1]]; delay(1); } }
void exit_init() { EA=1; IT0=1; IT1=1; EX0=1; EX1=1; }
void main() { exit_init(); while(1) { display(a); } }
void int0_inter() interrupt 0 { a++; }
void int1_inter() interrupt 2 { a=0; }
|
低电平触发
void exit_init()
{
EA=1;
IT0=0;//低电平触发
IT1=1;
EX0=1;
EX1=1;
}
定时器
工作方式0
原图(暂不可用)
工作方式0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| #include <reg51.h>
#define uint unsigned int #define uchar unsigned char sbit led = P2^0; uchar num;
void int0_inter() interrupt 0 { num=0; TL0=0x18; TH0=0X63; TR0=1; }
void int1_inter() interrupt 2 { TR0=0; }
void timer0_inter() interrupt 1 { num++; TL0=0x18; TH0=0x63; }
void exit_init() { IT0=1; IT1=1; EX0=1; EX1=1; TMOD=0; TL0=0x18; TH0=0X63; ET0=1; EA=1; }
void main() { exit_init(); num=0; P2=0xff; while(1) { if(num>=200) { num=0; led=~led; } } }
|
工作方式1
原图(暂不可用)
工作方式1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| #include <reg51.h>
#define uint unsigned int #define uchar unsigned char sbit out_pin = P2^0;
void timer0_inter() interrupt 1 { out_pin = ~ out_pin; TL0=0X78; TH0=0XEC; }
void exit_init() { TMOD=1; TL0=0x78; TH0=0XEC; ET0=1; EA=1; TR0=1; }
void main() { exit_init(); P2=0xff; while(1) { ; } }
|
原图(暂不可用)
示波器
工作方式2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #include <reg51.h>
#define uint unsigned int #define uchar unsigned char sbit out_pin = P2^0;
void timer0_inter() interrupt 1 { out_pin = ~ out_pin; }
void exit_init() { TMOD=2; TL0=0x06; TH0=0X06; ET0=1; EA=1; TR0=1; }
void main() { exit_init(); P2=0xff; while(1) { ; } }
|
原图(暂不可用)
工作方式2
工作方式3
工作方式3(暂不可用)
工作方式3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| #include <reg51.h>
#define uint unsigned int #define uchar unsigned char sbit out_A = P2^0; sbit out_B = P2^1;
void timerTL0_inter() interrupt 1 { out_A = ~ out_A; TL0 =0; }
void timerTH0_inter() interrupt 3 { out_B = ~ out_B; TH0=128; }
void exit_init() { TMOD=3; TL0=0; TH0=128; EA=1; ET0=1; ET1=1; TR0=1; TR1=1; }
void main() { exit_init(); P2=0xff; while(1) { ; } }
|
计数器
计数功能是对外部脉冲进行计数,捕捉输入脉冲的下降沿,从T0(P3.4)和T1(P3.5)两个引脚输入。
原图(暂不可用)
计数器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| #include <reg51.h>
#define uint unsigned int #define uchar unsigned char #define segN 4
uchar code segD[] = { 0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f, 0x00,0xf3};
void delay(uint timer) { uchar j = 124; while(timer--) { while(j--); } } void display(uint k) { uchar a = k%10; uchar b = k/10%10; P2 = 0xfe; P0 = segD[b]; delay(5); P2 = 0xfd; P0 = segD[a]; delay(5); }
void int0_inter() interrupt 0 { TL1 =0; }
void timer_inter() interrupt 3 { TL1=0; }
void exit_init() { IT0=1; EX0=1; TMOD=0x60; TL1=0; TH1=0; EA=1; ET1=1; TR1=1; }
void main() { uchar num; exit_init(); P2=0xff; while(1) { num = TL1; display(num); } }
|