51单片机0到4.docx
- 文档编号:24349180
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:19
- 大小:1.40MB
51单片机0到4.docx
《51单片机0到4.docx》由会员分享,可在线阅读,更多相关《51单片机0到4.docx(19页珍藏版)》请在冰豆网上搜索。
51单片机0到4
单片机就是在一块硅片上集成了微处理器(CPU),存储器(RAM,ROM,E-PROM)和各种输入输出接口(定时器/计数器、并行I/O口、串行口,A/D转换器以及脉冲调制器PWM等),这样一块芯片具有一台计算机的属性,因而被称为单片微型计算机,简称单片机。
而我们理解为单片机就是一块 CPU和很多资源集成在一起的芯片。
你可以通过编写程序控制单片机里面的各种资源,和外接I/O口,让它根据你的意愿做出个各种动作(而我们就是要学习怎么控制里面的这些资源)
电平特性数字电路中只有两种电平:
高电平和低电平高电平:
5V或者3.3V,取决单片机电源。
低电平:
0V
RS232电平:
计算机串口的电平 高电平:
-12V低电平:
+12V所以当我们用单片机跟电脑通信的时候,我们要通过各种元器件将单片机的电平转换为计算机可识别的电平才能跟电脑进行通信。
ROM的概念 ROM用来存储我们编写的程序RAM
RAM用来存放程序运算中使用的数据
内部IO,定时器,串口,中断,AD,DA,PWM…(都是通过各种寄存器来控制的,我们学习的就是怎么去操作这些寄存器。
)
外部各种外设,外部模块的原理和应用。
(比如说:
键盘,LCD,液晶屏,还有各种通信协议。
)
C-51的数据类型扩充定义
sfr:
特殊功能寄存器声明
sfr 变量名=地址值;
*特殊功能寄存器在reg51.H这个头文件里面都帮我们定义好了,所以平时我们就不要自己去定义寄存器的名字。
sbit:
特殊功能位声明
sbit 变量名=地址值;
*在给某个引脚取名的时候经常会用到。
bit:
位变量声明*用来定义位数据变量
例:
sfr SCON = 0X98;sbit LED = P0^2;
C51中常用到的一些预处理命令
#define
#define A P0(注意后面不用加分号)
#typedef
typedef unsigned char uint;(后面要加分号)
重新定义一些常用的关键词,可以增强程序的可移植性,因为在不同的编译软件上面,C语言的数据类型的关键词的位宽是不一样的。
#ifndef…#endif 条件编译,常用于头文件的定义还有一些程序条件编译
/*--------------------------------------------------------------------------
REG51.H
Header file for generic 80C51 and 80C31 microcontroller.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/
#ifndef __REG51_H__
#define __REG51_H__
/* BYTE Register */
sfr P0 = 0x80;
sfr P1 = 0x90;
sfr P2 = 0xA0;
sfr P3 = 0xB0;
sfr PSW = 0xD0;
sfr ACC = 0xE0;
sfr B = 0xF0;
sfr SP = 0x81;
sfr DPL = 0x82;
sfr DPH = 0x83;
sfr PCON = 0x87;
sfr TCON = 0x88;
sfr TMOD = 0x89;
sfr TL0 = 0x8A;
sfr TL1 = 0x8B;
sfr TH0 = 0x8C;
sfr TH1 = 0x8D;
sfr IE = 0xA8;
sfr IP = 0xB8;
sfr SCON = 0x98;
sfr SBUF = 0x99;
/* BIT Register */
/* PSW */
sbit CY = 0xD7;
sbit AC = 0xD6;
sbit F0 = 0xD5;
sbit RS1 = 0xD4;
sbit RS0 = 0xD3;
sbit OV = 0xD2;
sbit P = 0xD0;
/* TCON */
sbit TF1 = 0x8F;
sbit TR1 = 0x8E;
sbit TF0 = 0x8D;
sbit TR0 = 0x8C;
sbit IE1 = 0x8B;
sbit IT1 = 0x8A;
sbit IE0 = 0x89;
sbit IT0 = 0x88;
/* IE */
sbit EA = 0xAF;
sbit ES = 0xAC;
sbit ET1 = 0xAB;
sbit EX1 = 0xAA;
sbit ET0 = 0xA9;
sbit EX0 = 0xA8;
/* IP */
sbit PS = 0xBC;
sbit PT1 = 0xBB;
sbit PX1 = 0xBA;
sbit PT0 = 0xB9;
sbit PX0 = 0xB8;
/* P3 */
sbit RD = 0xB7;
sbit WR = 0xB6;
sbit T1 = 0xB5;
sbit T0 = 0xB4;
sbit INT1 = 0xB3;
sbit INT0 = 0xB2;
sbit TXD = 0xB1;
sbit RXD = 0xB0;
/* SCON */
sbit SM0 = 0x9F;
sbit SM1 = 0x9E;
sbit SM2 = 0x9D;
sbit REN = 0x9C;
sbit TB8 = 0x9B;
sbit RB8 = 0x9A;
sbit TI = 0x99;
sbit RI = 0x98;
#endif
1、LED闪烁
74HC573
OE:
使能端,片选
LE是latch-enable的缩写,即锁存使能,一般为"1"有效;与之相对应的是OE,
OE是output-enable的缩写,即输出使能,一般为"1"有效。
74HC573
OE:
使能端,片选
LE是latch-enable的缩写,即锁存使能,一般为"1"有效;与之相对应的是OE,
OE是output-enable的缩写,即输出使能,一般为"1"有效。
图中加了个非,表示低电平有效
#include
sbit led0=P2^0;
void main()
{
int i;
P2=0x00;
while
(1)
{
for(i=5000;i>0;i--);
led0=1; //或者P2=0x01;
for(i=5000;i>0;i--);
led0=0;
}
}
2、流水灯
#include
#include
#define GPIO_LED P2
void delay10ms(unsigned int);
void main()
{
unsigned char n;//节约内存
GPIO_LED=0x01;
while
(1)
{
for(n=0;n<7;n++)
{
GPIO_LED=_crol_(GPIO_LED,1);
delay10ms(50);
}
for(n=0;n<7;n++)
{
GPIO_LED=_cror_(GPIO_LED,1);
delay10ms(50);
}
}
}
void delay10ms(unsigned int c)//误差 0us
{
unsigned char b,a;
for(;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
unsigned char n;
GPIO_LED=0x01;
for(n=0;n<7;n++)
{
GPIO_LED*=2;
delay10ms
(1);
}
for(n=0;n<7;n++)
{
GPIO_LED/=2;
delay10ms
(1);
}
/*--------------------------------------------------------------------------
INTRINS.H
Intrinsic functions for C51.
Copyright (c) 1988-2004 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/
#ifndef __INTRINS_H__
#define __INTRINS_H__
extern void _nop_ (void);
extern bit _testbit_ (bit);
extern unsigned char _cror_ (unsigned char, unsigned char);
extern unsigned int _iror_ (unsigned int, unsigned char);
extern unsigned long _lror_ (unsigned long, unsigned char);
extern unsigned char _crol_ (unsigned char, unsigned char);
extern unsigned int _irol_ (unsigned int, unsigned char);
extern unsigned long _lrol_ (unsigned long, unsigned char);
extern unsigned char _chkfloat_(float);
extern void _push_ (unsigned char _sfr);
extern void _pop_ (unsigned char _sfr);
#endif
按键在闭合和断开时,触点会存在抖动现象
程序思路
#include
#include
#define GPIO_LED P2
sbit k1=P0^0;
void delay10ms();
void main()
{
unsigned char i,j=0;
GPIO_LED=0x01;
while
(1)
{
if(k1==0)//检测按键K1是否按下
{
delay10ms();//消除抖动
if(k1==0)
{
if(GPIO_LED<0x80&&j==0)
{
GPIO_LED=_crol_(GPIO_LED,1);
if(GPIO_LED==0x80)
{j=1;}
}
else
{
GPIO_LED=_cror_(GPIO_LED,1);
if(GPIO_LED==0x01)
{j=0;}
}//这里的ifelse要实现按键循环移动,加上标签j才能实现
for(i=0;i<50&&k1==0;i++)//检测按键是否松开
{
delay10ms();
}
}
}
}
}
void delay10ms()
{
unsigned char a,b;
for(a=38;a>0;a--)
for(b=130;b>0;b--);
}
静态数码管的相关知识。
LED数码管是由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。
LED数码管常用的段数一般为7段,有的另加一个小数点 。
LED数码管根据LED的接法不同,分为共阴和共阳两类 。
C51有RAM,ROM,code声明将其存储在ROM(程序存储空间里)
#include
#define shuma P2
#define xuan P0 //选择数码管
void delay10ms(unsigned int c);
void main()
{
unsigned char i,j;
unsigned char a[10]=
{0xfc,0x60,0xda,0xf2,0x66,
0xb6,0xbe,0xe0,0xfe,0xf6};//0-9编码,这里的编码我弄反了,不过接线翻一下就可以显示了
j=0; //标签
while
(1)
{
for(i=0;i<8;i++)
{
xuan=i;
shuma=a[j++];//共阳静态数码管按位取反~
if(j==10)
j=0;
delay10ms(50);
}
}
}
void delay10ms(unsigned int c)
{
unsigned char b,a;
for(;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机