[TOC]
蓝桥杯
1 2 3 4 5
| #include "reg52.h" sfr P4 = 0xc0; sbit P3_6 = P4^2; sbit P3_7 = P4^4;
|
1 2 3 4
| #include “stc15f2k60s2.h” sbit P3_6 = P4^2; sbit P3_7 = P4^4;
|
基础编程——位运算
基本位运算符
取反、按位与、按位或、按位异或
基本位运算
掩码
讲各个位的值初始化为想要的样子,对于74HC138译码器,我们初始化为
通过掩码 0x1f 我们可以让 38 译码器的 ABC 三个引脚初始化为 000 。
设置位
通过或运算符可以设置各个位的值,对于 38
译码器,我们想要使之使能Y4,需要设置 ABC 为 001 ,可以使用
关闭位
关闭 P2 的
LED
题目要求:
在CT107D单片机综合训练平台上实现LED的基本控制:
首先让8路LED指示灯闪烁3遍然后熄灭;
接着依次点亮LED指
示灯;
最后依次熄灭指示灯;
程序循环实现上述功能。
考点:
74HC138、74HC573和74HC02三个数字IC;C51开发方式——IO口扩展
笔记:
C51开发的两种方式:IO口扩展和存储器映射扩展
跳线帽\(J3\):WR引脚,存储器映射扩展;接地,IO扩展
三八译码器:三个输入控制八路互斥的低有效输出——七位高一位低
使用方法:
- ABC三个输入端控制Y0-Y7八个输出端
- 输入端输入的三位二进制数的十进制形式对应Y的编号
- 如\(CBA=(100)_2=(4)_{10} \Rightarrow
Y(4)\)
- 片选已经完成
锁存器:八路三态输出的非反转透明锁存器
使用方法:
- 控制引脚:LE,低电平锁存,高电平导通
- 导通时D和Q的电平一致
- 片选已经完成
使用方法:
使用IO扩展,跳线帽设置为为GND
\((WR->GND)J13\)
\(74HC138(Y4)->(Y4)74HC02(Y4C)->(LE)M74HC573MIR\)
\(\sf{使用}:WR=0;\,Y4=0\,\sf{ 时},\,
Y4C=1\)
左移运算
1 2 3 4 5 6 7
| int P0 = 0; for(int i=1;i<=8;i++) { P0 = (0xff <<i); cout << P0 << " "; }
|
1 2 3 4 5 6 7 8 9 10 11
| void Delay100ms() { unsigned char i, j;
i = 180; j = 73; do { while (--j); } while (--i); }
|
代码:
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
| #include "reg52.h"
sbit HC138_A = P2^5; sbit HC138_B = P2^6; sbit HC138_C = P2^7;
void Delay(unsigned int time) { while(time--); while(time--); }
void LEDrunning() { unsigned char i; HC138_C = 1; HC138_B = 0; HC138_A = 0; for(i=0;i<3;i++) { P0 = 0x00; Delay(60000); Delay(60000); P0 = 0xff; Delay(60000); Delay(60000); } for(i=1;i<=8;i++) { P0 = 0xff<<i; Delay(60000); Delay(60000); } for(i=1;i<=8;i++) { P0 = ~(0xff<<i); Delay(60000); Delay(60000); } } void mian() { while(1) { LEDrunning(); } }
|
蜂鸣器和继电器
题目要求:
在CT107D单片机综合训练平台上实现蜂鸣器与继电器的基本控制:
首先让8路LED指示灯闪烁3遍后熄灭;
接着依次点亮LED指示灯;
继电器吸合一会后断开;
然后依次熄灭LED指示灯;
蜂鸣器鸣叫会后关闭;
程序循环实现上述功能。
考点:
蜂鸣器和继电器的使用;继续使用上面的三个IC;ULN2003达林顿管——一个驱动管
笔记:
针脚选择BTN
代码:
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
| void SelectHC138(unsigned char n) { switch(n) { case 4: HC138_C=1; HC138_B=0; HC138_A=0; break; case 5: HC138_C=1; HC138_B=0; HC138_A=1; break; case 6: HC138_C=1; HC138_B=1; HC138_A=0; break; case 7: HC138_C=1; HC138_B=1; HC138_A=1; break; } }
|
独立按键
题目要求:
考点:
笔记:
根据原理图可知:
\(J5\)接2、3引脚,此时\(P30-P33\)四个单片机IO口分别接\(S7-S4\)四个独立按键再接\(GND\)
代码:
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
| void DelayKey(unsigned char t) { while(t--); } void ScanKeys_Alone() { if(s7 == 0) { DelayKey(100); if(s7 == 0) { L1 = 0; while(s7 == 0); L1 = 1; } } if(s6 == 0) { DelayKey(100); if(s6 == 0) { L2 = 0; while(s6 == 0); L2 = 1; } } if(s5 == 0) { DelayKey(100); if(s5 == 0) { L3 = 0; while(s5 == 0); L3 = 1; } } if(s4 == 0) { DelayKey(100); if(s4 == 0) { L4 = 0; while(s4 == 0); L4 = 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 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 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
| #include "reg52.h"
sbit s7 = P3^0; sbit s6 = P3^1; sbit s5 = P3^2; sbit s4 = P3^3;
sbit L1 = P0^0; sbit L2 = P0^1; sbit L3 = P0^2; sbit L4 = P0^3; sbit L5 = P0^4; sbit L6 = P0^5;
void SelectHC138(unsigned char n) { switch(n) { case 4: HC138_C=1; HC138_B=0; HC138_A=0; break; case 5: HC138_C=1; HC138_B=0; HC138_A=1; break; case 6: HC138_C=1; HC138_B=1; HC138_A=0; break; case 7: HC138_C=1; HC138_B=1; HC138_A=1; break; } }
void DelayKey(unsigned char t) { while(t--); } void ScanKeys_Alone() { if(s7 == 0) { DelayKey(100); if(s7 == 0) { L1 = 0; while(s7 == 0); L1 = 1; } } if(s6 == 0) { DelayKey(100); if(s6 == 0) { L2 = 0; while(s6 == 0); L2 = 1; } } if(s5 == 0) { DelayKey(100); if(s5 == 0) { L3 = 0; while(s5 == 0); L3 = 1; } } if(s4 == 0) { DelayKey(100); if(s4 == 0) { L4 = 0; while(s4 == 0); L4 = 1; } } }
void main() { SelecHC138(4); while(1) { ScanKeys_Alone(); } }
|
数码管
1 2 3
| unsigned char code SegTab[]={0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90}; unsigned char code SegBuf[]={0xff,0xff,0xff,0xff,0xff,0xff};
|
数码管延时
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
| void delay_dtms(uchar t) { int i; for(i=0;i<t;i++){ unsigned char i, j;
i = 10; j = 73; do { while (--j); } while (--i); } void delay_tms(uchar t) { int i; for(i=0;i<t;i++){ unsigned char i, j;
i = 180; j = 73; do { while (--j); } while (--i); }
|
中断
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
| void Init_Timer0() { TMOD = 0x01; TH0 = (65536 - 50000) / 256; TL0 = (65536 - 50000) % 256; ET0 = 1; EA = 1; TR0 = 1; }
unsigned char count = 0; void SeviceTimer0() interrupt 1 { unsigned char i=1; TH0 = (65536 - 50000) / 256; TL0 = (65536 - 50000) % 256; P0=0xff; count++; if(count == 40) { EGplay(i); i++; } }
|
定时器计算
\[
10ms=0.01s\\
\sf{计算机器周期数目:}\\x\frac{12}{11059200}=0.01\\
get\:x=9216=0x2400\\
so\:TH0=0x24,TL0=0x00;
\]
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
| void timer_0_ini() { TMOD = 0x01; TH0 = 0xfc; TL0 = 0x67; TR0=1; TF0=0; } unsigned char timer_0(unsigned int t) { unsigned char timer_0_tag = 0; unsigned int cnt=0; if(TF0==1) { TF0=0; TH0 = 0xfc; TL0 = 0x67; cnt++; if(cnt>=t) { cnt=0; timer_0_tag=1; return timer_0_tag=1; } } else return timer_0_tag;
}
|
通信