这一节,解释一下上一节的那个程序,用到什么,我们就学什么。
①新建一个程序,首先要包含头文件,比如很多人用STC89C52,因为是标准的51内核,要写 #include "reg51.h"就可以了,但是STC15W系列不是标准的51内核,他加了很多的功能进来,加了很多的特殊功能寄存器(SFR),所以要添加一个自己新建的头文件,stc15w.h ,这个是官方提供的,在下载客户端栏目里头,找头文件,直接复制添加进来就是了,如下图:
所谓的特殊功能寄存器,简单点就是8个开关,8个开关的不同组合开关状态会实现不同的功能,有些外设在使用前必须要设置,有的寄存器必须8个位一起操作,这叫不可位寻址,有的可以单独操作,比如EA = 1;这个是打开总中断使能位,如果全部操作8位可以写IE = 0X80;EA是IE寄存器的第7位。而那些不可位寻址的寄存器想单独操作,就必须用到与或非(& | !)来处理,这个待会讲。
② typedef 的作用是重新定义变量名字,这个是参与到程序编译中的,比如你原来定义unsigned char ,如果你写错了,写成unsiged char 编译器是不会编译通过的,#define 是用来进行简单的替换,不参与程序编译,也就是说,如果写错了,也不会提示。
③ 51单片机在定义引脚的时候,要用sbit来定义,照着写就好
④ STC15W系列单片机的IO配置
从上图可以看出,IO可以被配置为4种模式,分别是准双向口,推挽输出,高阻输入,和开漏模式。比如P0口,用P0M0 和P0M1这2个寄存器就可以设置成不同的模式,当然,你要是问内部原理,就需要了解数字电路,锁存器,触发器和场效应管等知识,上电复位后,大部分IO是准双向模式,有些特殊的被配置为其他模式,使用之前要进行初始化才能用。
⑤关于SWITCH语句
学单片机,买书籍是少不了的,C程序设计,谭浩强这本不错,SWITCH是一条多选一语句,包含多个分支case,这个case 可以是字符,可以是数字,每条语句用break结尾,默认是default: break;如果条件不匹配,直接退出。
⑥ 好了,接下来的全是重点内容,定时器和中断,这个慢慢讲,牵扯的东西实在是太多了
定时器和中断不是一个东西,但是在实际编程中一起使用,以上就是定时器0的配置步骤,其他定时器都差不多,寄存器可能不一样,有的可位寻址,有的不能。
来讲一下 & | !的用法,这个用法在stm32上广泛使用,很多人搞不懂为什么这么用,TMOD这个寄存器是一个不可位寻址的寄存器,如图所示:
我之前写过一篇帖子专门讨论过 & |这个问题,我把他复制过来,相信很多人都能看明白
接下来,讲一下定时器初值和计算,很多的教程在这方面讲得乱七八糟
以上这种表示写法表示定时器0 在12MHZ的晶振下,1ms溢出一次,这个玩意是怎么算出来的呢?我们知道,单片机的晶振是12MHZ情况下,单片机的时钟周期和频率互为倒数,也就是(1 / 12 000 000)s,又因为标准51单片机定义12个时钟周期是一个机器周期,也就是(12/ 12000 000)s,也就是每个机器周期是1us,那么1000us自然就是1ms,依然没听明白是吧?呵呵,接着看下面:
这里可以把定时器当计数器来处理,每个机器周期,累加1,如果我想定时1ms,该怎么处理呢?x*1us = 1000us,也就是说需要计数1000个就够了,而我们这个定时器是一个16位的,最大计数65535,那只要我们从(65536 - 1000) = 64536开始计数就可以了,计数1000个然后溢出就能到1ms的定时, 64536换成16进制是0XFC18,看下公示的设置:
至于上面这种写法,是等价的,8位的寄存器最大计数就是到255,共计256个数,还可以这么写,都一样。
可能很多人注意到了,定时器0的重载模式,我们在中断里面重新赋值了,这叫自动重载吗?这不是,如果使能了重载,就可以不写这两句,但是因为习惯的原因,加上也无所谓。
关于中断,中断是一种处理问题的机制,属于见缝插针,我称之为“偷时间的贼”,每次偷不多,一点点,一点点就把事情办好了,效率极高。每一个中断都有一个中断入口标号,使用的时候,像下面这样声明下就可以使用了。
好了,就到这里吧,下一节,继续测试硬件电路。。。晚安
上一篇:单片机学习札记6---PCF8563显示时间
下一篇:单片机学习札记4---调试蜂鸣器驱动
推荐阅读最新更新时间:2024-11-10 21:11