目录
P3.单片机及开发板介绍
1.单片机英文名为Micro Controller Unit,简称CPU;
2.CPU是芯片,是一种芯片;
3.ROM是read only memory;RAM是random access memory;
两者都是存储器,只是RAM的速度要远远高于ROM的速度,在电脑日常操作中,很多程序都将临时运行的程序命令,存放在内存中,但一旦关机或者停电,内存里原本临时存储的程序信息将全部被清空,也就是内存只能临时存储东西,不能长久保存,而ROM则可以存储,即使掉电后也可以找到之前存储的文件,这也就是硬盘了;
4. 51单片机的由来
5. 命名规则
例如我手上的这块写着:stc 89 c 52 40 I-PDIP 40意为:
电压在3.8到5.5V之间;工作频率可达40MHZ;为工业级PDIP包装;管脚有40只;
6.管脚图
其中Gnd为负极;Vcc为正极;XTAL1,2为晶振接口;RST为复位接口;
如图:
电容用于滤波;
P4.点亮一个小灯泡
1.不要按图索骥,你的单片机可能和老师的不一样;
比如:我的51是STC89C52RC,在STC-ISP中应选择正确的单片机型号;
我的晶振频率为11.0592MHZ;在软件延时计算器中不要选12M;
2.创建project:
选第二个是错的!
建新的文件夹
选择AT
否
创建代码
打函数
3.STC-ISP下载以后要开关单片机一次;
P5.LED闪烁
1.复制代码
2.在函数头处添加:(有nop)
3.注意IO口为大写的P;
4.在主函数中调用辅函数
Int main()
{
P2=0xEF;
Delay500ms();
P2=0xFF;
Delay500ms();
}
P6.LED流水灯
1.第一个头文件的来源
2.在Group1中添加iten时要把代码命名为main;
非则可能会出warning;
大佬解答:
3.上流水代码
void main()
{
while(1){
P2=0xFE;
Delay500ms() ;
P2=0xFD;
Delay500ms() ;
P2=0xFB;
Delay500ms() ;
P2=0xF7;
Delay500ms() ;
P2=0xEF;
Delay500ms() ;
P2=0xDF;
Delay500ms() ;
P2=0xBF;
Delay500ms() ;
P2=0x7F;
Delay500ms() ;
P2=0xFE;
Delay500ms() ;
}
}
P7.独立按键控制LED亮灭
1.按键的原理
按下io口电位为零(无电阻与地线GND相接)
2.单个灯泡的控制:
用“_”
3.用“_”前改:
<REG52.H>为<REGX52.H>;
4.计算原理:
异或的原理是如果相同为0(false),反之;
P8.独立按键控制LED状态
1.主函数头为void!
2.要消除抖动——延时
3.自由定义延时时长(函数中加参数)
4.利用取反,实现开关灯!
if表示按下;
while表示长按;
完成一个过程后灯泡状态取反;
P9.独立按键控制LED显示二进制
1.当延时函数中出现 _nop_() 时;
函数头加上 #include <INTRINS.H> ;
2.有时单片机无法工作,可能要在主函数中加while(1):
void main()
{ while(1){
if(P3_1==0){
Delay(20);
while(P3_1==0);
Delay(20);
P2--;
}
}
}
3.PX的初始值为1111 1111(二进制);
4.全代码如下:
#include <REGX52.H>
#include <INTRINS.H>
void Delay(unsigned int x)
{
unsigned char i, j;
while(x--)
{
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
void main()
{ while(1){
if(P3_1==0){
Delay(20);
while(P3_1==0);
Delay(20);
P2--;
}
}
}
注意unsigned表示无符号;
P10.独立按键控制LED移位
1.要认识移位符号<<和>>;
例如:P2=0x01<<1 意味着P2z从0000 0001变为0000 0010;
2.左移代码:
注意当LEDNum为0时,要赋回最大值 ;
3.右移代码:
同理要赋回最小值;
4.要注意的是,本代码需要给赋初值来让P2_0点亮:
即P2==~(0x01);
P11.静态数码管显示
1.数码管引脚定义
2.四位一体的引脚:
3. 74HC138译码器
作用:
使用三个管脚控制八个LED;
使用方法:
C B A为三位的二进制数,可表示十进制中的0到7;
如果输入111,即使Y7电位为0;
4. 74HC245
作用: 由于单片机高电平驱动能力差,使用其从电源处汲取能量,加强驱动能力,使LED更亮;
5.我的单片机的不同:
a对应P0_0;
b对应1,c对应2.....dp对应P0_7;
我的译码器接口为P2_2,3,4;
6.代码:
#include <REGX52.H>
void nix(int i,int j){
char a[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
P0=a[j];
switch(i){
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
}
void main()
{
nix(7,2);
while(1){
};
}
7.一定要在主函数中加while(1),不然会出现多个显示并且数码管不够亮;
8.数码管显示数数组:
char a[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
P12.动态显示
1.重影产生的原因:调用函数时上一次的段选和下一次的卫选串味了;
2.消隐:
在段选后先延时保证显示,再清零:
4.数码管的驱动:
5.代码如下:
#include <REGX52.H>
#include <INTRINS.H>
void Delay(unsigned char x)
{
unsigned char i, j;
_nop_();
_nop_();
_nop_();
while(x--){
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
}
void nix(int i,int j){
char a[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
switch(i){
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=a[j];
Delay(1);
P0=0x00;
}
void main()
{
while(1){
nix(1,1);
nix(2,2);
nix(3,3);
};
}