矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
楼主: 崂山

单片机入门不难------谈PIC系列

  [复制链接]
发表于 2011-3-22 20:55:36 | 显示全部楼层

崂山呀崂山我一天顶你一次,直到顶到你出现的那一天。

崂山老师,你真的不出来嘛?告诉你,我决定了,我一天顶此贴一次,直到你出现为止。!!!今天是第一次顶,所以要多顶一次。
回复 支持 反对

使用道具 举报

     
发表于 2011-4-6 14:12:35 | 显示全部楼层
非常感谢。。好好学学。。。
回复 支持 反对

使用道具 举报

发表于 2011-5-17 21:33:32 | 显示全部楼层
留下脚印。
回复 支持 反对

使用道具 举报

发表于 2011-6-8 10:25:29 | 显示全部楼层
不错,正好学习
回复 支持 反对

使用道具 举报

发表于 2011-6-14 21:14:39 | 显示全部楼层
本帖最后由 willx 于 2011-6-14 21:16 编辑

好帖子,可是不适合我看,我是dos+汇编时代的,原理清楚不懂动手的那类。希望楼主照顾下。
我的问题是怎么写进去,要是rom的写过程序的mcu还有什么用吗?
回复 支持 反对

使用道具 举报

发表于 2011-6-21 19:09:43 | 显示全部楼层
很感兴趣,还没入门。会经常关注的。
回复 支持 反对

使用道具 举报

     
发表于 2011-6-28 13:37:23 | 显示全部楼层
记号下,学习
回复 支持 反对

使用道具 举报

     
发表于 2012-6-6 10:47:20 | 显示全部楼层
没有后续了,呵呵,还等着看中断呢!
回复 支持 反对

使用道具 举报

     
发表于 2012-6-7 21:09:47 | 显示全部楼层
还有六条腿的,PIC10F20X,两块钱一个,很好玩的,我的一个产品里用过的
回复 支持 反对

使用道具 举报

     
发表于 2012-6-9 13:49:04 | 显示全部楼层
您好,我最近对单片机比较感兴趣,我最近打算做一个用单片机控制的DAC,想问一下,
1985497DAC.rar (138.97 KB, 下载次数: 514)
这个程序和您在浅谈PIC系列的帖子中讲解的命令似乎不大一样,请问那是什么语言?如何编辑,怎样看懂?
小弟才疏学浅,望您赐教
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2012-6-11 23:45:27 | 显示全部楼层
eggplant886 发表于 2012-6-9 13:49
您好,我最近对单片机比较感兴趣,我最近打算做一个用单片机控制的DAC,想问一下,

这个程序和您在浅谈P ...

继续,一晃两年过去了,真是抱歉。好在我们的论坛是全收音机技术,半娱乐性质,不是计算机专业的学习论坛,否则,馍馍菜都凉拉。我想如果是真要学习单片机的同学,这两年早就自己下手学会中断处理了,不过为了本主体的完美,还是把它继续。


现在,补充 把主任务123+45=?扩展一部分 67+89=?
这样主任务多一些,显得程序结构更趋于实际,也显示出调用子程序的意义。

####################################

根据我们以前所学,主程序和子程序已然明了。在以前的程序中,凡是涉及专用寄存器如 GPIO 或者通用寄存器如的时候,
我都是在程序注释里说明该符号如GPIO 、020H,是一个寄存器的地址。这里有一个差别,特殊寄存器都是用字符串表示,而通用寄存器使用它的地址数表示。这样做主要是为了便于理解寄存器的本质和使用。
事实上,通用寄存器也是可以用字符串来表示的,并且在实用的程序里往往是用字符串表示通用寄存器,而不是直接用它的地址,因为用字符串更能明确这个通用寄存的用途性质。仅用地址数是允许的,但是通用寄存器一旦多起来,连程序作者自己也搞不清楚哪一个是干什么用的了。

为了便于程序理解,阅读,容易编写。允许程序作者给通用寄存器 例如020H  起用一个漂亮直接的字符串名字。 我们来学习一个崭新的语句      EQU

我们看几个例子:

     BeijiaShu       EQU        020H     '定义字符串    BeijiaShu   的值是数字   020H
                                                     '此前或者此后的程序代码中, 只要遇到 BeijiaShu  就可以用数字  020H取代                          
                                                     '尽管BeijiaShu也可以写在一行的最左顶格,但是别用冒号,它不是程序标号

有了上述的语句,下列语句
           MOVLW         123H
           MOVWF         020H
就完全可以写成   
           MOVLW         123H
           MOVWF         BeijiaShu

程序中下列两组语句是等价的,相同的意义。这样,所有的通用寄存器都可以有自己的名号可以使用了。

新语句中的 EQU 不属于35条指令里面的,因为它在单片机运行的时候,不能被执行,也不会占用单片机里的程序存储空间。
仅仅是为了方便我们人类阅读、编写源程序程序而起的代号,事实上,有了EQU指令,家用电脑在把我们编写的源程序“翻译”成单片机能够执行的机器码的时候,还徒然增加了编译的工作量,不利于提高编译速度。

因此,它也不是十分必须的语句,你如果记忆力好,对每个通用寄存器的地址你自己设计成什么用途了,都能够记住,完全可以不必多此一举的使用什么符号常数。话又说回来,谁有那么多多余的精力去记忆枯燥的地址数据呢。

象这样不能被单片机执行,仅仅能帮助我们编写阅读源程序方便、或者仅仅有助于辅助家用电脑编译源程序而设立的指令,叫做单片机的“伪指令

从理论上来说,几乎所有伪指令都不是必须的,都是可有可无的,都能够用我们的35条指令就可以完成任务的。只是,那样的话我们的35条使用起来比较麻烦和不太方便甚至还需要增加额外的计算我们的程序所存在的地址等等工作量。
有了这些个伪指令,我们编写程序就会省却许多的麻烦,例如:

此前的例子中用到了许多行 NOP空操作指令,假如某段代码需要连续500行NOP语句,即便拷贝也是个大麻烦,
那么有一款或者两款伪指令,只需要说明你的行编辑重复次数以及行编辑重复的代码是NOP  就足够了,
编辑上看上去也就是几行的样子,实际家用电脑在编译生成单片机的实际执行码的时候,会自动添加500行NOP指令,单片机里面的程序存储空间,也是相应的增加等量500行代码的空间,那是一点也不能节约出来的。

一句话:伪指令和我们此前讲的 单引号 ’ 后面的程序注释类似,共同点是都不被单片机执行,也不会占用单片机内部的程序存储资源,都是帮助人们阅读和编写的方便。不同点是:伪指令要干预家用电脑对源程序的编译,而单引号则不会。
由此看,初学入门不宜在伪指令上徘徊,老手则是善于运用伪指令图个编程快捷简便。

下面我们编写我们的中断例子,并且作为文本文件来处理看待。汇编语言主程序文件的扩展名称,是汇编系统已经规定好了的,必须使用  *.ASM  
例如:可以为: Shan_LED.ASM
用记事本新建一个文件,文件名称请使用例子   Shan_LED.ASM         文件内容如下

BeijiaShu      EQU        020H           '被加数         
JiaShu          EQU        021H           '加数
HE1             EQU        022H           '第一算式的和
HE2             EQU        023H           '第二算式的和
  

尽管如此,初学者,有四个伪指令需要认识,一个是EQU 已经认识过了。如果需要的 EQU 的行很多,例如我们的主程序中要用到 被加数、加数、计算结果的和   以及第一个算式的计算结果寄存 以及第二个算式的计算结果暂存:


那么,下一步,就是要核计整个程序的结构,如果从程序的用途属性,程序存储区域等角度来看,存储来区分一个典型的程序结构例子要包含主程序,子程序,中断子程序,和伪指令说明程序

以往教材,在教导程序结构的时候不是这么分类,而是大谈特谈什么循环结构,分支结构,递归结构,函数调用等等,先把学生搞晕再说,我认为那些属于程序技巧,是用,是末,理应排在以后的技巧升级后去研究。按照上述分类才是程序之本体,是入门的必然门径。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2012-6-11 23:47:41 | 显示全部楼层
eggplant886 发表于 2012-6-9 13:49
您好,我最近对单片机比较感兴趣,我最近打算做一个用单片机控制的DAC,想问一下,

这个程序和您在浅谈P ...

继续,一晃两年过去了,真是抱歉。好在我们的论坛是全收音机技术,半娱乐性质,不是计算机专业的学习论坛,否则,馍馍菜都凉拉。我想如果是真要学习单片机的同学,这两年早就自己下手学会中断处理了,不过为了本主体的完美,还是把它继续。


现在,补充 把主任务123+45=?扩展一部分 67+89=?
这样主任务多一些,显得程序结构更趋于实际,也显示出调用子程序的意义。

####################################

根据我们以前所学,主程序和子程序已然明了。在以前的程序中,凡是涉及专用寄存器如 GPIO 或者通用寄存器如的时候,
我都是在程序注释里说明该符号如GPIO 、020H,是一个寄存器的地址。这里有一个差别,特殊寄存器都是用字符串表示,而通用寄存器使用它的地址数表示。这样做主要是为了便于理解寄存器的本质和使用。
事实上,通用寄存器也是可以用字符串来表示的,并且在实用的程序里往往是用字符串表示通用寄存器,而不是直接用它的地址,因为用字符串更能明确这个通用寄存的用途性质。仅用地址数是允许的,但是通用寄存器一旦多起来,连程序作者自己也搞不清楚哪一个是干什么用的了。

为了便于程序理解,阅读,容易编写。允许程序作者给通用寄存器 例如020H  起用一个漂亮直接的字符串名字。 我们来学习一个崭新的语句      EQU

我们看几个例子:

     BeijiaShu       EQU        020H     '定义字符串    BeijiaShu   的值是数字   020H
                                                     '此前或者此后的程序代码中, 只要遇到 BeijiaShu  就可以用数字  020H取代                          
                                                     '尽管BeijiaShu也可以写在一行的最左顶格,但是别用冒号,它不是程序标号

有了上述的语句,下列语句
           MOVLW         123H
           MOVWF         020H
就完全可以写成   
           MOVLW         123H
           MOVWF         BeijiaShu

程序中下列两组语句是等价的,相同的意义。这样,所有的通用寄存器都可以有自己的名号可以使用了。

新语句中的 EQU 不属于35条指令里面的,因为它在单片机运行的时候,不能被执行,也不会占用单片机里的程序存储空间。
仅仅是为了方便我们人类阅读、编写源程序程序而起的代号,事实上,有了EQU指令,家用电脑在把我们编写的源程序“翻译”成单片机能够执行的机器码的时候,还徒然增加了编译的工作量,不利于提高编译速度。

因此,它也不是十分必须的语句,你如果记忆力好,对每个通用寄存器的地址你自己设计成什么用途了,都能够记住,完全可以不必多此一举的使用什么符号常数。话又说回来,谁有那么多多余的精力去记忆枯燥的地址数据呢。

象这样不能被单片机执行,仅仅能帮助我们编写阅读源程序方便、或者仅仅有助于辅助家用电脑编译源程序而设立的指令,叫做单片机的“伪指令

从理论上来说,几乎所有伪指令都不是必须的,都是可有可无的,都能够用我们的35条指令就可以完成任务的。只是,那样的话我们的35条使用起来比较麻烦和不太方便甚至还需要增加额外的计算我们的程序所存在的地址等等工作量。
有了这些个伪指令,我们编写程序就会省却许多的麻烦,例如:

此前的例子中用到了许多行 NOP空操作指令,假如某段代码需要连续500行NOP语句,即便拷贝也是个大麻烦,
那么有一款或者两款伪指令,只需要说明你的行编辑重复次数以及行编辑重复的代码是NOP  就足够了,
编辑上看上去也就是几行的样子,实际家用电脑在编译生成单片机的实际执行码的时候,会自动添加500行NOP指令,单片机里面的程序存储空间,也是相应的增加等量500行代码的空间,那是一点也不能节约出来的。

一句话:伪指令和我们此前讲的 单引号 ’ 后面的程序注释类似,共同点是都不被单片机执行,也不会占用单片机内部的程序存储资源,都是帮助人们阅读和编写的方便。不同点是:伪指令要干预家用电脑对源程序的编译,而单引号则不会。
由此看,初学入门不宜在伪指令上徘徊,老手则是善于运用伪指令图个编程快捷简便。

下面我们编写我们的中断例子,并且作为文本文件来处理看待。汇编语言主程序文件的扩展名称,是汇编系统已经规定好了的,必须使用  *.ASM  
例如:可以为: Shan_LED.ASM
用记事本新建一个文件,文件名称请使用例子   Shan_LED.ASM         文件内容如下

BeijiaShu      EQU        020H           '被加数         
JiaShu          EQU        021H           '加数
HE1             EQU        022H           '第一算式的和
HE2             EQU        023H           '第二算式的和
  

尽管如此,初学者,有四个伪指令需要认识,一个是EQU 已经认识过了。如果需要的 EQU 的行很多,例如我们的主程序中要用到 被加数、加数、计算结果的和   以及第一个算式的计算结果寄存 以及第二个算式的计算结果暂存:


那么,下一步,就是要核计整个程序的结构,如果从程序的用途属性,程序存储区域等角度来看,存储来区分一个典型的程序结构例子要包含主程序,子程序,中断子程序,和伪指令说明程序

以往教材,在教导程序结构的时候不是这么分类,而是大谈特谈什么循环结构,分支结构,递归结构,函数调用等等,先把学生搞晕再说,我认为那些属于程序技巧,是用,是末,理应排在以后的技巧升级后去研究。按照上述分类才是程序之本体,是入门的必然门径。
回复 支持 反对

使用道具 举报

     
发表于 2012-6-12 23:39:30 | 显示全部楼层
我一直在等另外一只靴子落地.
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2012-6-14 13:18:43 | 显示全部楼层
本帖最后由 崂山 于 2012-6-14 22:04 编辑

有四个伪指令需要认识的,我们已经学会一个 EQU,另外3个随着我们讲解这个中断例子添加。再看看  ORG 伪指令


       ORG         00H              '这是个伪指令,强调以下的源程序代码在存储到单片机的时候,
                                           '被存储在单片机程序存储器的    00H位置,也就是开始的位置

       NOP                             '这个才是真实的第一条可执行单片机指令,它被存储在程序存储器的 0000H位置            
       NOP                             '该指令没有用ORG指令规定位置,只好按照默认的顺序   被存储在     0001H
       GOTO      MAIN             '顺序存储位置  002H     无条件挑转到标号 MAIN的地方。

                                           '0003H这个地方没有任何语句,是个空洞,不被执行
                                           '空洞在家用电脑编译器编译的时候,实际上也会被给出一个特定的数据存储到0003H
                                           '这个特定数据是什么是无所谓的,不同厂家的编译器会给不同的特定数
                                        '特定数例如:NOP  MOVLW等一般为可执行数据,以免万一单片机误入空洞,也能工作,不出错        
       ORG         04H               
       GOTO    INTSRV           '由于上邻的ORG  04H的存在,该句会被存储到程序空间  0004H , 无条件转向标号   INTSRV
                                          
   
       NOP                             '按照默认顺序编译存储到  0005H   
       NOP                              '按照默认顺序编译存储   直到遇到下一个ORG命令,才会打破顺序     
      

学会ORG命令以后,就可以把整个源程序安排到单片机的程序存储器位置上,我们习惯叫做程序存储器地址。PIC12F509的片内程序存储器只有1024个单元行,地址从  0000H ---- 03FF H        而PIC16C74的片内程序存储器有4096个单元行。


整个程序存储器 有几个位置(地址)需要特别介绍,那就是复位地址0000H          和  中断入口地址  0004H。

0000H是 PIC单片机程序存储器的第一行,通电后首先执行这一行的指令。等于是单片机工作的开始位置。
通电后后也许需要单片机多次重新开始工作,例如一台电子称通电以后,可能需要称若干次物品的重量,那么,每换一次物品,单片机就需要重新回到 0000 H这个指令上来,开始新一轮的测量。只要单片机的指令,回到了 0000 H, 我们就成为单片机复位。

中断入口地址是怎么回事情呢?
原来啊,我们的主程序和调用的子程序已经很完美了,如果小孩子不敲门,或者在本例子里 那个键盘永远也不按下的话,是不会发生中断的,我们的程序也就不会跳出我们事先设计的主程序和子程序那些事情。

可是,一旦发生了按键事件,此时程序会暂时记住当前位置,转而去进行中断服务,去哪里服务呢?就是强行把程序指向 0004H  这个特殊地址,然后从0004 H开始进行中断的服务处理,因此我们设计的中断撒盐 或者开关LED灯的一些程序,就必须从0004H这个位置开始。因此  0004H就叫做中断入口     或者叫中断入口地址。

不同型号的单片机中断入口地址不一定都是 0004H, 就我们的例子PIC16C74是这样的,并且就这一个入口,因此中断程序较简单,而别的型号则不一定,需要查手册,如  PIC18F452就有两个中断入口,地址0008 H  以及 0018H     
(待续)
回复 支持 反对

使用道具 举报

     
发表于 2012-6-17 12:13:40 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2024-5-7 22:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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