基础知识:
- TTL电平:高+5V 、低0V
- 计算机串口:高-12V 、低+12V(+3~+15之间)
- 总线:数据总线DB、地址总线AB、控制总线AB
- 51单片机四个8位并行I/O口,即可以作为输入也可以作为输出
- C51的数据类型扩展定义:str:特殊功能寄存器声明 sfr16:sfr的16位数据声明 sbit:特殊功能位的声明 bit:位变量声明
- ‘>>’ 位右移 & 按位与 ^按位异或 ~按位取反
- 基本语句:if while for switch/case do-while
- 最小系统运行起来的必要条件:1.电源 2.晶振 3.复位电路
- LED电流点亮,电流要求是在3-10mA范围内
- 单个电阻计算方法:(5-1.7)/3 大约1K
- 基本时序:机器周期和指令周期(一个机器周期是12个时钟周期,一个时钟周期就是一个振荡周期)
点亮LED
使能P2 IO口使其为低电平
//点亮一个灯 | //点亮第二个灯
#include <reg52.h> | 总线操作 #include <reg52.h>
sbit D1=P1^0; | void main()
void main() | {
{ | P1=0xfd; 11111101 (7-0)
while(1) | }
{ |
D1=0; |
} |
|
} |
Keil软件调试功能:
//一个灯亮灭间隔450ms
#include "reg52.h"
#define u16 unsigned int
#define u8 unsigned char
sbit LED = P2^0;
void delay(u16 i)
{
while(i--);
}
void main()
{
while(1)
{
LED = 0;
delay(50000);
LED = 1;
delay(50000);
}
}
//流水灯
#include"reg52.h"
#include <intrins.h>
typedef unsigned int u16;
typedef unsigned char u8;
#define led P2
void delay(u16 i)
{
while(i--);
}
void main()
{
u8 i;
led=~0x01;
delay(50000);
while(1)
{ //for循环实现流水灯 //调用_crol_、_cror_函数实现流水灯
for(i=0;i<8;i++) //for(i=0;i<7;i++)
{ //{
P2=~(0X01<<i); //led=_cror_(led,1);
delay(50000); //delay(50000);
} //}
}
}
蜂鸣器
三极管放大电流控制蜂鸣器发声( 51单片机 IO 口的驱动能力较弱(即使外接上拉电阻),蜂鸣器驱动需要约 30mA)
R2 和 PNP 三极管 TP1 进行电流放大
#include "reg52.h"
#include <intrins.h>
typedef unsigned int u16;
typedef unsigned char u8;
sbit beep=P1^5;
void delay(u16 i)
{
while(i--);
}
void main()
{
while(1)
{
beep=~beep; //反复翻转以产生脉冲信号从而使无源蜂鸣器发声
delay(100);
}
}
数码管显示
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay(u16 i)
{
while(i--);
}
void DigDisplay()
{
u8 i;
for(i=0;i<8;i++)
{
switch(i)
{
case(0):
LSA=1;LSB=1;LSC=1;break; //C为高位 低电位有效
case(1):
LSA=0;LSB=1;LSC=1;break;
case(2):
LSA=1;LSB=0;LSC=1;break;
case(3):
LSA=0;LSB=0;LSC=1;break;
case(4):
LSA=1;LSB=1;LSC=0;break;
case(5):
LSA=0;LSB=1;LSC=0;break;
case(6):
LSA=1;LSB=0;LSC=0;break;
case(7):
LSA=0;LSB=0;LSC=0;break;
}
P0=smgduan[i];//发送段码
delay(100); //间隔一段时间扫描
P0=0x00;//消隐
}
}
void main()
{
while(1)
{
DigDisplay(); //数码管显示函数
}
}