单片机如何学
1、熟悉编程环境
2、学会看原理图
3、从照搬到独自写
单片机开发版一览
单片机芯片命名
芯片引脚一览
1、C51与C及C++的区别
C++:面向对象
C:面向过程
C51:是为51系列单片机设计的一种C语言
特点:
•结构化语言,代码紧凑——效率可与汇编语言媲美
•接近真实语言,程序可读性强——易于调试、维护
•库函数丰富,编程工作量小——产品开发周期短
•机器级控制能力,功能很强——适合于嵌入式系统开发
•与汇编指令无关,易于掌握——在单片机基础上上手快
2、单片机特有的三种存储格式
bit型
用于定义一个位变量,语法规则:
bit bit_name [= 0或1];
sfr型(sfr16型)
用于定义SFR字节地址变量
sfr sfr_name = 字节地址常数;
sfr P0=0x80; //定义P0口地址80H
sfr bit型(sbit型)
用于定义SFR位地址变量
位地址表达形式:
绝对位地址:
相对位地址:
4个端口
51单片机有32只I/O引脚,分属于4个端口(P0~P3)。
•可作为并行I/O输入通道也可作为并行I/O输出通道
•可作为串行通信通道
•可作为外部设备的连接通道
P0口
1、P0口具有通用I/O口方式,可实现输出、读引脚(输入)和读锁存器三种功能;
2、P0口为准双向通用口,作为通用输入口时应先使P0.n→1,作为通用输出口时应先使第二输出端→1 ;
3、作为通用I/O口方式时,需要外接上拉电阻;
4、P0口具有地址/数据分时复用方式,可实现地址/数据输出、数据输入两种功能;
5、地址/数据分时复用方式时无需外接上拉电阻;
6、分时复用方式的数据输入时无需程序写1操作。
P1口
1、 P1口具有通用I/O口方式,可实现输出、读引脚(输入)和读锁存器三种功能;
2、 P1口为准双向通用口,作为通用输入口时应先使P1.n→1,作为通用输出口时是无条件的。
P2口
1、P2口具有通用I/O口方式,可实现输出、读引脚(输入)和读锁存器三种功能;
2、P2口为准双向通用口,作为通用输入口时应先使P2.n→1,作为通用输出口时应先使控制端→1 ;
3、作为通用I/O口方式时,无需外接上拉电阻;
4、P2口具有地址输出方式,可实现地址输出功能。
P3口
1、 P3口具有通用I/O口方式,可实现输出、读引脚(输入)和读锁存器三种功能;
2、 P3口为准双向通用口,作为通用输入口时应先使P3.n→1,作为通用输出口时应先使第二输出端→1 ;
3、 P3口具有第二功能方式,可实现第二输出和第二输入两种功能。
开始编程
引用林学长的一句名言:有手就行。
头文件
#include<reg51.h> //REG也是可以的
#include<reg52.h>
延时函数
void delay(unsigned int s)//1ms
{
unsigned int i,j;
for(i=s;i>0;i--)
for(j=144;j>0;j--);
return 0;
}
定义一个引脚
sbit buzzer=P0^7;
控制一个灯
控制蜂鸣器
#include<reg52.h>
sbit buzzer=P0^7;
delay(unsigned int s)
{
unsigned int i,j;
for(i=s;i>0;i--)
for(j=144;j>0;j--);
return 0;
}
void main(void)
{
while(1)
{
buzzer=0;
delay(500);
buzzer=1;
delay(500);
}
}
流水灯
位编程
#include<reg51.h>
sbit led1=P1^0;
sbit led2=P1^1;
sbit led3=P1^2;
sbit led4=P1^3;
sbit led5=P1^4;
sbit led6=P1^5;
sbit led7=P1^6;
sbit led8=P1^7;
void delay(unsigned int s)
{
unsigned int i,j;
for(i=s;i>0;i--)
for(j=144;j>0;j--);
return 0;
}
void main()
{
while(1)
{
led1=0;
delay(500);
led1=1;
led2=0;
delay(500);
led2=1;
led3=0;
delay(500);
led3=1;
led4=0;
delay(500);
led4=1;
led5=0;
delay(500);
led5=1;
led6=0;
delay(500);
led6=1;
led7=0;
delay(500);
led7=1;
led8=0;
delay(500);
led8=1;
}
}
数组法
#include<reg51.h>
unsigned char arr[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
delay(unsigned int s)
{
unsigned int i,j;
for(i=s;i>0;i--)
for(j=114;j>0;j--);
return 0;
}
void main(void)
{
unsigned char i;
while(1)
{
for(i=0;i<8;i++)
{
P1=arr[i];
delay(500);
}
}
}
移位法
#include<reg51.h>
delay(unsigned int s)
{
unsigned int i,j;
for(i=s;i>0;i--)
for(j=144;j>0;j--);
return 0;
}
void main(void)
{
unsigned char a,i;
while(1)
{
a=0xfe;
for(i=0;i<8;i++)
{
P1=a;
a=a<<1;
a=a|0x01;
delay(500);
}
}
}