键盘有独立键盘和矩阵键盘两种。

下面是矩阵键盘的原理图:

0
Posted in K60

原谅我太天真了,一直以来都不知道有直流电机这个东东,以为电机都是交流电。当学长告诉我电机是直流驱动的时候,惊呆了!

其实原理也很简单:

电流通过转子上的线圈会产生洛伦磁力,当转子上的线圈与磁场平行时,再继续转,受到的磁场方向将改变,因此此时转子末端的电刷跟转换片交替接触,从而线圈上的电流方向也改变,产生的洛伦磁力方向不变,因此电机能保持一个方向转动。

0
Posted in K60

让第一个小灯亮0.5秒,再熄灭0.5秒。

我们先随便写一个小灯闪烁的程序,以第一个小灯为例。

#include <reg52.h>

sbit L1=P1^0;
void main()
{ 
    int a;
    while(1)
    {
        a=66666;
        L1=0;
        while(a--);
        a=66666;
        L1=1;
        while(a--);
    }
}

那么怎么知道这个小灯亮了多长时间呢?
我们可以debug来知道小灯亮的时间。

首先,我们需要设置模拟器的时钟频率。点击上方的Target options—>Target,然后将Xtal中数值调成单片机的时钟频率,一般是11.0592MHZ。

然后点击debug进行调试,双击14行使其前面出现红色块(使程序运行到红色块时暂停)页面如下:

然后点击上方按钮RST使程序重新运行,再点击Run,然后注意左边栏中sec项中数据,sec表示程序运行到红色块花费的时间。

显示程序运行到红色块花费了0.50006944秒。

说明小灯亮的时间为0.50006944秒。

然后我们就可以通过调节a的值来使小灯亮0.5秒,在熄灭0.5秒了。

:)

加油!

0
Posted in K60

单片机定时功能

先上代码,然后再解释:

<span style="font-family:System;">//定時器功能
void timer_0(void)
{
    TMOD=0x01;              //採用定時器T0,工作方式為1(16位定时器)
    IE=0x82;                //二進制1000|0010,七位為1表示全局中斷打開,即EA=1,一位為1表示定时器0中斷打開
    TH0=0xD8;               //定時器高八位賦值65536
    TL0=0xEF;               //定时器第八位赋值55536
                            //65536-55536=10000,因此12M晶振单片机中:計數10000個機器週期使用10ms
}

//定時器T0中斷函數
void Timer0(void) interrupt 1
{
    TH0=0xD8;
    Tl0=0xEF;
    Count++;                //計數加1
}
</span>

第一句TMOD=0x01:

TMOD是定时器/计数器模式控制寄存器(TIMER/COUNTER MODE CONTROL REGISTER)。

这个代码中TMOD=0x01

0x__就是表示16进制,然后后面是两个数0和1,第一个数字0表示D7,D6,D5,D4的值均为0,第二个数1表示D3,D2,D1,D0的值依次为0,0,0,1

那么D7,D6,D5等等是神马呢?
我们需要看一下此寄存器的结构:

因此D7=0表示定时器1的GATE=0;但是并不是说不打开,给它赋值0和1有啥区别呢?
●GATE=1时,“与门”的输出信号K由INTx输入电平和TRx位的状态一起决定(即此时K=TRx·INTx),当且仅当TRx=1,INTx=1(高电平)时,计数启动;否则,计数停止。
●GATE=0时,“或门”输出恒为1,“与门”的输出信号K由TRx决定(即此时K=TRx),定时器不受INTx输入电平的影响,由TRx直接控制定时器的启动和停止。 
然后,

D7,D6,D5,D4的值均为0,就表示定时器1不用。看第二个数字1,第二个数1表示D3,D2,D1,D0的值依次为0,0,0,1。对照寄存器的结构,则表示M1=0,M0=1,这是什么意思呢?

这就涉及到寄存器工作方式:

M0、M1——方式选择功能

MCS-51的定时器T0有4种工作方式:方式0,方式1,方式2,方式3。
MCS-51的定时器T1有3种工作方式:方式0,方式1,方式2。

M1 M0 工作方式 功能说明
0 0 方式0 13位定时器/计数器
0 1 方式1 16位定时器/计数器
1 0 方式2 自动重载8位定时器/计数器
1 1 方式3 T0分为2个8位独立计数器,T1无方式3

对照这个表,确定定时器的工作方式,则得出它的工作方式是:方式1——16位定时器/计数器。

第二句:IE=0x82; 

IE是中断允许寄存器,0x82转换为二进制为1000|0010,最高位为1表示CPU开放中断,第二位为1表示允许定时器T0溢出中断。

其他位的意思大家可以百度:中断允许寄存器IE

第三四句:TH0=0xD8;TL0=0xEF;

TH0=0xD8;                //定時器高八位賦值65536
TL0=0xEF;                //定时器第八位赋值55536
                            //65536-55536=10000,因此12M晶振单片机中:計數10000個機器週期使用10ms

TH0,TL0分别是16位定时器0/计数器的高低位,TL0是低八位,TH0=是高八位
对应的TH1,TL1分别是16位定时器1/计数器的高低位。

————————————————————可爱的分割线—————————————————

定时器中断函数:

//定時器T0中斷函數
void Timer0(void) interrupt 1
{
    TH0=0xD8;
    Tl0=0xEF;
    Count++;                   //計數加1
}

中断优先级:

51单片机的默认(此时的IP寄存器不做设置)中断优先级为:
外部中断0 > 定时/计数器0 > 外部中断1 > 定时/计数器1 > 串行中断

代号分别为:0,1,2,3,4,

刚刚程序中打开了定时器0,对应的优先级代号为1。因此inturrupt后面的数字为1.中断程序中要对TH0,TL0赋初始值。

0
Posted in K60

kinetis 启动分析

初始化函数
上电复位
->中断向量表:在vectors.c裡面定义,在vectors.h文件里。
    在vectors.h裡面两行:

#define VECTOR_000      (vector_entry)__BOOT_STACK_ADDRESS  //          ARM core        Initial Supervisor SP
#define VECTOR_001      Reset_Handler       // 0x0000_0004 1 -          ARM core        Initial Program Counter

分别定义了sp栈指针,和复位中断(根据英语字义便知道意思)
->Reset_Handler:在vectors.h裡面有这个函数:extern void Reset_Handler (void);
    声明复位函数,这是上电后运行的第一个函数,用彙编语言写的。
->start:在start.c裡面定义。就是初始化系统,关闭看门狗,複製数据到内存
    配置时钟,然后就进入了main函数
    ->common_startup:複製中断向量表,初始化数据段等
    ->sysinit:初始化时钟和串口
->main.c:执行的函数,我们要写的文件

0
Posted in K60