新闻  |   论坛  |   博客  |   在线研讨会
一些自己最近在看网上C51单片机视频做的笔记
杨忠萍 | 2009-04-17 13:33:18    阅读:3710   发布文章

第一讲:关于电平特性

数字电路两种电平:高电平和低电平;

本课程定义单片机为TTL电平:

高电平:+5V  低电平:0V

RS232电平:计算机的串口

       高电平:-12V(范围为-3V——-12V 低电平:+12v

因此计算机与单片机之间通讯时需要加电平转换芯片max232

例如:单片机+5Vmax232——-12V计算机

单片机(控制芯片)的I/O口有一个灌入电流一般为20mA左右;超过这个电流时,单片机内部PN节会被击穿。

一般的继电器驱动电流在4050120mA

一般常用9012PNP9013NPN)三极管作为开关三极管,该三极管的驱动电流可以达到200mA左右,可以用来驱动继电器。

达林顿反向驱动器:ULN2001AULN2002AST)驱动电流500mA;(给低电平输出高电平,给高电平输出低电平)

漏极开路(CMOS)、集电极开路(TTL);

逻辑运算:

  “与”预算

单片机中“与”运算是“按位于”;例如 23 做与运算即10 11 结果为:10

一字节是八位:因此可以写成0000 00100000 0011 结果为0000 0010

  “或:运算

单片机中“或”运算是“按位或”; 例如 23 做或运算即10 11 结果为:11

一字节是八位:因此可以写成0000 00100000 0011 结果为0000 0011

   “非”运算

单片机中的“非”运算用“!”来表示;例如对A求反,则为!A

  单片机基本知识:

型号最后的一位数字表示内部ROM的大小;例如:80C51表示内部ROM4KB80C52则表示内部ROM8KB;即一个单片机的内部ROM容量大小=其型号的最后一位数字*4KB

有一种LV型号的单片机表示其工作电压为3.3V

C51系列中:80C51系列是总线型;89C51系列是非总线型;

单片机的程序编译器。通常用KEIL C51 他既可以编译C语言也可以编译汇编语言,还可以编译C和汇编的混合语言;

在单片机额定的工作频率内用更高的晶振可以提高其运行速度;

单片机C语言中常用的数据类型是char(字符型:16位、范围为:-3276832767)、int(整型:8位、范围为:-128127long(长精度型:32位、范围为:-21474836482147483647);

C语言中0x后面的数是表示十六进制数;

C语言中打注释通常有两种方式“/*    */”可以注释多行文字,“//    ”只能注释一行文字;

C 51C语言的数据类型扩充定义:

sfr:特殊功能寄存器声明,{8位(一个字节)数据声明}

sfr16sfr 16位数据声明;{16位(连个字节)数据声明}

sbit:特殊功能位声明;{一位数据声明}

bit:位变量声明;

例如:sfrSCON(串行控制寄存器)=0X98;(预先定义SCON,以后操纵SCON的时候就是对0X98单元操纵。)

      sfr16 T2 = 0XCC

      sbit OV=PSW^2;(将单片机的程序状态字寄存器的第二位声明为OV位,即溢出标志位。)

C51数据的存储类型:

 例如: 数据类型       存储类型        变量

char  varl

bit   flags

unsigned  char vextor[  10  ] ;定义一个十字节容量打数组;数字名称可以作为指针打首地址;

C51包含的头文件:

通常有: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 >

C51的运算符:

C语言基本相同;

+ - * / (加减乘除) >  >=  <  <= ( 大于 大于等于 小于 小于等于) = =  (测试等于 测试不等于)

&&    !(逻辑与 逻辑或 逻辑非) <<  >> (位左移 位右移)  &  按位于 按位或)^  ~  (按位异或 按位取反)

例如:左移运算10001000 左移后结果为 00010000 最高位的1移到了PSW中的CY里了;

      右移运算10001000 右移后结果为 01000100 最低位的0 丢弃了,最高位补0

C51的基本语句:

 if  选择语句  switch/case 多分支选择语句 while 循环语句 do while 循环语句 for 循环语句

单片机多用 if语句和while语句

中断服务程序:

函数名 interrupt  n

{    }

I/O口定义

#include < absacc .h >

#define prot xbyte[0x1000] 或用指针定义

额外补充知识:硅发光二极管的发光压降是0.7V;其发光的电流一般为310mA

一般使用电阻有上拉电阻、下拉电阻、限流电阻;一般与二极管相连接的电阻都是限流电阻,其作用是限制通过二极管的电流大小;

一般的电源输出电压是不稳定的,常需要加入电容来滤波、稳压和去耦,给整个系统提供稳定的电源,

高阻态;数字电路中的一种状态,既不是高电平也不是低电平,是介于高低电平之间的这种状态。通常在三态门中有这中情况。其中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位赋值为00 就表示低电平;在写程序的时候,不能直接写P1^0*/

}

总线控制;总线控制不需要位定义;

#include<reg52.h>

void main( )

{

   P1=0xFE; /*通过总线控制对P1口进行控制,P1口最低位置00xFE=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--);
虽然是一个小问题,但是对于新手来说,有时候很难发现。

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客