找回密码
 立即注册

QQ登录

只需一步,快速开始

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

可否请大佬帮忙看看proteus仿真哪里出了问题,lcd不显示

[复制链接]
跳转到指定楼层
楼主
附上单片机的程序,希望大家帮帮我orz指出错误和改正方法

  1. #include <reg52.h>                 //调用单片机头文件#define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255
  2. #define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535



  3. sbit rs=P2^5;         //寄存器选择信号 H:数据寄存器          L:指令寄存器
  4. sbit rw=P2^6;         //寄存器选择信号 H:数据寄存器          L:指令寄存器
  5. sbit e =P2^7;         //片选信号   下降沿触发

  6. unsigned char i=0,timecount=0,displayOK=0,rate=0,aa=0;
  7. unsigned int time[6]={0};


  8. /***********************1ms延时函数*****************************/
  9. void delay_1ms(uint q)
  10. {
  11.         uint i,j;
  12.         for(i=0;i<q;i++)
  13.                 for(j=0;j<120;j++);
  14. }

  15.                                           
  16. /************ 延时函数  *****************/
  17. void delay_uint(uint z)
  18. {
  19.    while(z--);
  20. }


  21. /************ 写命令函数  *****************/
  22. void write_com(uchar com)
  23. {

  24.    P0=com;
  25.    rw=0;
  26.    rs=0;
  27.    delay_uint(25);
  28.    e=1;
  29.    delay_uint(50);
  30.    e=0;
  31. }
  32. /************ 写数据函数  *****************/
  33. void write_data(uchar dat)
  34. {

  35.    P0=dat;;
  36.    rw=0;
  37.    rs=1;
  38.    delay_uint(25);
  39.    e=1;
  40.    delay_uint(50);
  41.    e=0;
  42. }

  43. /**********************************************************
  44. *函数名: addr_12864
  45. *功能:写地址
  46. *说明:写汉字时要写个地址
  47. *输入:无
  48. *返回:无
  49. **********************************************************/
  50. void addr_12864(uchar hang,uchar lie)          //地址转换
  51. {
  52.         uchar address;
  53.         switch(hang)
  54.         {
  55.                 case 1: address=0x80 + lie ;
  56.                                 break;
  57.                 case 2: address=0x90 + lie ;
  58.                                 break;
  59.                 case 3: address=0x88 + lie ;
  60.                                 break;
  61.                 case 4: address=0x98 + lie ;
  62.                                 break;
  63.                 default :
  64.                                 break;
  65.         }        
  66.         write_com(address);
  67. }

  68. /***********************lcd1602上显示两位十进制数************************/
  69. void write_sfm3(uchar hang,uchar add,uint date)
  70. {
  71.         addr_12864(hang,add);         
  72.         write_data(':');
  73.         write_data(0x30+date/100%10);
  74.         write_data(0x30+date/10%10);
  75.         write_data(0x30+date%10);        
  76. }


  77. /**********************************************************
  78. *函数名: write_string
  79. *功能:在12864上显示字符数据
  80. *说明:
  81. *输入:无
  82. *返回:无
  83. **********************************************************/

  84. void write_string(uchar hang,uchar lie,uchar *p)
  85. {
  86.         addr_12864(hang,lie);          //地址转换
  87.         while(*p != '\0')
  88.         {
  89.                 write_data(*p);
  90.                 p++;
  91.                 delay_uint(50);
  92.         }
  93. }

  94. /********************************************************************
  95. * 名称 : init_12864()
  96. * 功能 : 初始化函数
  97. * 输入 : cmdcode
  98. * 输出 : 无
  99. ***********************************************************************/
  100. void init_12864()
  101. {  
  102.     write_com(0x30);
  103.     write_com(0x0c);
  104.     write_com(0x01);
  105.     delay_uint(5000);
  106.         write_string(1,0,"               ");
  107.         write_string(2,0," 心率:000/min  ");
  108.         write_string(3,0,"               ");
  109.         write_string(4,0,"               ");
  110. }

  111. /*************定时器0初始化程序***************/
  112. void time_init()         
  113. {
  114.         EA   = 1;                   //开总中断
  115.         TMOD = 0X01;          //定时器0、定时器1工作方式1
  116.         ET0  = 1;                  //开定时器0中断
  117.         TR0  = 1;                  //允许定时器0定时
  118. }


  119. /***********外部中断0初始化程序****************/
  120. void init_int0()          //外部中断0初始化程序
  121. {
  122.         EX0=1;                          //允许外部中断0中断
  123.         EA=1;                           //开总中断
  124.         IT0 = 1;                   //外部中断0负跳变中断
  125. }

  126. /****************主函数***************/
  127. void main()
  128. {        
  129.         init_12864();     //12864初始化        
  130.         time_init();      //初始化定时器
  131.         init_int0();          //外部中断0初始化程序
  132.         while(1)
  133.         {                        
  134.                 if(displayOK==0)//如果显示关
  135.                 {
  136.                          rate = 0;
  137.                 }
  138.                 else//如果显示开
  139.                 {
  140.                         rate=60000/(time[1]/5+time[2]/5+time[3]/5+time[4]/5+time[5]/5);
  141.                 }
  142.                 write_sfm3(2,5,rate);

  143.                 delay_1ms(300);
  144.         }
  145. }

  146. void int0() interrupt 0
  147. {
  148.         if(timecount<8)   //当连续两次检测时间间隔小于8*50ms=400ms不处理
  149.         {
  150.                         TR0=1;//开定时器
  151.         }
  152.         else
  153.         {
  154.                 time[i]=timecount*50+TH0+TL0;//算出间隔时间
  155.                 TH0 = 0x3c;
  156.                 TL0 = 0xb0;     // 50ms         12M
  157.                 timecount=0;//50ms计数清零
  158.                 i++;
  159.                 if(i==6)//记录到超过等于6次时间
  160.                 {
  161.                         i=1;//计数从1开始
  162.                         displayOK=1;    //测得5次开始显示?
  163.                 }                                                               
  164.         }
  165. }

  166. /*************定时器0中断服务程序***************/
  167. void time0_int() interrupt 1
  168. {        
  169.         TH0 = 0x3c;
  170.         TL0 = 0xb0;     // 50ms         12M
  171.         timecount++;//每50ms一次计数
  172.         if(timecount>25)     //当超过25*50ms=1.5s没有检测到信号停止显示
  173.         {
  174.                         i=0;//数据个数清零
  175.                         timecount=0;//50ms计数清零
  176.                         displayOK=0;//显示关
  177.                         TR0=0;//定时器关
  178.                         TH0 = 0x3c;
  179.                         TL0 = 0xb0;     // 50ms         12M
  180.         }
  181. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:342822 发表于 2020-12-27 14:38 | 只看该作者
本帖最后由 taotie 于 2020-12-27 14:49 编辑

附上单片机的程序,希望大家帮帮我orz指出错误和改正方法

#include <reg52.h>                 //调用单片机头文
#define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535
#define uchar unsigned char



cd按程序里设置接线


sbit rs=P2^5;        
sbit rw=P2^6;         
sbit e =P2^7;  

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:342822 发表于 2020-12-27 14:56 | 只看该作者
这个  time是变量?为什么程序中没有定义,是否写错!应该是 timecount
    time=timecount*50+TH0+TL0;//算出间隔时间
                TH0 = 0x3c;
                TL0 = 0xb0;     // 50ms         12M

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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