打印

51单片机的复习之路-1 STC90C516RD

[复制链接]
4027|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
stc90c516rd+和at89s52有什么联系和区别?
两种都是51单片机,内核是一样的,IO引脚也一样(注意IO一样是当封装都是PDIP40时)
KEIL选择STC51就可以。
主要的不同是 FALSH ,RAM及外设的不同,程序下载方式也不同
stc90c516rd+   可以用串口进下ISP下载,可以看其它的STC型的单片机
at89s52           可以用烧录器或都用USB下载,不过那个USB下载器制作比较麻烦
stc90c516rd+ 比at89s52  的FLASH种RAM大,at89s52比stc90c516rd+的抗干扰能力要强
如果你是做实验的话就选择stc90c516rd+,下载比较方便
具体可以看两款芯片的datasheet进行比较!

其实,STC大部分的单片机都是51内核或是52内核的。所以在选芯片的
时候,只要选一款51体系的芯片就可以。我们用STC的时候,选的都是89C51的
芯片。
   但有一个问题要注意的就是:  在KEIL  仿真的时候,要注意区别,什么
可以仿真,什么不可以仿真,这个就要求对51体系很懂。但如果你的水平足够
高,可以通过分析程序和借助串口来判断,就没事。不要求仿真。、
   还有一个问题就是。大部分的STC的芯片,虽是51体系,但在51基础上做了
很大的改动。比如说,指令系统,虽没有增减指令个数,但是,在时序上改动
特别大。有些指令1个系统时针就完成了。这在延时,和外围的接口,方面都
要特别注意。一定要仔细看宏晶官网的资料。  
   当然,官网上提供的资料,有些示例程序,不一定就是最好的。很的程
序,都写得很一般。甚至说很烂。不过,思路是对是。所以,示例程序,只是
对你起一个指导做用。如果想写出好的程序,大部分的功能,最好是都要经过
测试。
    刚看了一下STC90c516RD+   这芯片的功能并不是很强,只是FLASH达到了
61K。当然,如果用到它增强方面的功能的话。就必须会定义特殊功能寄存
器。下面附带了

reg51.头文件剖析
      我们平时写单片机应用程序的时候,所使用的头文件大多都是用的的
reg51.h或是用reg52.h。会写C51的人都会用,但对其头文件内部的定义有所
了解的人确并不多。
下面对其内部做详细解释,方便读者作进一步的了解,并能运用各类型号的单
片机。因为增强型号的单片机的增强功能都是通过特殊功能寄存器控制。
打开   reg52.h  头文件,会发现是由大量的 sfr ,sbit的声明组成,甚至于
还有sfr16.其实这样的声明都是与单片机内部功能寄存器(特殊功能寄存器)
联系起来的,下面对其做出详细解释
sfr:  声明变量
SFR 声明一个变量,它的声明与其它的C变量声明基本相同,唯一的区别,
SFR在声明的同时为其指定特殊功能寄存器作为存储地址,而不同于C变量声明
的整型,字符型等等由编译器自动分配存储空间。
   如reg52.h头文件,第一条声明就是sfr P0    = 0x80;
此处声明一个变量P0,并指定其存储地址为特殊功能寄存器0x80;,在加入
reg52.h头文件后。编写应用程序时P0就可以直接使用而无需定义,对P0的操
作就是,对内部特殊功能寄存器(0x80对应用MCU的P0口)的操作,可进行读
写操作。
如果将第一条声明改为sfr K0    = 0x80; 那么,如果要把单片机的P0口全部
拉低,则不能写P0=0x00;而应保存后再在应用程序中写成K0=0x00;否则编译器
会提示“P0为未定义标识符”
   使用方法:
     sfr  [variable]  =  [address]   //为变量分配一个特殊功能寄存
器。
1  等号右边,只能是十进制,十六进制整型的数据常量,,不允许带操作符
的表达式
      经典的8051内核支持的SFR地址从0x80H~0xFF 飞利浦80C51MX系列
0x180H~0x1FF
   2  SFR不能声明于任何函数内部,包括main函数。只能声明于函数外。
   3  用SFR声明一个变量后,不能用取地址运算符&获取其地址, 编译无法
通过,编译器会提示非法操作。
   4  有一点须特别注意,51内核0x80~0xff,为特殊功能寄存器地址区间,但
并不是所有的地址都有定义,如果说你所用的MCU芯片上对于某个地址没有定
义,那么用sfr在定义变量的时候,不要把变量的地址分配到未定义的特殊功
能寄存器上,虽然编译时能通过,用KEIL仿真时貌似是没有问题,但下载到芯
片里运行时,是会出问题的。比如说,向一个未定义的特殊功能寄存器执行读
操作,读出来的就是一个未知的数。(读者可自行测试,先把串口通信调通,
然后做一个简单的人机交互。读出一个数后,再发给计算机,用串口调试助手
或是串口监控查看。这用方法在仿真的时候很有用。)所以具体那些特殊功能
寄存器能够用,就要查看你使用的芯片手册。

若遇到增强性的单片机,只要知道其扩展的特殊功能寄存器的地址,
用SFR定
就可以很方便进行编程。
sbit:  声明变量
   sbit 同样是声明一个变量,和SFR 使用方法类似,但是SBIT是用来声明一
个位变量,因为,在51系列的应用中,非常有必要对SFR的单个位进行存取,
而通过bit 数据类型,使其具备位寻址功能。
      如,在reg52.h中有如下声明
          sfr IE    = 0xA8;
          sbit EA    = IE^7;
sbit ET2   = IE^5; //8052 only
sbit ES    = IE^4;
sbit ET1   = IE^3;
sbit EX1   = IE^2;
sbit ET0   = IE^1;
sbit EX0   = IE^0;
   所以,对EA的操作即是对IE最高位的操作。
但如果想让 SP   DPL  DPH   PCON   TMOC  TL0  TL1  TH0  TH1  SBUF这些
特殊功能寄存器具备位寻址,采用上述如IE类似的定义,是不行的,虽然修改
后,在编译的时候不会出现错误,但只要用到你定义的位变量名时就会出错。
原因是,只有特殊功能寄存器的地址是8的倍数(十六进制以0或8结尾)才能
进行位寻址。
打开reg52.h头文件可以看到,所有用sbit声明了的特殊功能寄存器的地址均
是以0或8结尾
如硬要达到上述要求,可用带参的宏定义来完成。此处不做详细说明(意义并
不大)。
下面对sbit的使用做详细介绍:
随着8051的应用,非常有必要对特殊功能寄存器的单个bit位进行存取,C51编
译器通过sbit 数据类型,提供了对特殊功能寄存器的位操作。
       以下是sbit的三种应用形式:
一,
sbit  name = sfr-name^bit-position;
  sfr   PSW =0xD0;
  sfr   IE  =0xA8;
  sbit   OV= PSW^2;
  sbit   CY=PSW^7;
  sbit   EA= IE^7;
二,
sbit  name= sft-address^bit-position;
        sbit  OV =0xD0^2;
        sbit  CY =0xD0^7;
        sbit  EA =0xA8^7;
三,
sbit  name= sbit-address;
        sbit  OV =0xD2;
        sbit  CY =0xD7;
        sbit  EA =0xAF;
   现对上述三种形式的声明做必要的说明
       第一种形式sbit  name = sfr-name^bit-position;如sbit   OV=
PSW^2;  当中的这个特殊功能寄存器必须在此之前已经用sfr 定义,否则编译
会出错。
bit-position范围从0~7;
       第二种形式  sbit  name= sft-address^bit-position如sbit  OV
=0xD0^2;  与第一种形式不同之外在于,此处直接使用PSW的地址.第一种形式
须先定义PSW
       第三种形式.  sbit  name= sbit-address  如sbit  OV =0xD2 是直
接用的OV的地址
OV的地址计算方式,是OV所在的寄存器地址加上OV的bit-position
                  
      注意:
             不是所有的SFR都可位寻址。只有特殊功能寄存器的地址是8的
倍数(十六进制以0或8结尾)才能进行位寻址,并且sbit声明的变量名,虽可
以是任意取,但是最好不要以下划线开头,因为以下划线开头的都保留给了
C51的头文件做保留字。
sfr16: 声明变量
许多8051的派生型单片机,用两个连续地址的特殊功能寄存器,来存储
一个16bit的值。例如,8052就用了0xCC和0xCD来保存定时/计数寄存器2的高
字节和低字节。编译器提供sfr16这种数据类型,来保存两个字节的数据。虚
拟出一个16bit的寄存器。
       如下:
               sfr16 T2 = 0xCC
     存储方面为小端存储方式,低字节在前,高字节在后。定义时,只写低
字节地址,如上,则定义T2为一个16位的特殊功能寄存器。 T2L= 0CCh, T2H=
0CDh
    使用方法:
     sfr  [variable]  =  [low_address]      
1  等号右边,只写两个特殊功能寄存器的低地址,且只能是十进制,十六进
制的整型数据常量,不允许带操作符的表达式
   2  SFR不能声明于任何函数内部,包括main函数。只能声明于函数外。
   3  用SFR声明一个变量后,不能用取地址运算符&获取其地址, 编译无法
通过,编译器会提示非法操作。
      4 当你向一个sfr16写入数据的时候,KEIL CX51 编译器生成的代码,
是先写高字节,后写低字节,(可通过返汇编窗口查看)在有些情况下,这并
非我们所想要的操作顺序。使用时,须注意。
      5 当你所要写入sfr16的数据,当是高字节先写还是低字节先写非常重
要的时候,就只能用sfr 这个关键字来定义,并且任意时刻只保存一个字节,
这样操作才能保证写入正确。

相关帖子

沙发
13395410441|  楼主 | 2016-1-27 10:22 | 只看该作者
STC90C516RD+系列单片机是宏晶科技推出的新一代超**/高速/低功耗的单片机,指令代码完全兼容传统8051单片机,12时钟/机器周期和6时钟/机器周期可任意选择,内部集成MAX810专用复位电路,时钟频率在12MHz以下时,复位脚可直接接地。
1.增强型6 时钟/ 机器周期,12 时钟/ 机器周期 8051 CPU
2.工作电压:5.5V - 3.8V(5V 单片机)/3.8V - 2.4V(3V 单片机)
3.工作频率范围:0-40MHz,相当于普通8051的 0~80MHz.
4.用户应用程序空间 4K/6K/7K/8K/10K/12K/13K/16K/32K/40K/48K/56K/ 61K/字节
5.片上集成 1280字节/512/256字节 RAM
6.通用I/O口(35/39 个),复位后为: P1/P2/P3/P4 是准双向口/ 弱上拉(普通8051 传统I/O 口)
P0口是开漏输出,作为总线扩展用时,不用加上拉电阻,作为I/O 口用时,需加上拉电阻。
7.ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器 / 仿真器
可通过串口(P3.0/P3.1)直接下载用户程序,8K 程序3 -  5 秒即可完成一片
8.EEPROM 功能
9.看门狗
10.内部集成MAX810专用复位电路,外部晶体12M以下时,可省外部复位电路,复位脚可直接接地。
11.共3个16位定时器/计数器,其中定时器0还可以当成2个8位定时器使用
12.外部中断4路,下降沿中断或低电平触发中断,Power Down模式可由外部中断低电平触发中断方式唤醒
13.通用异步串行口(UART),还可用定时器软件实现多个UART
14.工作温度范围:0-75℃/-40-+85℃
15.封装:LQFP-44,PDIP-40,PLCC-44

使用特权

评论回复
板凳
13395410441|  楼主 | 2016-1-27 10:25 | 只看该作者
STC90C51RC/RD+系列 单片机简介
STC90C516RD+系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051系列单片机,指令代码完全兼容传统8051,但速度快8-12倍。12时钟/机器周期和6时钟/机器周期可任意选择,内部集成MAX810专用复位电路,时钟频率在12MHz以下时,复位脚可直接接地。
特点:
1.增强型6 时钟/ 机器周期,12 时钟/ 机器周期 8051 CPU
2.工作电压:5.5V - 3.8V5V 单片机)/3.8V - 2.4V3V 单片机)
3.工作频率范围:0-40MHz,相当于普通8051080MHz.
4.用户应用程序空间 4K/6K/7K/8K/10K/12K/13K/16K/32K/40K/48K/56K/ 61K/字节
5.片上集成 1280字节/512/256字节 RAM
6.通用I/O口(35/39 个),复位后为: P1/P2/P3/P4 是准双向口/ 弱上拉(普通8051 传统I/O 口)
P0口是开漏输出,作为总线扩展用时,不用加上拉电阻,作为I/O 口用时,需加上拉电阻。
7.ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器 / 仿真器
可通过串口(P3.0/P3.1)直接下载用户程序,8K 程序3 -  5 秒即可完成一片
8.EEPROM 功能
9.看门狗
10.内部集成MAX810专用复位电路,外部晶体12M以下时,可省外部复位电路,复位脚可直接接地。
11.316位定时器/计数器,其中定时器0还可以当成28位定时器使用
12.外部中断4路,下降沿中断或低电平触发中断,Power Down模式可由外部中断低电平触发中断方式唤醒
13.通用异步串行口(UART),还可用定时器软件实现多个UART
14.工作温度范围:0-75/-40-+85
15.封装:LQFP-44,PDIP-40PLCC-44

引脚图:
见附件

测试程序:
#include <reg52.h>   //P2口接led流水灯
void delay(unsigned char s)       
{                                               
        unsigned char i;
        while(s--)
        {
                for(i = 0; i < 1200; i++);
        }
}
main()
{
        unsigned char LED;
        LED = 0xfe;          
        while(1)
        {
             
             P2 = LED;
                 delay(25);
                 LED = LED << 1;
         if(LED == 0x00 )         
                 {
                 LED = 0xfe;
                 delay(25);
                 }
        }
}

图片1.png (130.05 KB )

图片1.png

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

56

帖子

3

粉丝