找回密码
 立即注册

QQ登录

只需一步,快速开始

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

我写的单片机程序为什么跑不起来?

[复制链接]
跳转到指定楼层
楼主
ID:1040766 发表于 2022-7-28 01:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
个位前辈好
我最近在学习51单片机
发现 我写得 程序几乎和教材给的程序一样 但就是跑不来

希望前辈能帮我指点一下 谢谢

感谢大家得指点 确实 是我的程序 写错了。。
我应该调函数得 结果忘了写 ()了 但是居然没有报错。。。。。就是53行那里。。居然可以生产hex文件。。。。。


先放我写得
  1. #include "xpt2046.h"

  2. void xpt2046_write_data(u8 dat)//写入8位串行数据 先写高位 上升沿发送
  3. {
  4.     u8 i=0;
  5.     xpt2046_DCLK=0;//时序先置0
  6.     _nop_();
  7.     for(i=0;i<8;i++)//发送8位串行数据
  8.     {
  9.         xpt2046_DIN=dat>>7;// 串行数据线=最高位
  10.         dat<<=1;//此高位推至高位方便下次发送
  11.         xpt2046_DCLK=0;//时序置0 方便下次产生上升沿
  12.         _nop_();
  13.         xpt2046_DCLK=1;// 时序置1 产生上升沿
  14.         _nop_();   
  15.     }
  16. }

  17. u16 xpt2046_read_data(void)
  18. {
  19.     u8 i=0;
  20.     u16 xpt2046_data=0;
  21.    
  22.     xpt2046_DCLK=0;//
  23.     _nop_();   
  24.     for(i=0;i<12;i++)
  25.     {
  26.         xpt2046_data<<=1;
  27.         xpt2046_DCLK=1;//
  28.         _nop_();   
  29.         xpt2046_DCLK=0;//产生下降沿 方便下次循环读取数据
  30.         _nop_();
  31.         xpt2046_data|=xpt2046_DOUT;//或上数据得最低位 为了保证不改变已有数据        
  32.     }
  33.     return xpt2046_data;
  34. }   


  35. u16 xpt2046_read_adc_value(u8 cmd)
  36. {
  37.     u16 adc_value=0;
  38.     u8 i=0;
  39.    
  40.     xpt2046_CS=0;//使能低电平有效
  41.     xpt2046_DCLK=0;
  42.    
  43.     xpt2046_write_data(cmd);
  44.   for(i=6; i>0; i--);//等待
  45.     xpt2046_DCLK=1;
  46.     _nop_();
  47.     xpt2046_DCLK=0;
  48.     _nop_();   
  49.     adc_value=xpt2046_read_data;
  50.     xpt2046_CS=1;
  51.     return     adc_value;
  52. }
复制代码
然后再放上官方得
  1. #include "xpt2046.h"
  2. #include "intrins.h"

  3. /*******************************************************************************
  4. * 函 数 名       : xpt2046_wirte_data
  5. * 函数功能                 : XPT2046写数据
  6. * 输    入       : dat:写入的数据
  7. * 输    出             : 无
  8. *******************************************************************************/
  9. void xpt2046_wirte_data(u8 dat)
  10. {
  11.         u8 i;

  12.         CLK = 0;
  13.         _nop_();
  14.         for(i=0;i<8;i++)//循环8次,每次传输一位,共一个字节
  15.         {
  16.                 DIN = dat >> 7;//先传高位再传低位
  17.                 dat <<= 1;//将低位移到高位
  18.                 CLK = 0;//CLK由低到高产生一个上升沿,从而写入数据
  19.                 _nop_();        
  20.                 CLK = 1;
  21.                 _nop_();
  22.         }
  23. }

  24. /*******************************************************************************
  25. * 函 数 名       : xpt2046_read_data
  26. * 函数功能                 : XPT2046读数据
  27. * 输    入       : 无
  28. * 输    出             : XPT2046返回12位数据
  29. *******************************************************************************/
  30. u16        xpt2046_read_data(void)
  31. {
  32.         u8 i;
  33.         u16 dat=0;

  34.         CLK = 0;
  35.         _nop_();
  36.         for(i=0;i<12;i++)//循环12次,每次读取一位,大于一个字节数,所以返回值类型是u16
  37.         {
  38.                 dat <<= 1;
  39.                 CLK = 1;
  40.                 _nop_();
  41.                 CLK = 0; //CLK由高到低产生一个下降沿,从而读取数据
  42.                 _nop_();
  43.                 dat |= DOUT;//先读取高位,再读取低位。        
  44.         }
  45.         return dat;        
  46. }

  47. /*******************************************************************************
  48. * 函 数 名       : xpt2046_read_adc_value
  49. * 函数功能                 : XPT2046读AD数据
  50. * 输    入       : cmd:指令
  51. * 输    出             : XPT2046返回AD值
  52. *******************************************************************************/
  53. u16 xpt2046_read_adc_value(u8 cmd)
  54. {
  55.         u8 i;
  56.         u16 adc_value=0;

  57.         CLK = 0;//先拉低时钟
  58.         CS  = 0;//使能XPT2046
  59.         xpt2046_wirte_data(cmd);//发送命令字
  60.         for(i=6; i>0; i--);//延时等待转换结果
  61.         CLK = 1;
  62.         _nop_();
  63.         CLK = 0;//发送一个时钟,清除BUSY
  64.         _nop_();
  65.         adc_value=xpt2046_read_data();
  66.         CS = 1;//关闭XPT2046
  67.         return adc_value;
  68. }
复制代码

我反复看了好几遍 不知道为什么 可能是我C语言基础太薄弱了。。希望大佬帮我指出不足 谢谢


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

使用道具 举报

沙发
ID:68189 发表于 2022-7-28 21:26 | 只看该作者
你的代码与原代码只有一处不同,你代码的53行与原代码的71行不同,别的语句都相同......
回复

使用道具 举报

板凳
ID:78901 发表于 2022-7-28 21:51 | 只看该作者
不管能否跑起来,先看编译能否通过
回复

使用道具 举报

地板
ID:401113 发表于 2022-7-29 06:01 | 只看该作者
编译时有没有报错?这个教材用的实验板和你用的是一样的吗?如果实验板不同,那么你的针脚定义是不是弄错了?
回复

使用道具 举报

5#
ID:331575 发表于 2022-7-29 09:52 | 只看该作者
看看头文件,intrins.h,函数,应用于程序设计,一般出C51单片机编程中,一般程序中需要使用到空指令_nop_();字符循环移位指令_crol_等时使用。
回复

使用道具 举报

6#
ID:1040766 发表于 2022-7-29 16:55 | 只看该作者
wpppmlah 发表于 2022-7-28 21:26
你的代码与原代码只有一处不同,你代码的53行与原代码的71行不同,别的语句都相同......

感谢 我这里确实写错了 我应该调函数得 结果忘了写 ()了 但是居然没有报错。。。。。就是53行那里。。
回复

使用道具 举报

7#
ID:146878 发表于 2022-7-31 22:22 | 只看该作者
woshixy1 发表于 2022-7-29 16:55
感谢 我这里确实写错了 我应该调函数得 结果忘了写 ()了 但是居然没有报错。。。。。就是53行那里。。

当编译器检查宽松时,adc_value=xpt2046_read_data是没有错的。造成的结果是把xpt2046_read_data函数地址赋到adc_value,相当于adc_value一直赋入一个常数。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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