找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1682|回复: 16
收起左侧

自学单片机遇到一些程序问题,求分析解决

[复制链接]
回帖奖励 90 黑币 回复本帖可获得 5 黑币奖励! 每人限 1 次
ID:505803 发表于 2019-4-16 17:59 | 显示全部楼层 |阅读模式
最近在自学STC89C52单片机,也看了许多的老师的讲解,有些问题没有弄明白,向大家求教一下。

外部中断,我明白有两种触发方式,一种电平触发,一种下降沿触发,也看了单片机的原理图。

我理解的外部中断,电平触发就是一个按键或是什么东西,在单片机引脚上输入了一个电平,这个电平一直存在使其一直保持中断,松开按键就外部中断停止了,
下沿触发像是在引脚上输入一个电平的信号,就像一个波形一样,触发不需要保持住,单片机检测到这个波形了就触发外部中断。

就一点不明白,外部中断一定要接在INT0,INT1引脚上才可以吗?别的端口不可以吗?那如果需要用传感器控制的外部中断多几个,好像局限性很大
我在想,
比如用P2.0引脚
让单片机一直扫描P2.0引脚的状态,有电平变化了就停止程序,没变化继续执行程序。这样好像也和INT0,INT1这些引脚功能一样!
不知道我说的对不对,刚刚接触单片机,以前的知识早忘完了。

还有定时器,感觉怎么这么复杂,可以一会语句循环,一会定时器控制,都不知道到底该用哪种了。
到现在定时器都没弄懂。

程序方面,看了许多的例程,里面的代码,最后感觉有很多的相似,就好像有固定的框框,写程序的时候只需要朝里面套自己的东西一样。
但还是许多代码看不明白,有的头文件我抄上来,编译直接出错,把它删掉就行了,单片机也照样的执行,搞不明白是为什么。

最后希望各位大佬帮个忙,这两天在做个小车,程序老是写不好。不是这里出错就是那里出错。希望有大佬帮帮忙,帮我写一下,这样我能根据我自己的情况,明白的更快一点。

我自己写的哪个错漏百出的程序就不贴上来给大家献丑了

下边是我定义的一些引脚,如果有不对的请大佬们帮忙指出来,谢谢

我按照我想要的程序的流程写出来,请大佬们帮忙填充一下,如果可能请释义一下,越详细越好,以给我们这些小白一些启示,谢谢。

单片机源程序如下:
  1. #include<reg52.h>       //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  2. #define uchar unsigned char    //这两句的具体意思还没有搞懂,但知道是有关函数的
  3. #define uint  unsigned int
  4. sbit YB = P2^5;        //   定义遥控器 B 键的引脚,B键为-正启动-按键,输入高电平
  5. sbit YC = P2^6;       //    定义遥控器 C 键的引脚, C键为-倒启动-按键,输入高电平
  6. sbit YD = P3^2;       //    定义遥控器 D 键的引脚, D键为-紧急停止,     输入高电平
  7.                              //     遥控器为自锁模式,按下按键之后,遥控器接收板持续输出高电平
  8.                             //      再次按下遥控器相应按键,停止输出高电平
  9.                                     
  10.              //这个遥控器接收板只能输出高电平,                                                 //如果这几个引脚的位置不行那么应该用哪几个引脚?                     
  11.          //或者有什么办法能够转换一下这个电平信号,把它从高转到低

  12. sbit JDQ1 = P1^1; //  定义继电器 1号 的引脚。   |  低电平  触发
  13. sbit JDQ2 = P1^2;  //  定义继电器 2号 的引脚。  |
  14. sbit JDQ3 = P1^3;  //  定义继电器 3号 的引脚。  
  15. sbit JDQ4 = P1^4   //  定义继电器 4号 的引脚。   
  16. sbit JDQ5 = P1^5;  //  定义继电器 5号 的引脚。
  17. sbit JDQ6 = P1^6;  //   定义继电器 6号 的引脚。
  18. sbit JDQ7 = P2^0;   //  定义继电器 7号 的引脚。
  19. sbit JDQ8 = P2^1;   //  定义继电器 8号 的引脚。
  20. sbit NPN1 = P2^2;      //定义NPN开关 1号 的信号输入引脚。输入低电平有效
  21. sbit NPN2 = P2^3;    //定义NPN开关 2号 的信号输入引脚。输入低电平有效
  22.                               //NPN开关为 常开,
  23.                               //NPN接近传感器---无障碍物--无检测信号时输出高电平,
  24.                              //NPN接近传感器---有障碍物--有检测信号时输出低电平。
  25. sbit HW = P2^4;          //定义红外避障开关的信号输入引脚。
  26.                                  //红外避障开关--无障碍物---无检测信号时输出高电平,
  27.                                 //红外避障开关--有障碍物---有检测信号时输出低电平。
  28.                               //      首先我想应该是将各个引脚的初始状态置高或低吧?
  29.                              //       这样以便引脚输出相应的状态
  30.                              //                            程序流程       正序
  31.                            //   1               P2^5    接收    高电平    信号输入,开始进入程序      
  32.                          //   2                P1^1  , P1^4  输出低电平信号--小车跑4秒 --停止,
  33.                              //                      停顿2秒
  34.                        //    3                P1^2  , P1^3  输出低电平信号 --小车跑18秒---停止,
  35.                           //                         停顿2秒
  36.                     //     4                 P1^2  , P1^4 , P1^5 输出低电平信号--小车跑2秒--停止,
  37.                         //                          停顿2秒
  38.                    //     5                   P1^2 ,  P1^3 输出低电平信号---小车跑10秒---停止,
  39.                       //                          停顿2秒
  40.                 //     6                   P2^0 输出低电平信号-------P2^2  NPN输入低电平--停止。
  41.                      //                           停顿2秒
  42.                //     7       P1^2  , P1^3  输出低电平信号-----P2^4红外避障输入低电平,停止。
  43.              //                                 完
  44.                                 
  45.              //这里边的P3^2起到中断的作用,按下遥控器D,P3^2引脚接收高电平
  46.              //程序暂停,因为接收板为自锁,所以会持续的输出高电平,直到再次按下,                                                        //P3^2不再输入高电平,程序从暂停之前那一步继续执行下去.
  47.                            
  48.            //           程序流程         倒序    按下C键 P2^6  倒序
  49.            //因为是程序固定的所以倒序也就是把程序倒个方向,不知道这个算不算两个程序,
复制代码

     这个小车的效果,就是按下遥控器B ,小车会沿着固定的一条框框道路行走,然后小车上边的一个小电机会做一些动作。按下遥控器C小车就会倒着走回来,这个对于各位大佬应该非常容易,请帮帮我,最好能给我释义一下,你们是怎么定的时间,时间是怎么样计算出来的   ,  怎么外部中断的,特别是这两个,非常重要,希望能够在大佬们的帮助下弄懂这两个的用法

万分感谢,

从上个月才开始自己学习单片机,因为时间的关系,之前学习过的一些知识都已经忘记完了,但现在慢慢的看一些视频,各位老师的讲解。各位大佬的发帖,回复,给了我很多的启发和帮助。也开始觉的单片机挺有趣,这几天老是想着程序该怎么设计,需要哪些东西,等等,感觉有点入迷了,不知道快入门了吧。

非常感谢有51黑这样一个大平台,让大家能够互相帮助着在自己喜欢或者赖以生活的道路上走着。
愿大家永远不忘初心,继续前行。

设置有回复奖励哟,希望各位大佬们赠人玫瑰,手有余香。

附上我用的89C52RC单片机单片机的原理图
2222222.PNG 4444444.PNG 11111111.PNG 333333.PNG
回复

使用道具 举报

ID:310519 发表于 2019-4-16 20:49 | 显示全部楼层
中断和定时正是单片机的“精要”啊。

回复

使用道具 举报

ID:164602 发表于 2019-4-17 08:12 | 显示全部楼层
只说一点:外部中断的IO口 1.jpg

外部中断的IO口,只能是P32、P33,不能是其它的。因为这是由单片机的内部硬件电路决定的,不是由软件可以决定的。
如果你使用中断,就只能是对应的IO口。
另外,中断源也是由单片机电路决定的,看手册就知道。
回复

使用道具 举报

ID:451718 发表于 2019-4-17 08:51 | 显示全部楼层
定时器是单片机内部的硬件,而中断只是单片机的一种机制,在使用计时器的时候,你可以用中断机制,也可以不用。 有个教程推荐给你, 用一天的时间就可以读完这个教程,一定对你有很大的帮助。
下载地址:http://www.51hei.com/bbs/dpj-26246-1.html
回复

使用道具 举报

ID:149799 发表于 2019-4-17 09:41 | 显示全部楼层
总工讲解的很详细了
回复

使用道具 举报

ID:123289 发表于 2019-4-17 11:02 | 显示全部楼层
“我理解的外部中断,电平触发就是一个按键或是什么东西,在单片机引脚上输入了一个电平,这个电平一直存在使其一直保持中断,松开按键就外部中断停止了,
下沿触发像是在引脚上输入一个电平的信号,就像一个波形一样,触发不需要保持住,单片机检测到这个波形了就触发外部中断。”
你说对了一半:准确地说,不是“就中断了”,而是产生中断申请标记位了,离中断还差一步:你让不让它中断!
回复

使用道具 举报

ID:123289 发表于 2019-4-17 11:05 | 显示全部楼层
“就一点不明白,外部中断一定要接在INT0,INT1引脚上才可以吗?别的端口不可以吗?那如果需要用传感器控制的外部中断多几个,好像局限性很大”
你的想法,设计大师们已经考虑到了:后期改进型51计算机的确可以在别的端口中断,如P2.0。STC的机型就是你想像的。传统51没有。
回复

使用道具 举报

ID:505803 发表于 2019-4-17 11:18 | 显示全部楼层
那想是有3 个4个的中断源怎么办?换板子吗?
回复

使用道具 举报

ID:505803 发表于 2019-4-17 11:25 | 显示全部楼层
robinsonlin 发表于 2019-4-17 08:51
定时器是单片机内部的硬件,而中断只是单片机的一种机制,在使用计时器的时候,你可以用中断机制,也可以不 ...

这个视频就是我正在看的,宋老师讲的很好,我也在认真学习,有的视频会反反复复的看,了解他讲的一些知识点。
另外,大哥我想问一下,我想一步一步的把我上边的这个程序给推敲出来,这样更能加深我的理解,
就是单片机怎么接受高电平的输入,现在这个遥控接收表只能输出高电平,有什么办法在程序上调整或者是硬件上加什么东西,
谢谢大哥的回复
回复

使用道具 举报

ID:123289 发表于 2019-4-17 11:29 | 显示全部楼层
“还有定时器,感觉怎么这么复杂,可以一会语句循环,一会定时器控制,都不知道到底该用哪种了。
到现在定时器都没弄懂。”
它就是个计数器,即然是计数器就有以下:
1、输入时钟脉冲CLK,来一个计一次。如果CLK间隔很准时(来自晶振),自然就可以用来“定时”,这时可以美其名曰“定时器”了;如果间隔很随机(来自引脚的外接脉冲),就只能数数脉冲的个数,就只能是“计数器”了。如果切断(TR=0)它,当然就停止计数了;如果接通它(TR=1),就又计数了。这样说不就知道“定时”、“计数”、“起动”、“停止”了吗。
2、是计数器就有位数限制,计满会发生什么?会输出一个脉冲至中断标记位。这就是“定时器中断”的道理。
3、这个计数器是可以预置转数的,在任何时候你都可以预置数,你瞎置它就瞎数,为了有规律,你通常会选择一个特定的时刻置数,当然最有特点的时刻就是它计满的时候!例如:65536计满,计满后你置数据60000,这样它就每计5536次发出一次中断申请。如果你不置数,它就每65536次发出一次中断申请。
4、中断申请发出后,如果没有被清除(用其它方式清除),那么再次申请就没有意义了。这就是中断响应后为什么要复位中断标记的道理,当然有些机型是硬件复位的,即一响应就自动清除它,也就不要你操心了。
回复

使用道具 举报

ID:286252 发表于 2019-4-17 11:32 | 显示全部楼层
51单片机就是这样,它只有两个外部中断输入口,如果你中断输入口不够,你可以使用与非门连接(将普通的IO口连接在门电路的输入口,门电路的输出口接单片机中断口)。
回复

使用道具 举报

ID:123289 发表于 2019-4-17 11:35 | 显示全部楼层
“程序方面,看了许多的例程,里面的代码,最后感觉有很多的相似,就好像有固定的框框,写程序的时候只需要朝里面套自己的东西一样。”
写程序很容易,就那么几个句子抄抄。但架构程序,是需要相当的智慧!!!脑子不太好使用的,不好学这一行。你必须学会构建程序,第一步就是必须会画流程图,流程图说得通道理,达得成目的。再依流程图写程序,余下的就是抄抄句子了。
看别人的程序,要点是了解它的构思、目的、达成目的所采用的方式。语句不重要!
回复

使用道具 举报

ID:123289 发表于 2019-4-17 11:39 | 显示全部楼层
你留的不是程序,只是定义接口接的是什么东西。
回复

使用道具 举报

ID:123289 发表于 2019-4-17 11:41 | 显示全部楼层
我的分很多,你就留着用吧,不别给我了。不够用我可以赞助你一点。
回复

使用道具 举报

ID:123289 发表于 2019-4-17 11:49 | 显示全部楼层
你的原理图上可以省去四个元件:D1、C3、C7、Y1。
D1省去后:短接。
C3、C7、Y1省去后,从U2-8引一条线至OSCIN。不过CPU的主频就统一成12M了,这一点软件上是可以克服的(相关时序的参数调整一下)。
回复

使用道具 举报

ID:123289 发表于 2019-4-17 11:50 | 显示全部楼层
如果离我近,不出一周教会你单片机。
回复

使用道具 举报

ID:505803 发表于 2019-4-17 15:05 | 显示全部楼层
yzwzfyz 发表于 2019-4-17 11:29
“还有定时器,感觉怎么这么复杂,可以一会语句循环,一会定时器控制,都不知道到底该用哪种了。
到现在定 ...

大哥您好
这个定时器,听了一些视频资料的讲解,大概知道它是什么原理,但就是具体的该怎么用还不太清楚。
程序方面流程图画的有,都说的通。就是不知道该如何下手。
看一些例程,自己分析,就是先,头文件,定义引脚,然后程序的流程。引用的函数。等。自己写的时候就完全不知道该怎么写了。之前也按照流程写过了,当时想的是。我需要的程序就和点亮LED灯一样,不过是时间不一样,但就是时间不知道该如何计算,怎么样才能一会定时4秒 一会定时10秒,
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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