2006-03-24 20:20:00 ncdawen 阅读数 5264
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3393 人正在学习 去看看 朱有鹏
单片机的抗干扰性能历来为大家所重视,现在市面上的单片机就我所接触过的,就有十家左右了,韩国的三星和现代;日本的三菱,日立,东芝,富士通,NEC;台湾的EMC,松汉,麦肯特,合泰;美国的摩托罗拉,国半的cop8系列,microchip系列,TI的msp430系列,AVR系列,51系列,欧洲意法半导体的ST系列。。。。。。

  这些单片机的抗干扰性能大多数鄙人亲自测试过,所用机器是上海三基出的两种高频脉冲干扰仪,一种是欧洲采用的标准,一种是日本采用的标准;日本的标准歉咂德龀辶⒊觯龀蹇矶却?0ns到250ns可调,欧洲采用的标准是脉冲间歇(间歇时间和发出时间可调)发出,脉宽也是从50ns到250ns可调;我们国家采用的是欧洲标准。

  一般情况下,脉冲干扰这一项能够耐受2000V以上就算不错了(好像我国家电标准是1200V),有些可以达到3000V,于是很多人为此很得意。

  单片机在高频脉冲干扰下程序运行是否正常,或者说抗干扰是否通过,有些人以程序不飞掉,或者说 “死机”为标准,有些人以不复位并且程序正常运行为标准。很多情况下,芯片复位程序是可以继续运行的,表面上看的不是很清楚。我一般就看单片机在干扰下是否复位,复位了我就认为不行了。不复位并且程序正常运行当然比复位来说要好了。

  好多人看到自己做的电路抗干扰达到2000V或者3000V就很高兴,实际上芯片的抗干扰并不一定就很好。这里我不能不说一下日本的标准,高频脉冲连续发出的形式。别小看一个连续和一个间歇的区别,实际上,大家如果有机会,用日本的标准测试一下你的芯片和电路,你就会发现,几乎和欧洲标准差别很大很大,采用日本标准你会很伤心,因为大多数单片机过不了!

日本的标准是1600V。上面我提到的十几家单片机:

意法的也就是ST的≥1800
三菱的≥1800
富士通和日立的≥1600V
nec的≥1500
东芝的≥1300V
摩托罗拉的≥1300
三星的≥1300
现代的≥800
microchip的≥700
国半的cop8≥500
avr和51系列≥500

  这里没有给出数据的我没有测试过,但是知道EMC的一款28pin的设计上有缺陷(EMC自己人讲的);合泰的据说欧洲标准可以过3000V。

  大家对照一下自己用的单片机,看看在什么档次。不过呢谁要是受了打击也不要太伤心,因为我对照过,也有日本标准在5—600V但是欧洲标准可以达到1500V的电路,同样一块板子;这样的情况我遇到好几次了。大多数情况下,如果过不了欧洲标准日本标准也过不了;过得了日本标准欧洲标准偶尔也会过不了。

  需要说明的是,很多单片机在高频干扰脉冲下经常复位,但是程序运行好像没有受到影响,如果打到死机,还可以提高1—200V的,日本标准。欧标还会更高。

  大家选单片机的时候仔细看一下资料,凡是复位时间在us级的采用日本标准 “会死的很难看”,这就是cop8系列和avr系列怎么努力也达不到日本标准的1000V,avr最多到700V。
单片机的价格嘛,这里我就不用多罗嗦了,ST的最贵,其次是日本的和美国的,下来是韩国的,韩国之后是台湾的。

  ST单片机贵在抗干扰性能上,抗干扰性能极好!而且带内置eeprom。Avr的flash+内置eeprom是很好的卖点。不知道大家知道不知道,其实国半也有很好用的flash,价格比avr稍低一点。但是内置eeprom不知道有没有。Msp430系列的特点是a/d,其实16位a/d的单片机大家如果想用便宜的,推荐台湾松汉的一款和三星的一款,价格比msp430的大多便宜。尤其是三星的,16位a/d+flash,超便宜!但是也有前提的,量!开发系统ST的,三菱的,三星的很贵,都在5—6000RMB以上。其他大多在1000到3000之间。

  单片机结构方面,我觉得cisc结构的要比RISC结构的要好。Risc结构的指令少,除此之外我看没多少好处了,由此带来的不方便倒不少,为了一个简单的功能几条指令倒来倒去,倒出几十条指令的程序来;而且有的ram要分页,有的rom也分页。编程序跳来跳去,烦透了!cisc结构的指令多,但是也不是很难记,用多自然就记住了,并且结构比较整齐一些,不用操心分页的事情(就算有分页),程序想编到哪儿就到哪儿。

  现在我基本只代理和使用三星和合泰的单片机。性价比好。如果大家要用到液晶驱动,我建议大家用这2家的就行了。合泰的flash不多,但是用特殊办法,一个片子也可以烧几次。三星合泰的单片机这一年半载来卖的很猛!除了带液晶驱动之外,抗干扰性能也不错。

  相比较而言,三星的单片机比合泰的稍微要贵一些,而且开发系统死贵(但是你可以不用买,代理公司一般会借用给你——要受押金的,哼哼!)!但是三星的有几款单片机实在很好,9454大家用的人不少了吧?9228呢,也不错吧?但是我告诉你,还有比这2款更好的,flash+4*18液晶驱动+10bit的a/d。另外三星还有一款专门用于遥控器的芯片,64pin,4*32的液晶驱动,也很便宜,就算是用作液晶驱动芯片也划算,价格嘛,和2片液晶驱动芯片ht1621差不多的。

   但是三星单片机也有不好用的地方,大多是精简指令,一个小功能要你把几条指令用好几遍。
合泰的单片机性能不错,开发系统也便宜,尤其带液晶驱动的几款不妨考虑考虑。

  这里说到的一些技术上的问题,很多只是个人经验,大家可以借鉴,技术做久了,各人有各人的特点和长处,有不确切的地方请批评指正!
单片机
2013-06-09 22:18:00 a379039233 阅读数 4780
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3393 人正在学习 去看看 朱有鹏

      单片机就是一个小的计算机,不过他没有计算机那么好,方便的输入输出设备,计算机的输入设备就是鼠标,键盘等,方便的很,输出设备就是显示器,将输出非常清晰的显示在屏幕上。但是单片机的输入输出都是他的引脚,需要通过编程控制。

       单片机和PC机相同的地方就是都有CPU(我把单片机的微控制器核也叫CPU),内存(单片机的ROM,RAM,FLASH等),时钟系统,中断系统,定时器等等。

      一, 单片机最小系统就是单片机能够运行起来的必要条件:

   1.电源 2.晶振 3.复位电路  没有电源就没有能源,就不能工作;没有晶振,就没有时钟电路,就没有节拍,指令就不能按一定的步调运行;没有复位电路,单片机就很不可靠,会出现“死机”、“程序走飞(PC)”等现象。
   
   二,一些重要概念
    1. 我们对单片机编程不过就是设置单片机内部的寄存器和端口引脚以便输出高低电平控制其他(连接在单片机上)器件而已。
    2. 编程中最重要的是1:配置时钟,2:配置IO口,3:配置复位方式,看门狗设置等等
       次要的是:中断(外部,定时器,串口),串口,ADC,XRAM读写,内部FLASH等。   
    3. 1个机器周期 =12个时钟周期(晶振的振荡周期)   
    4. while(1);让单片机一直工作,等待中断!防止程序跑飞等。
    5. 51单片机共111条汇编指令,
7种寻址方式:
1.立即寻址 MOV A,#01H
2.直接寻址 MOV A,20H
3.寄存器寻址 MOV A,R3(A,B,Cy,DPTR)

4.寄存器间接寻址 MOVA,@R0  R1
5.变址寻址 MOVC  A, @A+DPTR
6.相对寻址 SJMP   rel; (PC)←(PC) + 2(指令长度) +  rel
7.位寻址 位寻址是直接寻址方式的一种,其特点是对8位二进制数中的某一位的地址进行操作。
MOV 00h,C,MOV  20H.0, C  ,PSW.6
 
     6. XRAM(分内外)读写 
      1> XBYTE[address]=data   写数据
         data=XBYTE[address]   读数据;
   2>char xdata *mydat;
      ......
      mydat=(char xdata*)0x0030;
      *mydat=31;
   3>汇编方式
	mov dptr,#1000h
	mov a,#55h
	movx @dptr,a
      7.  读端口信号是必须先向端口写“1”,然后再读,这就是单片机口信号的准双向的含义。切记!
      8.  模拟输入或数字I/O,推挽(强)或漏极开路输出(IO,inout)

 
9. 一些寄存器默认设置即可,配置了可能会有警告。usb clock.clksel=1  10. Keil C 里面Lib库文件的生成与调用,可以自己做lib。
11. ram高128位只能间接寻址。idata,一些人可能没有用到idata,发现data不够用。
12 1s=1000ms=1000000us=1000000000ns.
13.
x M晶振定时 y ms: TH1 = (65536 - (x/12)*y*1000) / 256;     TL1 = (65536 - (x/12)*y*1000) % 256;16位的哦,亲!
假设C8051F020单片机的晶振是22114800Hz,测每秒计22114800个数 经过12分频后,每秒计22114800÷12=1842900个数,如果设置计数器初值是 0xfe90(即十进制65165),则需要计的数的个数为65535-65165=360,那么定时器的 时间为(360÷1842900)(S)≈0.195ms,即0.2ms。
#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long #define bool  bit
 
#include<C8051F330.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long //引脚定义
sbit In1= P0^3; sbit In2= P0^7; sbit In3= P1^3; sbit In4= P1^7; sbit Out1= P0^3; sbit Out2= P0^7; sbit Out3= P1^3; sbit Out4= P1^7;
//----------------------------------------------------------------------------- //功能:延时 //入口参数:yc //出口参数:无 //-----------------------------------------------------------------------------
void delay(uint time)
{
  while(--time);
}
//----------------------------------------------------------------------------- //功能:单片机C8051F330初始化 //入口参数:无 //出口参数:无 //-----------------------------------------------------------------------------
void Mcu_Init(void) { 
  PCA0MD&=~0x40;                 //禁止内部看门狗  
  OSCICN = 0x83;                 //内部振荡控制寄存器,使能H-F,八分频  
OSCICL = 0x00;                 //期望输出频率也是24.5MHz
  CLKSEL = 0x00;                  //系统时钟取自内部高频振荡器  
RSTSRC = 0x04;                 //检测到时钟丢失时允许系统复位
}
 
 
//----------------------------------------------------------------------------- //功能:MCU I/O口配置 //入口参数:无 //出口参数:无 //-----------------------------------------------------------------------------
 
void PORT_Init (void) {    
P0MDOUT  = 0x88;                         //P0.3,P0.7推挽输出   
P1MDOUT  = 0x88;                  //P1.3,P1.7推挽输出   
XBR0     = 0x00;  
  XBR1     = 0x40;                  //使能交叉开关和弱上拉 }
//----------------------------------------------------------------------------- // 功能:所有设备初始化 //----------------------------------------------------------------------------- // 入口参数:无 // 出口参数:无 //-----------------------------------------------------------------------------
 
void Init_Device (void) {   
Mcu_Init();   
PORT_Init();
} void main() {
     Init_Device();     
delay(10);          
     while(1){            }
 
}
2017-07-17 13:17:37 ReCclay 阅读数 1983
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3393 人正在学习 去看看 朱有鹏

①RST复位电路

单片机复位电路

51单片机是高电平复位,低电平正常工作
上电瞬间以及按下按键(电容相当于导线),RST为高电平。
按键按下的瞬间会产生大电流冲击,会局部产生较大的电磁干扰。为了减小这种干扰,加一个一个限流电阻。

②有关RAM和FLASH

STC89C52RC系列单片机有512B的RAM以及8K的Flash(程序存储空间)

RAM就是平时存储变量的,比如你定义了一个什么bit、uint8、 uint16 、uint32等等这些都是在RAM中定义的。
512B的RAM虽然名字一样,但是在物理结构以及用法是有区别的。
沿袭老8051单片机的叫法,依旧叫为片内RAM和片外RAM。所谓的片内和片外是指芯片内部和芯片外部,但是现在的单片机的芯片拓展基本上都在内部,不存在什么片外拓展RAM。但是我们仍依旧这么叫,知道这回事就行了。

片内RAM分为 data、idata一般我们直接定义的变量都是直接在data里面的,data是直接寻址的,是速度最快的。而其他都是通过寄存器间接寻址的,其速度当然不可同日而语。
其中data的范围是从片内的0x00~0x7F共128字节
而idata范围是从片内的0x80~0xFF也是128B但是它同时不用来存储变量,当然也不希望程序能访问到这里,它主要的用途就是用来中断与函数的调用。

片外RAM分为pdata、xdata如上所述,均是通过寄存器来间接寻址的。
pdata的寻址范围是片外的0x00~0xFF共256B。寻址速度相对来讲比xdata快
xdata的寻址范围是片尾的0x0000~0xFFFF共64K。寻址范围最广,如要使用还得专门配置两个字节寄存器DPTRH和DPTRL,寻址范围的广,也就意味着速度是最慢的。

所以呢,总结一下就是:一般变量存储在data区域,当data不够了,在去寻xdata区域,idata不要触碰。pdata不到万不得已也不要!!!

看似高字节拓展的128RAM是和寄存器的地址相重叠,但是物理上并不重叠
这里写图片描述

③三极管

用途主要有:驱动和控制两个
三极管的特性:截止、饱和、放大。
(在数电中主要用到的是三极管的开关作用,用到的是截止和饱和特性(有一个β因数)。而在模电当中用到的是则是它的放大特性)

三极管的控制作用
三极管实现电压转换(5V控制12V)
三极管的驱动作用

④按字节编码寻址以及按字编码寻址

按字节编码寻址,1M = 2^20B 而 1B=8bit所以2^20B/1B = 2^20
可寻地址为1~2^20-1
需要二十根总线

按字编码寻址,1字的4B,其他同上,那么2^20/1字=2^20/4B=2^18
可寻地址为1~2^18-1
需要十八跟总线

对了,除此之外还要注意一个东西,就是MB和M的区别
MB是一个容量单位,兆字节
而M是一个数量单位,兆

LED压降为2V,工作电流1~20mA**一般在1~5,mA之内的变化可以直接体现在灯的亮程度,超过5mA就没那么明显了所以选取的串联电阻可以选**150欧~3K

⑤三八译码器快速记住对应的,其实左边三个可以看成二进制是几,对应的右边哪一位就是0

比如左边A2 A1 A0为0 0 0那么右边Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 对应的值就是 0 1 1 1 1 1 1 1

⑥关于IO口
IO口有四种状态,准双向,开漏,强推挽,高阻

应用最多的得数准双向和开漏了,两者的主要区别就是开漏内部是没有上上拉电阻的。51单片机的P0默认就是开漏,而其他口均是准双向IO对于P0在自己DIY小电路的时候切记不要忘了加外部加上拉电阻!
对于准双向IO要特别注意:51单片机的一个重要知识准双向IO口,如果要正确读取外部信号的状态,首先必须保证自己是高电平

⑦上拉电阻和下拉电阻

上拉电阻的主要应用场合有:
OC门即是开漏输出
需要增大电流输出时,加一个上拉相当于并联一个电阻。
也能起到限流作用,如5V转12V系统
抵抗EMI(电磁干扰)

sbit
sbit用于定义单字节可位寻址对象的某位,“单字节可位寻址”包括可位寻址特殊功能寄存器和RAM中可位寻址区的16个字节。

bata 关键字可将变量定位到内部的RAM的可位寻址。
eg:

char bdata bittest;
sbit RIbit = bittest^0;
sbit TIbit = bittest^1;
sbit P1_0 = P1^0;

⑧ 有关IO口拉成高电平的总结

通常我们会遇到在普通的准双向IO口下,出现IO口拉不到高电平的情况。这个时候怎么办呢?
尝试所有的IO口状态,有的比较特殊,比如IO口外接上上拉电阻,必须开漏才能拉成高电平。
单片机是否速度过快,可以适当延时。。

⑨关于继电器

模块接口:
1、DC+:接电源正极(电压按继电器要求,有5V.9V.12V和24V选择)
2、DC-:接电源负极
3、IN:可以高或低电平控制继电器吸合
继电器输出端:
1、NO: 继电器常开接口,继电器吸合前悬空,吸合后与COM短接
2、COM:继电器公用接口
3、NC: 继电器常闭接口,继电器吸合前与COM短接,吸合后悬空

高低电平触发*选择端:*

1.跳线与LOW短接时为低电平触发;

2.跳线与high短接时为高电平触发。

这里写图片描述

⑩、关于DS18B20的引脚

简而言之,就是。平面面向自己以后,三个脚分别是GND、VOUT和VCC

上张图明白一切
这里写图片描述

11、DHT11

DHT11 是一款含有已校准单总线数字信号输出的温湿度复合传感器,它包括一个电阻式感湿
元件和一个 NTC 测温元件,并与一个高性能 8 位单片机相连接。DHT11 是属于民用型器件,测量
值仅精确到个位,即小数点后无数据,如果要使用于工业产品或更精确的应用,建议使用 DHT21
或 SHT10。

这里写图片描述

注意的是那个NA或者NC引脚,表示是空引脚。

2017-08-14 07:51:10 u011732358 阅读数 639
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3393 人正在学习 去看看 朱有鹏

四年前写的程序了,纪念一下曾经玩过的单片机

 #include "IAP15F2K61S2.h"
#include "delay.h"
sbit seg1 = P2^7;
sbit seg2 = P2^6;
sbit seg3 = P2^5;
sbit seg4 = P2^4;
sbit seg5 = P2^3;
sbit seg6 = P2^2;
sbit seg7 = P2^1;
sbit seg8 = P2^0;
unsigned int  n      = 0; //定时器计数
unsigned char hour   = 0;
unsigned char minute = 0;
unsigned char second = 0;
unsigned char code Num[12] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
unsigned char   Display[8] = {11,11,10,11,11,10,11,11};
void Init_timer()
{
 TMOD = 0x02;        //方式二
 TH0  = 0x06;          //赋初值(255-6=250)
 TL0  = 0x06;
 EA   = 1;                //打开总中断
 ET0  = 1;               //打开定时器0中断
 TR0  = 1;              //启动定时器0
}
void SEG_Display()
{
 seg1 = 0;
 P0 = Num[Display[0]];
 Delay1ms();
 seg1 = 1;
 P0=0xff;

 seg2 = 0;
 P0 = Num[Display[1]];
 Delay1ms();
 seg2 = 1;
 P0=0xff;

 seg3 = 0;
 P0 = Num[Display[2]];
 Delay1ms();
 seg3 = 1;
 P0=0xff;

 seg4 = 0;
 P0 = Num[Display[3]];
 Delay1ms();
 seg4 = 1;
 P0=0xff;

 seg5 = 0;
 P0 = Num[Display[4]];
 Delay1ms();
 seg5 = 1;
 P0=0xff;

 seg6 = 0;
 P0 = Num[Display[5]];
 Delay1ms();
 seg6 = 1;
 P0=0xff;

 seg7 = 0;
 P0 = Num[Display[6]];
 Delay1ms();
 seg7 = 1;
 P0=0xff;

 seg8 = 0;
 P0 = Num[Display[7]];
 Delay1ms();
 seg8 = 1;
 P0=0xff; 
}
void Clock_Run()
{
 Display[0] = hour   / 10; 
 Display[1] = hour   % 10;
 Display[3] = minute / 10; 
 Display[4] = minute % 10;
 Display[6] = second / 10; 
 Display[7] = second % 10; 
}
int main()
{
 Init_timer(); 
 while(1)
 {
  if(n>4000) 
  {
   n = 0;
   second++;
   if(second == 60)
   {
    second = 0; 
    minute++;
    if(minute ==60)
    {
     minute = 0;
     hour++;
     if(hour == 24)
     {
      hour = 0;
     }
    }
   }
  }
  Clock_Run();
  SEG_Display();
 }
 return 0;
}
void Tomer0() interrupt 1
{
 n++;
}
2017-12-24 21:50:19 glaxy1998922 阅读数 13893
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3393 人正在学习 去看看 朱有鹏

单片机入门

什么是单片机

  • 单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。

  • 不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。概括的讲:一块芯片就成了一台计算机。

Intel公司推出了MCS-51系列单片机:集成
8位CPU、4K字节ROM、128字节RAM、4个8位并口、1个全双工串行口、2个16位定时/计数器。寻址范围64K,并有控制功能较强的布尔处理器。

封装这里写图片描述

单片机工作的基本时序

  • 振荡周期: 也称时钟周期, 是指为单片机提供时钟脉冲信号的振荡源的周期,我们开发板上为12MHZ。 状态周期:
  • 每个状态周期为时钟周期的 2 倍, 是振荡周期经二分频后得到的。
  • 机器周期: 一个机器周期包含 6 个状态周期S1~S6, 也就是12 个时钟周期。 在一个机器周期内, CPU可以完成一个独立的操作。
  • 指令周期: 它是指CPU完成一条操作所需的全部时间。
  • 每条指令执行时间都是有一个或几个机器周期组成。MCS - 51 系统中, 有单周期指令、双周期指令和四周期指令

数字电路基础

电平特性
数字电路中只有两种电平:高电平和低电平
高电平:5V或者3.3V,取决单片机电源。
低电平:0V
RS232电平:计算机串口的电平
高电平:-12V
低电平:+12V
所以当我们用单片机跟电脑通信的时候,我们要通过各种元器件将单片机的电平转换为计算机可识别的电平才能跟电脑进行通信。

二进制逻辑运算

  • “与”运算
    有0得0
    1&1=1 ; 1&0=0 ; 0&0=0 ;
  • “或”运算
    有1得1
    1|1=1 ; 1|0=1 ; 0|0=0;
  • “非”运算
    1的非得0,0的非得1。
    ~1=0; ~0=1;
  • “异或”运算
    必须不同,否则没有(0)
    1^1=0;1^0=1;0^0=0;

80C51的引脚

这里写图片描述

P3口第二功能各引脚功能 定义: P3.0:RXD串行口输入
P3.1:TXD串行口输出
P3.2:INT0外部中断0输入
P3.3:INT1外部中断1输入
P3.4:T0定时器0外部输入
P3.5:T1定时器1外部输入
P3.6:WR外部写控制
P3.7:RD外部读控制


建立keil工程文件

1.创建工程文件夹
2.创建工程文件
3.选择正确的单片机型号
4.创建新的C语言文件
5.保存并添加C语言文件
6.开始编写程序


LED

Light Emitting Diode
LED,即发光二极管,是一种半导体固体发光器件。
插件
这里写图片描述
贴片
这里写图片描述
LED 原理图
这里写图片描述

工作原理:单向导电性

LED的工作是有方向性的,只有当正级接到LED阳极,负极接到LED的阴极的时候才能工作,如果反接LED是不能正常工作的。

开发板LED原理图

这里写图片描述

点亮LED

#include “reg52.h”   
                   //此文件中定义了单片机的一些特殊功能寄存器,调用头文件
 sbit led=P0^0;    //将单片机的P0.0端口定义为led,p是port的缩写

void main()
{
    while(1)
    {
        led=1;  //P0.0端口设置为高电平
    }       
}
//补充:bit和sbit都是C51扩展的变量类型。sbit用法:sbit 变量名=地址值;在给某个引脚取名的时候经常会用到。

LED闪烁

1.C语言常用的预处理命令

typedef使用
typedef unsigned char u8;
typedef unsigned int u16;(后面要加分号)

新定义一些常用的关键词,可以增强程序的可移植性,因为在不同的编译软件上面,C语言的数据类型的关键词的位宽是不一样;
}
2.延时函数

void delay(u16 i)//大约延时10us
{
    while(i--); 
}
#include "reg52.h"          
typedef unsigned int u16;                    //预处理命令
typedef unsigned char u8;
    sbit led=P0^0;                       //端口定义

void delay(u16 i)                                   //大约延时10us
{
    while(i--);                                     
}

void main()                                            
{
    while(1)
    {
        led=0;                         //管脚置低电平
        delay(50000);             //大约延时0.5秒
                            led=1;                         //管脚置高电平      
        delay(50000);   
    }       
}                                            
//Pracitce:控制第一个和第二个LED交替闪烁,周期为两秒。

LED流水灯

1.C语言常用预处理命令

#define使用 #define A P0(注意后面不用加分号)

2.循环左移右移函数

crol(a,b);循环左移函数,a是左移的值,b是左移的位数。包含在instrins.h库函数里面。
cror(a,b);循环右移函数,a是右移的值,b是右移的位数。包含在instrins.h库函数里面。

#include "reg52.h"          
 #include<intrins.h>         //包含crol函数的头文件
typedef unsigned int u16;   
typedef unsigned char u8;
#define led P0             //预处理命令
void delay(u16 i)             //延时函数 
{
    while(i--); 
}
void main()                      //主函数
{
    u8 i;
    led=0x01;            //设定初始状态
    delay(50000); 
    while(1)
    {   
/*      for(i=0;i<8;i++)
        {
            P0=(0x01<<i);//无循环                                  delay(50000); 
        }
*/
for(i=0;i<7;i++)    
    {
    led=_crol_(led,1);//有循环左移位   delay(50000); 
    }
for(i=0;i<7;i++)        
            {
    led=_cror_(led,1); //有循环右移位
                delay(50000);           }
    }       
}
//practice:如何实现与流水灯恰好相反的效果


----------

静态数码管

原理图

这里写图片描述
led数码管(LED Segment Displays)由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8个。这些段分别由字母a,b,c,d,e,f,g,dp来表示。
LED数码管根据LED的不同接法可以分为2类:共阴和共阳

封装

这里写图片描述

工作原理

这里写图片描述

因为是共阳数码管,所以控制端为低电平才能导通,LED发光,所以如果需要静态数码管显示固定字符只要找到对应的端口状态,进而控制显示字符。

静态数码管控制

#include "reg52.h"          
typedef unsigned int u16;   
typedef unsigned char u8;
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                     0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
                                    //这是共阴数码管表, code 是定义存放在FLASH中的常量,单片机的RAM                    
                                    // 有限,所以尽量把不变的数组都存在ROM中
void main()
{   
    P0=~smgduan[];
    while(1);
}
//Practice:让静态数码管循环显示你的电话号码,每个数字周期为0.5秒。

独立按键

轻触开关是一种电子开关,使用时,轻轻按开关按钮就可使开关接通,当松开手时,开关断开。我们使用的开关如下图:

封装

这里写图片描述

原理图

这里写图片描述

独立按键是一个输入模块,将按键受力转化为电学量,按键按下的瞬间两边导通,电平相同,单片机可以检测电平变化以作出相应应答。
难点在于实际按键按下时存在抖动,我们可以通过软件消除抖动因素

独立按键编程

#include "reg52.h"  //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16;     //对数据类型进行声明定义
typedef unsigned char u8;
sbit k1=P1^0;    //定义P10口是k1
sbit led=P0^0;   //定义P00口是led
void delay(u16 i)
{
    while(i--); 
}
void keypros()
{
    if(k1==0)         //检测按键K1是否按下
    {   
    delay(1000);   //消除抖动 一般大约10ms
    if(k1==0)    //再次判断按键是否按下
        {
            led=~led;  //led状态取反
        }
        while(!k1);  //检测按键是否松开
    }       
}
void main()
{   
    led=0;
    while(1)
    {   
        keypros();  //按键处理函数    
    }       
}

作业

按下第一个独立按键后,静态数码管显示a,并且流水灯每隔一个亮一次循环
按下第二个独立按键后,静态数码管显示b,并且流水灯每隔两个亮一次循环
按下第三个独立按键后,静态数码管显示c,并且流水灯每隔三个亮一次循环
提示1:需要用到循环以及break语句
提示2:每次按下新的按键前需要重启单片机

单片机学习大纲

阅读数 640

单片机进阶、单片机RoadMap

博文 来自: y15166022470
没有更多推荐了,返回首页