"); //-->
第一讲:关于电平特性
数字电路两种电平:高电平和低电平;
本课程定义单片机为TTL电平:
高电平:+5V 低电平:0V
RS232电平:计算机的串口
高电平:-12V(范围为-3V——-12V) 低电平:+12v
因此计算机与单片机之间通讯时需要加电平转换芯片max232
例如:单片机+5V—max232——-12V计算机
单片机(控制芯片)的I/O口有一个灌入电流一般为20mA左右;超过这个电流时,单片机内部PN节会被击穿。
一般的继电器驱动电流在40、50—120mA;
一般常用9012的PNP(9013、NPN)三极管作为开关三极管,该三极管的驱动电流可以达到200mA左右,可以用来驱动继电器。
达林顿反向驱动器:ULN2001A—ULN2002A(ST)驱动电流500mA;(给低电平输出高电平,给高电平输出低电平)
漏极开路(CMOS)、集电极开路(TTL);
逻辑运算:
“与”预算
单片机中“与”运算是“按位于”;例如 2和3 做与运算即10 与11 结果为:10 ;
一字节是八位:因此可以写成0000 0010与0000 0011 结果为0000 0010;
“或:运算
单片机中“或”运算是“按位或”; 例如 2和3 做或运算即10 与11 结果为:11;
一字节是八位:因此可以写成0000 0010与0000 0011 结果为0000 0011;
“非”运算
单片机中的“非”运算用“!”来表示;例如对A求反,则为!A;
单片机基本知识:
型号最后的一位数字表示内部ROM的大小;例如:80C51表示内部ROM为4KB,80C52则表示内部ROM为8KB;即一个单片机的内部ROM容量大小=其型号的最后一位数字*4KB;
有一种LV型号的单片机表示其工作电压为3.3V;
C51系列中:80C51系列是总线型;89C51系列是非总线型;
单片机的程序编译器。通常用KEIL C51 他既可以编译C语言也可以编译汇编语言,还可以编译C和汇编的混合语言;
在单片机额定的工作频率内用更高的晶振可以提高其运行速度;
单片机C语言中常用的数据类型是char(字符型:16位、范围为:-32768—32767)、int(整型:8位、范围为:-128—127)long(长精度型:32位、范围为:-2147483648—2147483647);
C语言中0x后面的数是表示十六进制数;
C语言中打注释通常有两种方式“/* */”可以注释多行文字,“// ”只能注释一行文字;
C 51对C语言的数据类型扩充定义:
sfr:特殊功能寄存器声明,{8位(一个字节)数据声明};
sfr16:sfr 的16位数据声明;{16位(连个字节)数据声明}
sbit:特殊功能位声明;{一位数据声明}
bit:位变量声明;
例如:sfrSCON(串行控制寄存器)=0X98;(预先定义SCON,以后操纵SCON的时候就是对0X98单元操纵。)
sfr16 T2 = 0XCC;
sbit OV=PSW^2;(将单片机的程序状态字寄存器的第二位声明为OV位,即溢出标志位。)
C—51数据的存储类型:
例如: 数据类型 存储类型 变量
char varl;
bit flags;
unsigned char vextor[ 10 ] ;定义一个十字节容量打数组;数字名称可以作为指针打首地址;
C—51包含的头文件:
通常有:reg51.h reg52.h math . h ctype.h stdio.h stdlib.h absacc .h
常用有:reg51.h reg52.h (定义特殊功能寄存器和位寄存器);(52是对51的扩充)
math . h (定义常用数学运算);
单片机的C语程序首先应该写入 # include < reg52.h >
C—51的运算符:
与C语言基本相同;
+ - * / (加减乘除) > >= < <= ( 大于 大于等于 小于 小于等于) = = != (测试等于 测试不等于)
&& !(逻辑与 逻辑或 逻辑非) << >> (位左移 位右移) & 按位于 按位或)^ ~ (按位异或 按位取反)
例如:左移运算10001000 左移后结果为 00010000 最高位的1移到了PSW中的CY里了;
右移运算10001000 右移后结果为 01000100 最低位的0 丢弃了,最高位补0;
C—51的基本语句:
if 选择语句 switch/case 多分支选择语句 while 循环语句 do while 循环语句 for 循环语句
单片机多用 if语句和while语句
中断服务程序:
函数名 ( )interrupt n
{ }
I/O口定义
#include < absacc .h >
#define prot xbyte[0x1000] 或用指针定义
额外补充知识:硅发光二极管的发光压降是0.7V;其发光的电流一般为3—10mA;
一般使用电阻有上拉电阻、下拉电阻、限流电阻;一般与二极管相连接的电阻都是限流电阻,其作用是限制通过二极管的电流大小;
一般的电源输出电压是不稳定的,常需要加入电容来滤波、稳压和去耦,给整个系统提供稳定的电源,
高阻态;数字电路中的一种状态,既不是高电平也不是低电平,是介于高低电平之间的这种状态。通常在三态门中有这中情况。其中OE被称为“使能端”;
锁存器:锁住并保存现在的状态;
单片机上电后多有I/O口都是高电平;
控制单片机I/O口有两种方法:位控制和总线控制;
例如:位控制
(在表示I/O的时候一定要用大写,因为在reg52.h定义的时候就是大写的;即编写程序的书写要与头文件得编写相同;)
在Keil C51中写源代码的时候一定要加上后缀.C
#include<reg52.h>
sbit P1_0=P1^0; /*把P1口的第0位定义为“P1_0”变量,P1必须大写,变量名可以任意。*/
void main( )
{
P1_0=0; /*把单片机的P1口的第0位赋值为0,0 就表示低电平;在写程序的时候,不能直接写P1^0*/
}
总线控制;总线控制不需要位定义;
#include<reg52.h>
void main( )
{
P1=0xFE; /*通过总线控制对P1口进行控制,P1口最低位置0,0xFE=1111 1110B*/
}
第二讲:关于单片机的运行
一个简单且通用的延时程序:
#include<reg52.h>
sbit P11=P1^0;//定义位变量
unsigned int a;//定义一个无符号数
void main(void) //主函数
{
while(1) //外循环
{
a=500; /*给变量a赋初值,当这个值大于a的类型(整型范围时)将其与类型范围相除取余数赋值给a;因此设置值的时候要注意范围*/
P11=0;//让P1口的第一个二极管发光
While (a--)//内循环延时500次
a=500;//给a赋值
P11=1;//让a熄灭
Whlie(a--)//内循环延时500次
}
}
RTC(Real-Time Clock、实时时钟芯片)是PC主板上的晶振及相关电路组成的时钟电路的生成脉冲,RTC经过8254电路的频产生一个频率较低一点的OS(系统)时钟TSC,系统时钟每一个cpu周期加一,每次系统时钟在系统初起时通过RTC初始化。8254本身工作也需要有自己的驱动时钟(PIT)。
它的主要作用就是提供稳定的时钟信号给后续电路用。主要功能有:时钟&日历,闹钟,周期性中断输出,32KHz时钟输出。
RTC的主要性能指标有:
控制方式:二线制,三线制,四线制.
晶振:分内置晶振和外置晶振.
耗流,时间微调范围,时间精度以及是否有TTF功能.
在编写程序的时候,尤其是在修改程序的时候,有些语句是暂时替换,但是有时候会用到,这时候将其删除是不明智的,可以将其变成解释语句,这样在需要使用时只需要将其解释的标示符去除就可以了。如:
//printf("this is a number");
/*printf("this is a number");*/
一般推荐用上面的一种较方便
另外在编译时会出现一些小问题对于新手来说,有的问题提示的并不明显,这时候就可以将相应语句变成解释,再来编译,就很容易找出问题所在。
例如下面这段简单的程序
#include<reg52.h>
sbit P11=P1^0;//定义位变量
unsigned int a;//定义一个无符号数
void main(void) //主函数
{
while(1) //外循环
{
a=500; /*
P11=0;
while (a--);
a=500;
P11=1;
while (a--)
}
}
在编译时就会出现:
双击
TEXT1.C(14): error C141: syntax error near '}'
这时候将while (a--)变成解释部分
//while(a--)
再编译
就会出现
Text1.c - 0 Error(s), 0 Warning(s).
这时候检查while语句后就可以很快发现问题;
while (a--);
虽然是一个小问题,但是对于新手来说,有时候很难发现。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。