目录
单片机的发展趋势:
1.微型化
2.低功耗
3.高速化
4.集成资源
5.性能更加优异
6.通信及网络功能加强
单片机的特征:
1.体积小,重量轻
2.可靠性高,运行速度快
第一课的程序
// 第一个程序
#include<reg52.h>
sbit LED=p2^0;
void main(){
LED=0;
}
Keil uVision4使用:
下载方式:
链接:https://pan.baidu.com/s/1PEdXNsUBZp7nlj1z-nN1-g?pwd=gshp 提取码: gshp
第一步:创建两个文件夹分为电路和程序 ;
第二步:在打开软件Keil uVision4 点击 projec 再点击new prejec 创建工程(工程名为随便就行)然后保存就好。
第三步:打开窗口后选择Atmel 然后找到 AT89C52 后点击ok就可以 出来的提示框点击否就可以。
第四步:在软件里面的File里面new 就可以新建文件啦 然后保存后随便输入名称后面点击点(.c)后保存就可以。
第五步:在工程里面选择我们的工程里面的Source Group1找到点击鼠标右键找到add Files to Group 后选择我们刚才创建的文件(就是后面加.c的文件)后点击ok (是或者确定)就好。
第六步:写程序
#include<reg52.h> // 包含52系列头文件 sbit LED=P3^0; void main(){ while(1) // 死循环 { LED=0; //P2.0输出低电平 } }
我们在单片机上允许的时候我们使用的是常见的16进制,10紧张和2进制,并且会互相转换的方法;
我们这下来初步看看怎么样转换:
我们把(AF4.76)十六进制转换成二进制:我们转换的时候分成四个,每一个数组的倒数第一个是1第二个是2第三个是4第四个是8 ,这个方法称为是8421的方法。
(1010 1111 0100 . 0111 0110) 我们看看左边的二进制数组
例如:我们看看这个四个数字1010 ,1010的倒数第一个是1第二个是2第三个是4第四个是8。这个是我们现在有的1010数字的倒数第一个是0然后使用8421的方法来解释的话二进制的数字的倒数第一个是0然后8421的数字的倒数第一个是1那就我们这样计算0*1,倒数第二个是1然后8421的数字的倒数第二个是2那就我们这样计算1*2,倒数第三个是0然后8421的数字的倒数第三个是4那就我们这样计算0*4,倒数第四个是1然后8421的数字的倒数第四个是8那就我们这样计算1*8,最后我们总计的时候都加起来就得到最后的16进制(1*8)+(0*4)+(1*2)+(0*1)= A。(我们最后为什么写A呢?是因为16进制的算法中10 设置为A ,11设置为B,12设置为C,13设置为D,14设置为E,15设置为F)。
标识符
标识符是用来表示源程序中某个对象的名字。对象可以是语句,数据类型,常量,变量,数组。
1.有效字符:只能由字母,数字,和下划线组成,且以字母或下划线开头
2.C标识符区域分大小写。
数据类型 | 名称 | 长度 | 取值范围 |
unsigned char | 无符号字符型 | 8位 | 0~255 |
signed char | 有符号字符型 | 8位 | -128~+127 |
unsigned int | 无符号整型 | 16位 | 0~65532 |
signed int | 有符号整型 | 16位 | -32768~+32767 |
unsigned long | 无符号长整型 | 32位 | 0~4294967295 |
signed long | 无符号长整型 | 32位 | -2147483648~2147 |
float | 浮点数 | 32位 |
变量
定义:类型标识符,变量名1,[变量名2,变量名3...];
如:
- int x,y,
- float x,y;
- chae c1,c2;或int c1,c2; (输出值)
注意事项:先定义变量在使用值。(先定义,后使用)
类型标识符为定义变量数据类型,数据类型分为整型,实型,字符型等。
三种基本结果
- 顺序结构
- 选择结构
- 循环结构
// while是循环或者for循环
/*
while (循环继续的条件表达式){
执行语句组
}
for(int a=1; a < 15; a++){
sum = sum + a;
}
int i = [1,2,1,5,1,2,5];
for(int a = 1; a< i.lenght; a++){
sum = sum + a;
}
*/
int a = 6;
while(a) {
LED = 0;
}
函数的定义:
按照规定的格式,将一个子任务编写成一个函数。
函数的划分:
注意:
函数从形式上划分,分为无参数函数和有参数的函数
函数定义的格式:
函数类型 函数名(类型 形参1,形参2,。。。)
{
说明部分
语句部分
}
提醒:
- 无返回值:void
- 有返回值:return
运算符
- 逻辑或 ||
- 逻辑与 &&
- 逻辑非 !
#include<reg52.h>
sbit LED = P2^0;
void delay(unsigned int k){
unsigned int i,k;
for(i=0;i<k;i++);
for(j=0;j<124;j++);
}
void main(){
while(1){
// 灯亮
LED=0;
// 函数调用
delay(5000);
// 灯灭
LED=1;
delay(5000);
}
}
我们现在做一个16个灯的亮和灭的案例
#include<reg52.h>
sbit LED1=P2^0;
sbit LED2=P2^1;
sbit LED3=P2^2;
sbit LED4=P2^3;
sbit LED5=P2^4;
sbit LED6=P2^5;
sbit LED7=P2^6;
sbit LED8=P2^7;
// 第二组的灯接口
sbit LED9=P0^0;
sbit LED10=P0^1;
sbit LED11=P0^2;
sbit LED12=P0^3;
sbit LED13=P0^4;
sbit LED14=P0^5;
sbit LED15=P0^6;
sbit LED16=P0^7;
void delay(unsigned int k)
{
unsigned int i,j;
for(i=0;i<k;i++)
for(j=0;j<124;j++);
}
void main(){
while(1)
{
LED1=0;
delay(1000);
LED1=1;
LED2=0;
delay(1000);
LED2=1;
LED3=0;
delay(1000);
LED3=1;
LED4=0;
delay(1000);
LED4=1;
LED5=0;
delay(1000);
LED5=1;
LED6=0;
delay(1000);
LED6=1;
LED7=0;
delay(1000);
LED7=1;
LED8=0;
delay(1000);
LED8=1;
// 第二组的灯
LED9=0;
delay(1000);
LED9=1;
LED10=0;
delay(1000);
LED10=1;
LED11=0;
delay(1000);
LED11=1;
LED12=0;
delay(1000);
LED12=1;
LED13=0;
delay(1000);
LED13=1;
LED14=0;
delay(1000);
LED14=1;
LED15=0;
delay(1000);
LED15=1;
LED16=0;
delay(1000);
LED16=1;
}
}
结果图:
画电流图的原件列表
AT89C52 | |
LED-RED | |
POWER | |
RESPACK_8 |
NET=P2# 可以快速标注元件
#include<reg52.h>
void delay(unsigned int k)
{
unsigned int i,j;
for(i=0;i<k;i++)
for(j=0;j<124;j++);
}
void main(){
while(1)
{
P2=0XFE; //1111 1110 第一个灯亮
delay(1000);
P2=0XFD; //1111 1101 第二个灯亮
delay(1000);
P2=0XFB; //1111 1011 第三个灯亮
delay(1000);
P2=0XF7; //1111 0111 第四个灯亮
delay(1000);
P2=0XEF; //1110 1111 第五个灯亮
delay(1000);
P2=0XDF; //1101 1111 第六个灯亮
delay(1000);
P2=0XBF; //1011 1111 第七个灯亮
delay(1000);
P2=0X7F; //0111 1111 第八个灯亮
delay(1000);
P2=0XFF; //0111 1111 第八个灯灭
delay(0);
P0=0XFE; //1111 1110 第一个灯亮
delay(1000);
P0=0XFD; //1111 1101 第二个灯亮
delay(1000);
P0=0XFB; //1111 1011 第三个灯亮
delay(1000);
P0=0XF7; //1111 0111 第四个灯亮
delay(1000);
P0=0XEF; //1110 1111 第五个灯亮
delay(1000);
P0=0XDF; //1101 1111 第六个灯亮
delay(1000);
P0=0XBF; //1011 1111 第七个灯亮
delay(1000);
P0=0X7F; //0111 1111 第八个灯亮
delay(1000);
P0=0XFF; //0111 1111 第八个灯灭
delay(0);
}
}
流水灯的方法
简单的方法来实现流水灯的方法
#include<reg52.h>
void delay(unsigned int k)
{
unsigned int i,j;
for(i=0;i<k;i++)
for(j=0;j<124;j++);
}
void main(){
unsigned temp,i;
while(1)
{
temp=0X01; // 0000 0000 0000 0001 第一个灯开始亮,只有一个灯亮
for(i=0;i<16;i++)
{
P2=~temp; // 1111 1111 1111 1110
P0=~(temp>>8);
delay(1000);
temp=temp<<1;
}
}
}
数组
数组是把相同数据类型的变量,按照顺序组织起来的一个集合。
数组中的单个变量称为数组元素。
数组只是一个集合,数组中的元素才是我们真正操作的对象。
数组名 [数组长度]
流水灯的左右移动亮的代码:
#include<reg52.h>
unsigned char tab[8]={0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F};
void delay(unsigned int k)
{
unsigned int i,j;
for(i=0;i<k;i++)
for(j=0;j<124;j++);
}
void main(){
while(1)
{
int i;
for(i=0;i<8;i++)
{
P2=tab[i];
delay(500);
}
P2= 0XFF;
for(i=0;i<8;i++)
{
P0=tab[i];
delay(500);
}
P0= 0XFF;
for(i=6;i>=0;i--)
{
P0=tab[i];
delay(500);
}
P0= 0XFF;
for(i=7;i>0;i--)
{
P2=tab[i];
delay(500);
}
P2= 0XFF;
}
}
函数的表达方法:
#include<reg52.h>
unsigned char tab[8]={0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F};
void delay(unsigned int k)
{
unsigned int i,j;
for(i=0;i<k;i++)
for(j=0;j<124;j++);
}
int i;
void joggle()
{
for(i=0;i<8;i++)
{
P2=tab[i];
delay(500);
}
P2= 0XFF;
for(i=0;i<8;i++)
{
P0=tab[i];
delay(500);
}
P0= 0XFF;
}
void change()
{
for(i=6;i>=0;i--)
{
P0=tab[i];
delay(500);
}
P0= 0XFF;
for(i=7;i>0;i--)
{
P2=tab[i];
delay(500);
}
P2= 0XFF;
}
void main(){
while(1)
{
joggle();
change();
}
}
函数的方法中使用自定义变量的使用:
#include<reg52.h>
unsigned char tab[8]={0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F};
void delay(unsigned int k)
{
unsigned int i,j;
for(i=0;i<k;i++)
for(j=0;j<124;j++);
}
int i;
void joggle(unsigned int B)
{
for(i=0;i<8;i++)
{
P2=tab[i];
delay(B);
}
P2= 0XFF;
for(i=0;i<8;i++)
{
P0=tab[i];
delay(B);
}
P0= 0XFF;
}
void change(unsigned int G)
{
for(i=6;i>=0;i--)
{
P0=tab[i];
delay(G);
}
P0= 0XFF;
for(i=7;i>0;i--)
{
P2=tab[i];
delay(G);
}
P2= 0XFF;
}
void main(){
while(1)
{
joggle(500);
change(100);
}
}
案例:按钮来控制灯亮的独立按钮控制四个灯:
#include<reg52.h>
sbit key1 = P3^2;
sbit key2 = P3^3;
char id;
void delay(unsigned int k)
{
unsigned i,j;
for(i=0;i<k;i++)
for(j=0;j<124;j++);
}
void main()
{
while(1)
{
if(key1==0)
{
P2=0XFE;
delay(500);
P2=0XFF;
delay(500);
}
if(key2==0)
{
id=id +1;
delay(500);
}
if(id>4)
{
id=1;
}
if(id==1)
{
P2=0XFE;
}
if(id==2)
{
P2=0XFC;
}
if(id==3)
{
P2=0XF8;
}
if(id==4)
{
P2=0XF0;
}
}
}
我们的这次的笔记到此为止啦,喜欢的关注,后续有更精彩的内容分享!