找回密码
 立即注册

QQ登录

只需一步,快速开始

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

各位大神这个电路图有什么问题吗!实物图不显示数字

[复制链接]
跳转到指定楼层
楼主

单片机源程序如下:
  1. #include <reg51.H>
  2. #include <intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char         //宏定义
  5. /*-----------------------端口命名------------------------*/
  6. sbit rs=P2^0;       //LCD的数据/命令选择端
  7. sbit rw=P2^1;       //LCD的读写选择端
  8. sbit e=P2^2;      //LCD的使能信号端  
  9. /*-------------------------------------------------------*/
  10. /*-----------------------定义参数------------------------*/
  11. uint i,z,count,zhuan,msec;     //定义参数
  12. uchar display[]={" speed=     r/min "};     //定义显示参数 /*-------------------------------------------------------*/
  13. /*-----------------------毫秒延时------------------------*/
  14. void delay(uint ms)
  15. {  
  16. uint i,j;      //为延时引入i,j两参数  
  17. for (j=0;j<ms;j++)     //延时第一循环   
  18. for (i=0;i<120;i++);    //延时第二循环  
  19. }
  20. /*-------------------------------------------------------*/
  21. /*--------------------向LCD1602写命令--------------------*/
  22. void write_command(uchar command)
  23. {
  24. rs=0;       //数据、命令选择端0为命令
  25. rw=0;       //读、写选择端0为写
  26. P0=command;      //向LCD写命令
  27. delay(5);      //稍做延迟,代替检测忙状态  
  28. e=1;      //信号使能端高电平
  29. delay(5);      //稍做延迟,代替检测忙状态  
  30. e=0;      //信号使能端低电平
  31. }
  32. /*-------------------------------------------------------*/
  33. /*--------------------向LCD1602写数据--------------------*/
  34. void write_data(uchar data0)
  35. {
  36. rs=1;       //数据、命令选择端 1为数据
  37. rw=0;       //读、写选择端0为写
  38. P0=data0;      //向LCD写数据
  39. delay(5);      //稍做延迟,代替检测忙状态
  40. e=1;      //信号使能端高电平
  41. delay(5);     //稍做延迟,代替检测忙状态
  42. e=0;      //信号使能端低电平
  43. }
  44. /*-------------------------------------------------------*/
  45. /*-------------------外部中断0计数程序-------------------*/
  46. void counter(void) interrupt 0
  47. {   
  48. EX1=0;       //关外部中断1  
  49. count++;  
  50. if(count==2)      //2次循环为发动机转一圈  
  51. {   
  52. count=1;     //初始化计数   
  53.      z++;      //转圈计数加1
  54.   }      //计数+1  
  55.   EX1=1;       //开外部中断1  
  56.      return;
  57. }
  58. /*-------------------------------------------------------*/
  59. /*------------------------LCD显示------------------------*/
  60. void displaytolcd()
  61. {  
  62.   write_command(0x80);     //向LCD1602写命令80H  
  63.   for (i=0;i<sizeof(display)-1;i++)   //循环要传输的字符个数次,每一次传一个字符  
  64. {   
  65.     write_data(display[i]);   
  66.       delay(5);  
  67.   }
  68. } /*-------------------------------------------------------*/  
  69. /*-----------------内部中断0计时计数程序-----------------*/
  70. void Timer_0(void) interrupt 1
  71. {  
  72.    TH0=0x65;      //50ms定时  
  73.    TL0=0xF3;  
  74.    msec++;  
  75.    if(msec==20)      //50*20=1S  
  76. {   
  77.      displaytolcd();   
  78.      msec=0;   
  79.      zhuan=30*z;   
  80.      z=0;  
  81. }
  82. }
  83. /*-------------------------------------------------------*/
  84. /*----------------------端口初始化-----------------------*/
  85. void int_all()
  86. {  
  87. z=0;       //初始化z的值  
  88. count=0;      //初始化count的值  
  89. zhuan=0;      //初始化转的值  
  90. rw=0;       //选择LCD写数据指令  
  91. delay(15);      //延时15ms  
  92. write_command(0x38);     //向LCD1602写命令38H  
  93. delay(5);      //延时5ms  
  94. write_command(0x0e);     //向LCD1602写命令0EH  
  95. delay(5);      //延时5ms  
  96. write_command(0x06);     //向LCD1602写命令06H
  97. TMOD=0x01;      //内部中断定时器选择  
  98. TH0=0x66;      //50ms定时  
  99. TL0=0x50;  
  100. EA=1;       //开中断总开关  
  101. ET0=1;       //开内部中断0
  102. TR0=1;       //计时器开始工作  
  103. IT0=1;       //外部中断0为下降沿触发  
  104. EX0=1;       //开外部中断0
  105. }
  106. /*-------------------------------------------------------*/
  107. /*-----------------------数据处理------------------------*/
  108. void  disp_count()
  109. {  
  110. display[9]=(zhuan/1000+'0');    //转换转速的千位  
  111. display[10]=(zhuan/100%10+'0');    //转换转速的百位  
  112. display[11]=(zhuan/10%10+'0');    //转换转速的十位   
  113. display[12]=(zhuan%10+'0');    //转换转速的个位
  114. }
  115. /*-------------------------------------------------------*/
  116. /*------------------------主函数-------------------------*/
  117. void main()
  118. {  
  119.    int_all();     //全局初始化  
  120.    while(1)  
  121.   {
  122.    disp_count();     //数据处理
  123.    displaytolcd();     //LCD显示  
  124.   }
  125. }
复制代码



123.png (42.11 KB, 下载次数: 9)

原理图

原理图

PCB.png (58.81 KB, 下载次数: 12)

PCB图

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

使用道具 举报

沙发
ID:468878 发表于 2019-6-5 10:18 | 只看该作者
仿真没啥问题,按道理原理图和程序应该问题不大。你首先排查一下硬件有没有故障。用万用表量量单片机晶振的电压,看看单片机工作没有。有时候设计电路的时候,可以像电脑自检那样,在单片机某个空脚安个发光二极管,程序运行前,让他先闪几下,这样便于排除单片机系统的故障,也可以作为调试中使用的辅助标志位。
另外,你的晶振布局非常不合理。应该调整一下。
看你好像用了2片7414,太奢侈了。
回复

使用道具 举报

板凳
ID:149451 发表于 2019-6-5 10:22 | 只看该作者
PCB图中的IC芯片的地、电源没连接哟,在仿真时可以不画(默认连接),但实物图必须的有。
回复

使用道具 举报

地板
ID:415123 发表于 2019-6-5 10:55 | 只看该作者
线路板布线和原理图不符,两个门电路芯片都没电源。脉冲输入部分的光耦布线也是错误的
回复

使用道具 举报

5#
ID:213173 发表于 2019-6-5 11:28 | 只看该作者
你的PCB图是错误的。74LS14的电源(14脚)和地(7脚)都没有接线。而且六反相施密特触发器74LS14不必用两块,里面有6个独立单元。另外元件布局过于松散,晶振和谐振电容离单片机太远,会辐射干扰、电源和地线线宽太窄。甚至有的元件封装与实物不匹配。
回复

使用道具 举报

6#
ID:543949 发表于 2019-6-5 13:53 | 只看该作者
wulin 发表于 2019-6-5 11:28
你的PCB图是错误的。74LS14的电源(14脚)和地(7脚)都没有接线。而且六反相施密特触发器74LS14不必用两块,里 ...

嗯,好的,多谢 我修改一下PCB
回复

使用道具 举报

7#
ID:543949 发表于 2019-6-5 13:53 | 只看该作者
honey_teck 发表于 2019-6-5 10:55
线路板布线和原理图不符,两个门电路芯片都没电源。脉冲输入部分的光耦布线也是错误的

好的,谢谢
回复

使用道具 举报

8#
ID:543949 发表于 2019-6-5 13:54 | 只看该作者
honey_teck 发表于 2019-6-5 10:55
线路板布线和原理图不符,两个门电路芯片都没电源。脉冲输入部分的光耦布线也是错误的

这就修改一下
回复

使用道具 举报

9#
ID:543949 发表于 2019-6-5 13:54 | 只看该作者
rsx9583 发表于 2019-6-5 10:18
仿真没啥问题,按道理原理图和程序应该问题不大。你首先排查一下硬件有没有故障。用万用表量量单片机晶振的 ...

嗯,好的 知道了多谢!
回复

使用道具 举报

10#
ID:93224 发表于 2019-6-5 17:35 | 只看该作者
实物的LCD1602多了两个引脚分别是AC和NC
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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