找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5547|回复: 0
收起左侧

STC12C5410AD的学习笔记

[复制链接]
ID:262 发表于 2014-6-10 03:44 | 显示全部楼层 |阅读模式
最近开始学习STC12C5410AD单片机。首先,这仍是一个51架构的单片机,目前来看,普通功能在编程时,可以直接套用“reg51.h”这类的头文件。但笔者之所以要学习这个单片机,最主要的原因就是它集成了AD转换功能。如果是这样的话,一些特殊的寄存器在“reg51.h”的头文件中应该是没有声明的,所以单纯套用“reg51.h”的头文件似乎就行不通了。所以还是要建立一个新的头文件。
较新版的STC的程序下载软件可以生成12C5410AD的头文件。笔者的版本是“STC-ISPV6.57”。
头文件的生成方法:
头文件的生成方法
往keil4添加STC数据库的方法:
往KEIL4中添加STC数据库的方法

先说说STC12C5410AD的IO口。和89C51相比,这个家伙的IO口专业了许多。89C51的IO口只有双向一种模式。这事就好也不好了。对初学者来说,寄存器这个东西自然是越少越好,而设置IO口状态的话当然也就要通过专门的寄存器来设定。所以说,89C51的IO口只有一种状态,对初学者是好事。但这就限制了一些功能的发挥。也就不得不提到为什么要区分IO口是IN还是OUT,抑或别的状态。
STC12C5410AD的IO口状态有4种,分别是弱上拉(双向口)、强上拉(输出时用)、高阻(输入时用)以及漏极开路(什么时候用合适待考)。笔者首先描述一个实验现象:给单片机的任意4个IO口(如P1.0~P1.3)分别设定为以上4种状态,并写入1111,再在IO口输出端分别接上一个LED和一个限流电阻(其实可以不加,但保险起见)。通电后,发现弱上拉的IO口后级LED有微弱的亮光(IO口电压实测2.8V),强上拉的IO口后级LED发光正常(IO口电压实测5V),其余两个则不亮。


0022iV1pty6Ep3duYEK8e&690.jpeg
图1 不同类型IO口测试电路图


上周到工厂参观实习,每天早出晚归,基本没更新,终于到周末啦。
说说程序的烧写吧。由于stc12c5410AD内部有大约5M的时钟,所以不用外接晶振也可以烧写。但其内部时钟稳定性不好,如果要实现多机通信等功能,最好好是用晶振。其他的和89c51的烧写电路和方法是完全一致的。
上文说过IO口分四种状态,这就要使用P*M0和P*M1(*代表0,、1、2、3四个寄存器,但这个芯片没有P0口的输出引脚,所以实际不会用到P0M0和P0M1)这些寄存器了。具体使用方法可以参照stc官网上的芯片手册或数据表。这里,笔者只列出一个更明了的表格:

表1 P1M0和P1M1寄存器设定举例










P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0
MO11111100
M111111010


这里P1.0口设定为弱上拉,P1.1设定为强上拉(输出),P1.2设定为高阻(输入),P1.3到P1.7都是集电极开路状态。
其实看的就是M0M1的状态:
00代表弱上拉,01代表强上拉,10代表高阻,11代表集电极开路。相应的C程序为:
P1M0 = 0xfc;
P1M1 = 0xfa;

接下来说说关于stc12c5410ad的定时器的使用。其实和51单片机是一模一样的,只是应为内部的时钟是5M到6M的振荡器,所以在计算定时器初值的时候需要注意一下。这里先贴一段测试通过的代码,然后在说说怎么计算:
#include

sbit T1Rdrive=P2^6;
sbit T2Wdrive=P2^7;
unsigned int k=0;  //定时器累加标志
unsigned int l=0;  //定时器累加标志

void delay();   //1s
void delayless();  //1ms

void delay()
{
    int i, j;

    for (i=0; i<1000;i++)
    for (j=0; j<500;j++);
}
void delayless()
{  int j;
      for(j=0; j<500; j++);
}
void main()
{
P2M0=0X3f; //定义P2.6,P2.7为强上拉输出口
P2M1=0Xff;
T1Rdrive=0;

TMOD=0x00; //使用定时器0,模式0(13位计数器)
AUXR=0x00;
TL0=0X18;
TH0=0X62;
EA=1; //开启中断控制
ET0=1; //定时器0的中断申请允许位
TR0=1; //开启计数器

while(1)
{
T2Wdrive=~T2Wdrive;
delay();

}
}
void t0int() interrupt 1
{
TL0=0X18;
TH0=0X62;
if(++k==100)
{T1Rdrive=~T1Rdrive;
  k=0;}
}


待续--

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表