• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

我今年52岁学了十天单片机,有个问题请各位老师指教谢了.

各位老师好:硬件学完了,问题不大.软件也学完了(好几个通宵呢)遇到麻凡了.各个部分学完了(主程序.子程序.寄存器定意.I/O口设值.AD设值.时钟设值.)我要想编个程序试试了,可脑子乱了这么多程序部分哪个在前哪个在后分不清了.是主程序在前还是各种定意在前应该是先运行主程序,我又觉着不对不定意主程序砸运行一头雾水,请指教谢了.
全部回复(103)
正序查看
倒序查看
zbdxdxkj
LV.4
2
2007-01-20 20:29
比如说程序编好了,单片机上电运行.在主程序不运行能定意I/O口和其他的状态吗?搞不懂.
0
回复
2007-01-20 21:36
@zbdxdxkj
比如说程序编好了,单片机上电运行.在主程序不运行能定意I/O口和其他的状态吗?搞不懂.
定义I/O就是在主程序的开头,一些特殊功能寄存器也在开头定义,接下来走主程序的其它东西,
0
回复
zbdxdxkj
LV.4
4
2007-01-20 22:20
@shenyf1979
定义I/O就是在主程序的开头,一些特殊功能寄存器也在开头定义,接下来走主程序的其它东西,
您好:谢谢.再请教个问题.在AD转换模试下,要同时设两个输入端(两个引脚)是不是相当于运算放大器的一正一负两个输入端.
0
回复
sdjufeng
LV.6
5
2007-01-21 10:24
@zbdxdxkj
您好:谢谢.再请教个问题.在AD转换模试下,要同时设两个输入端(两个引脚)是不是相当于运算放大器的一正一负两个输入端.
这要看你用的单片机了,有的单片机输入是单端的,有的是既可以单端也可以双端,由sfr的设置来决定.
另外,不知道你编程序用的是汇编还是C.
0
回复
zbdxdxkj
LV.4
6
2007-01-21 19:13
@sdjufeng
这要看你用的单片机了,有的单片机输入是单端的,有的是既可以单端也可以双端,由sfr的设置来决定.另外,不知道你编程序用的是汇编还是C.
您好:我才学几天没学过C语言用的是汇编语言,芯片用的是中颖的69p42(我有仿真器)
0
回复
zbdxdxkj
LV.4
7
2007-01-21 19:31
@shenyf1979
定义I/O就是在主程序的开头,一些特殊功能寄存器也在开头定义,接下来走主程序的其它东西,
我还是不太懂,能把这几部分(系统寄存器定义.用户寄存器定义.I/O口定义.模数转换定义.中断程序.主程序.子程序.上电程序)排一下次序吗?谢了.上电PC从地址0000开始有4个中断这里不能写主程序是吗?
0
回复
2007-01-21 20:22
@zbdxdxkj
我还是不太懂,能把这几部分(系统寄存器定义.用户寄存器定义.I/O口定义.模数转换定义.中断程序.主程序.子程序.上电程序)排一下次序吗?谢了.上电PC从地址0000开始有4个中断这里不能写主程序是吗?
你到网上找个例程看看,其实不用想那么多,先做个简单的程序走走看,以后再把其它功能一个一个加上去
0
回复
zbdxdxkj
LV.4
9
2007-01-21 21:15
@shenyf1979
你到网上找个例程看看,其实不用想那么多,先做个简单的程序走走看,以后再把其它功能一个一个加上去
有好多东西看是明白了,真做起来就不知从哪下手,有些细节.逻缉又似懂非懂.命令具体还得现查没记住.看来我是急了点谢谢指教了.要是和你在一个城市就好了,可以登门拜访并请你喝酒.
0
回复
zbdxdxkj
LV.4
10
2007-01-21 21:22
@shenyf1979
你到网上找个例程看看,其实不用想那么多,先做个简单的程序走走看,以后再把其它功能一个一个加上去
能交个朋友吗,留个信箱就可.我的信箱是:zbdxdxkj@126.com
0
回复
wangzai_he
LV.3
11
2007-01-22 09:14
@zbdxdxkj
能交个朋友吗,留个信箱就可.我的信箱是:zbdxdxkj@126.com
刚写程序是会有一点乱,但写好一个非常简单的程序了就会懂了,我的邮箱是wangzai_he@126.com
0
回复
zbdxdxkj
LV.4
12
2007-01-22 21:39
@wangzai_he
刚写程序是会有一点乱,但写好一个非常简单的程序了就会懂了,我的邮箱是wangzai_he@126.com
我老是把rom和ram地址给闹昏了,真头疼.越学越麻繁糊独.
0
回复
shenyf1979
LV.5
13
2007-01-22 21:41
@zbdxdxkj
能交个朋友吗,留个信箱就可.我的信箱是:zbdxdxkj@126.com
我帮不上太大的忙,我汇编学的PIC,51系列的我都用C写的.
0
回复
2007-01-23 08:52
@zbdxdxkj
我老是把rom和ram地址给闹昏了,真头疼.越学越麻繁糊独.
真实年龄52岁吗?
0
回复
zbdxdxkj
LV.4
15
2007-01-23 20:57
@我爱电源网
真实年龄52岁吗?
1954年属马的自己算吧.
0
回复
zbdxdxkj
LV.4
16
2007-01-23 20:59
@shenyf1979
我帮不上太大的忙,我汇编学的PIC,51系列的我都用C写的.
已经帮了不少了,非常感谢.
0
回复
njyd
LV.8
17
2007-01-23 21:01
@zbdxdxkj
我还是不太懂,能把这几部分(系统寄存器定义.用户寄存器定义.I/O口定义.模数转换定义.中断程序.主程序.子程序.上电程序)排一下次序吗?谢了.上电PC从地址0000开始有4个中断这里不能写主程序是吗?
  地址0000应该是个转移指令,目的就是跳开后面的中断入口.如果不使用中断也可以不用转移直接占用中断入口地址.
  同样中断入口地址也是转移指令.中断入口地址的转移指令需要用伪指令“ORG”来指定写在ROM中的确实地址.
0
回复
zbdxdxkj
LV.4
18
2007-01-23 21:08
@njyd
  地址0000应该是个转移指令,目的就是跳开后面的中断入口.如果不使用中断也可以不用转移直接占用中断入口地址.  同样中断入口地址也是转移指令.中断入口地址的转移指令需要用伪指令“ORG”来指定写在ROM中的确实地址.
您好;寄存器.I/O口.模数转换设制是在ORG之前还是之后.
0
回复
zbdxdxkj
LV.4
19
2007-01-23 21:58
各位老师好:我想了好久终于知到这个问题怎样问了,
   寄存器定意.I/O口.模数转换命令是不是应该写在ROM中是在ORG(主程序之前吗?请指教谢了.
0
回复
sdjufeng
LV.6
20
2007-01-24 07:57
@zbdxdxkj
各位老师好:我想了好久终于知到这个问题怎样问了,  寄存器定意.I/O口.模数转换命令是不是应该写在ROM中是在ORG(主程序之前吗?请指教谢了.
是的,另外,已经预定义过的就不必再次定义.
比如:
$mod51     ;或者#include 等,以编译器不同而不同
Counter   data   35H
Flagreg   data   20H
……
MyBit0    bit    00H
MyBit1    bit    Flagreg.1  ;即01H位
……
MyConst   equ    126
……

           org     0H
          jmp     Start
          org     03H
          jmp     IntX0
……
0
回复
2007-01-24 10:21
@zbdxdxkj
1954年属马的自己算吧.
向你学习!
0
回复
zbdxdxkj
LV.4
22
2007-01-24 19:25
@sdjufeng
是的,另外,已经预定义过的就不必再次定义.比如:$mod51    ;或者#include等,以编译器不同而不同Counter  data  35HFlagreg  data  20H……MyBit0    bit    00HMyBit1    bit    Flagreg.1  ;即01H位……MyConst  equ    126……          org    0H          jmp    Start          org    03H          jmp    IntX0……
您好:ORG之前的各种设制命令占ROM地址吗?要是占的话(ORG从0000H开始)ORG之前的命令占哪里?(PC指针不是从零开始吗)那些设制怎会操做.我糊涂请指教.学了十几天了想写程序还不行.
0
回复
njyd
LV.8
23
2007-01-24 21:55
@zbdxdxkj
各位老师好:我想了好久终于知到这个问题怎样问了,  寄存器定意.I/O口.模数转换命令是不是应该写在ROM中是在ORG(主程序之前吗?请指教谢了.
  ORG是指定编译出的程序放在ROM什么位置,可以用在任何地方,所以无所谓用在前后.
  程序的第一句如果没有ORG编译时就放在地址0000,所以第一句可以不用“ORG 00”
  定义I/O口、外设的指令也可以放在任何位置,但一定要在使用这些I/O口、外设的程序以前.这个以前不是编程序的行数前,而是程序运行先后的前面.但一般放在在主程序一开始,需要的话在程序运行中间也可以改变设置.
  汇编语言分“指令”和“伪指令”,指令在编译后都产生目标程序,这些目标程序就被放在ROM中;伪指令不产生目标程序,只是告诉编译程序去怎么运作,比如说ORG就是告诉编译程序下面紧接的程序从ROM什么地址开始,(放在ROM中什么位置).所以目标程序反编译后能看到所有原程序的指令,但原程序中的伪指令反编译后就看不到.
0
回复
sdjufeng
LV.6
24
2007-01-24 22:01
@zbdxdxkj
您好:ORG之前的各种设制命令占ROM地址吗?要是占的话(ORG从0000H开始)ORG之前的命令占哪里?(PC指针不是从零开始吗)那些设制怎会操做.我糊涂请指教.学了十几天了想写程序还不行.
njyd说得很对.
伪指令不产生目标代码,哪怕把它放到程序的中间.
0
回复
zbdxdxkj
LV.4
25
2007-01-25 06:05
@njyd
  ORG是指定编译出的程序放在ROM什么位置,可以用在任何地方,所以无所谓用在前后.  程序的第一句如果没有ORG编译时就放在地址0000,所以第一句可以不用“ORG00”  定义I/O口、外设的指令也可以放在任何位置,但一定要在使用这些I/O口、外设的程序以前.这个以前不是编程序的行数前,而是程序运行先后的前面.但一般放在在主程序一开始,需要的话在程序运行中间也可以改变设置.  汇编语言分“指令”和“伪指令”,指令在编译后都产生目标程序,这些目标程序就被放在ROM中;伪指令不产生目标程序,只是告诉编译程序去怎么运作,比如说ORG就是告诉编译程序下面紧接的程序从ROM什么地址开始,(放在ROM中什么位置).所以目标程序反编译后能看到所有原程序的指令,但原程序中的伪指令反编译后就看不到.
讲的太好了,我明白了很多.谢谢您!我在中断方面还有点问题.中断我知道,可单片机的一个脚我设成输入时(比如说下降沿响应中断)ROM中的程序怎样响应(比如说我想要指定的一输出脚由1变0)响应的是PC指的地址呢还是命令的位呢.我想这方面搞明白了就可是编程了.
0
回复
zyqag
LV.3
26
2007-01-25 09:53
@zbdxdxkj
讲的太好了,我明白了很多.谢谢您!我在中断方面还有点问题.中断我知道,可单片机的一个脚我设成输入时(比如说下降沿响应中断)ROM中的程序怎样响应(比如说我想要指定的一输出脚由1变0)响应的是PC指的地址呢还是命令的位呢.我想这方面搞明白了就可是编程了.
楼主,
  我有个同事,1953年出生的.他是2001年后,才学单片机.湖北人
近几年,他已经很熟悉,MCU开发,例如电饭煲,倒车雷达,温度控制板,棉花湿度仪.....
  非常在行,他原来是,技校毕业
  我本身,也是32岁才,真正编程.许多人说,30岁后,不宜从事软件编程.
我觉得,不妥.俺,现在连复杂的,小波变换及其应用,DSP常用算法,也得心就手.我已36岁,这几年,才转行到DSP,MCU 编程.              
  以前,我是画电路板的,PROTEL99,仅仅是硬件工程师
  不过,现在算是DSP,MCU 行家
  一起努力
0
回复
2007-01-25 10:31
@zbdxdxkj
讲的太好了,我明白了很多.谢谢您!我在中断方面还有点问题.中断我知道,可单片机的一个脚我设成输入时(比如说下降沿响应中断)ROM中的程序怎样响应(比如说我想要指定的一输出脚由1变0)响应的是PC指的地址呢还是命令的位呢.我想这方面搞明白了就可是编程了.
中断是单片机在执行某个进程时,由于内、外某个中断源向单片机发出中断请求信号,要求单片机中断当前进程而转去执行相应的线程,待处理完毕中断线程后,再返回继续执行原来进程.
当设置外部中断的信号来时(在中断引脚发生了下降沿),先由硬件完成中断标志位的变化.在由硬件完成PC指针的入栈,记录被中断进程的的地址.
在由硬件完成PC指针装入中断线程的入口地址.
PC指针装入中断线程入口地址后,单片机开始执行中断线程(指定一个输出脚由1变0).由于中断线程中可能用到被中断进程的资源,所以要先保护原进程的资源状态如 ACC,PSW 等等,当中断线程执行完成后在恢复原进程的资源状态.我的理解就是这样的说的不好也别怪我啦!相互学习啦!
52岁还在学习!这就够我学的啦!向你学习!
0
回复
njyd
LV.8
28
2007-01-25 21:14
@我爱电源网
中断是单片机在执行某个进程时,由于内、外某个中断源向单片机发出中断请求信号,要求单片机中断当前进程而转去执行相应的线程,待处理完毕中断线程后,再返回继续执行原来进程.当设置外部中断的信号来时(在中断引脚发生了下降沿),先由硬件完成中断标志位的变化.在由硬件完成PC指针的入栈,记录被中断进程的的地址.在由硬件完成PC指针装入中断线程的入口地址.PC指针装入中断线程入口地址后,单片机开始执行中断线程(指定一个输出脚由1变0).由于中断线程中可能用到被中断进程的资源,所以要先保护原进程的资源状态如ACC,PSW等等,当中断线程执行完成后在恢复原进程的资源状态.我的理解就是这样的说的不好也别怪我啦!相互学习啦!52岁还在学习!这就够我学的啦!向你学习!
  你说的太复杂了.简单点就是:
  中断响应时,程序会自动跳到ROM开头的几个中断地址之一,(具体要看什么中断,书上能查到),这几个地址应该写上转移指令(指向你写的中断处理程序),程序到这几运行后就会转移到你写的你写的中断处理程序运行.
  中断时单片机会自动记下在什么地址响应中断的,中断处理程序最后一句“RETI”(没记错吧?)就是告诉单片机返回到响应中断时记下的地方.
  中断处理程序一般要保护现场,就是保存下响应中断时正在使用并且后面还要使用的一些寄存器内容,这个问题只要把堆栈搞懂就是小菜一碟.
  试验中断可以把断点设在中断处理程序内,运行中在此停下就说明发生了中断.
  或者在中断处理程序内进行写RAM的操作,运行后这个RAM地址被写入就说明发生了中断.
  初学者对中断是个难点,可以先编些简单的程序试验,只要能产生你需要的中断后面的就好办了.
  自学单片机关键就在多试,有些不懂的地方编些小程序多试试就能搞通.当然试硬件中断需要有相应的硬件,限可以先试定时器中断,这用软件仿真就可以.
0
回复
zbdxdxkj
LV.4
29
2007-01-25 21:26
@zyqag
楼主,  我有个同事,1953年出生的.他是2001年后,才学单片机.湖北人近几年,他已经很熟悉,MCU开发,例如电饭煲,倒车雷达,温度控制板,棉花湿度仪.....  非常在行,他原来是,技校毕业  我本身,也是32岁才,真正编程.许多人说,30岁后,不宜从事软件编程.我觉得,不妥.俺,现在连复杂的,小波变换及其应用,DSP常用算法,也得心就手.我已36岁,这几年,才转行到DSP,MCU编程.                以前,我是画电路板的,PROTEL99,仅仅是硬件工程师  不过,现在算是DSP,MCU行家  一起努力
您讲的太好了,我要非常奴力才行,谢谢鼓力.我正准备学PRTEL99呢,拜你为老师不要推词奥.我买不到有关资料.
0
回复
zbdxdxkj
LV.4
30
2007-01-25 21:33
@njyd
  你说的太复杂了.简单点就是:  中断响应时,程序会自动跳到ROM开头的几个中断地址之一,(具体要看什么中断,书上能查到),这几个地址应该写上转移指令(指向你写的中断处理程序),程序到这几运行后就会转移到你写的你写的中断处理程序运行.  中断时单片机会自动记下在什么地址响应中断的,中断处理程序最后一句“RETI”(没记错吧?)就是告诉单片机返回到响应中断时记下的地方.  中断处理程序一般要保护现场,就是保存下响应中断时正在使用并且后面还要使用的一些寄存器内容,这个问题只要把堆栈搞懂就是小菜一碟.  试验中断可以把断点设在中断处理程序内,运行中在此停下就说明发生了中断.  或者在中断处理程序内进行写RAM的操作,运行后这个RAM地址被写入就说明发生了中断.  初学者对中断是个难点,可以先编些简单的程序试验,只要能产生你需要的中断后面的就好办了.  自学单片机关键就在多试,有些不懂的地方编些小程序多试试就能搞通.当然试硬件中断需要有相应的硬件,限可以先试定时器中断,这用软件仿真就可以.
谢谢您:怎么说呢你讲的很现实,我明白一点就是不管过程如何,目地达到就行.过程以后再说,也可能不说就明白了.哈哈高兴那么多热心人.
0
回复
zbdxdxkj
LV.4
31
2007-01-26 21:11
我有新问体向各位老师请教:1
1.指令和伪指令都要占ROM地址是不是应该避开中断地址?怎样避开.
2.主程序内可以设制I/O口是吗?
3.A/D转换中指定好I/O的寄存器后,I口电压随时改变O口卖宽随之改变这两个寄存器之间交换程序要用循环的吗?谢谢!
0
回复