找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2836|回复: 3
打印 上一主题 下一主题
收起左侧

单片机流水灯的子程序调用问题

[复制链接]
跳转到指定楼层
楼主
编好了一个控制流水灯的程序,思路是在没有开关闭合的时候P1的灯是流水灯状态,如果开关闭合,控制P1处的灯以两种不同的模式交替点亮,
这个程序在keil的编译中没有错误,但是在Proteus仿真中,我发现P1的灯并不会对按键有反应,始终保持流水灯的状态,就算是长时间保持开关闭合,也并不会发生P1口的灯改变闪烁模式的情况,这个问题困扰了我很长时间,我认为既然开关按下,在if中就可以根据P3.3,P3.2口的状态进行相应的函数调用,但是在仿真中这没有发生,谁知道是为什么吗?


单片机源程序如下:
  1. #include<reg51.h>//头文件
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. void delay(unsigned int i)//控制灯亮时间的延时函数
  5. {
  6. uchar t;
  7. while(i--)
  8. {
  9.   for(t=0;t<120;t++);
  10. }
  11. }
  12. void light_0()//控制灯亮的第一种模式
  13. {
  14. uchar m;
  15. for(m=0;m<5;m++)
  16. {
  17.   P1=0x0f;//P1口高四位灯亮
  18.   delay(500);
  19.   P1=0xf0;//p1口第四位灯亮
  20.   delay(500);
  21. }
  22. }
  23. void light_1()//灯亮的第二种模式
  24. {
  25. uchar n;
  26. for(n=0;n<5;n++)
  27. {
  28.   P1=0xff;//P1口全为高电平,灯灭
  29.   delay(500);
  30.   P1=0x00;//P1口全为低电平,灯亮
  31.   delay(500);
  32. }
  33. }
  34. void main()//主程序
  35. {
  36. uchar temp_0,temp_1;
  37. P1=0xfe;
  38. while(1)
  39. {
  40.   temp_0=P3&0x40;//将P3.2口的电位值赋给temp_0
  41.   temp_1=P3&0x80;//将P3.3口的电位值赋给temp_1
  42.   P1=_crol_(P1,1);循环左移
  43.   delay(500);//保持灯亮
  44.   if(temp_0==0)//判断P3.2口的电位大小
  45.   light_0();//如果是低电平,执行灯亮模式一的函数
  46.   if(temp_1==0)//检查P3.3口的电平
  47.   light_1();//如果P3.3口是低电平,执行灯亮模式二的函数
  48.   
  49. }
  50. }  
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2018-4-10 20:44 | 只看该作者
你把赋值写错了,不过这个程序还有问题,切换显示模式后恢复不了原来流水灯模式,因为P1状态变化了。
temp_0=P3&0x04;//将P3.2口的电位值赋给temp_0
temp_1=P3&0x08;//将P3.3口的电位值赋给temp_1
回复

使用道具 举报

板凳
ID:303665 发表于 2018-4-11 08:59 | 只看该作者
wulin 发表于 2018-4-10 20:44
你把赋值写错了,不过这个程序还有问题,切换显示模式后恢复不了原来流水灯模式,因为P1状态变化了。
temp ...

还要把P1=0xfe;加到while里面去
回复

使用道具 举报

地板
ID:301728 发表于 2018-4-11 16:44 | 只看该作者
疏忽了,多谢各位!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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