找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1998|回復: 6
打印 上一主題 下一主題
收起左側

我寫的單片機程序為什么跑不起來?

[復制鏈接]
跳轉到指定樓層
樓主
ID:1040766 發(fā)表于 2022-7-28 01:37 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
個位前輩好
我最近在學習51單片機
發(fā)現(xiàn) 我寫得 程序幾乎和教材給的程序一樣 但就是跑不來

希望前輩能幫我指點一下 謝謝

感謝大家得指點 確實 是我的程序 寫錯了。。
我應該調函數(shù)得 結果忘了寫 ()了 但是居然沒有報錯。。。。。就是53行那里。。居然可以生產hex文件。。。。。


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

  2. void xpt2046_write_data(u8 dat)//寫入8位串行數(shù)據(jù) 先寫高位 上升沿發(fā)送
  3. {
  4.     u8 i=0;
  5.     xpt2046_DCLK=0;//時序先置0
  6.     _nop_();
  7.     for(i=0;i<8;i++)//發(fā)送8位串行數(shù)據(jù)
  8.     {
  9.         xpt2046_DIN=dat>>7;// 串行數(shù)據(jù)線=最高位
  10.         dat<<=1;//此高位推至高位方便下次發(fā)送
  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;//產生下降沿 方便下次循環(huán)讀取數(shù)據(jù)
  30.         _nop_();
  31.         xpt2046_data|=xpt2046_DOUT;//或上數(shù)據(jù)得最低位 為了保證不改變已有數(shù)據(jù)        
  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. * 函 數(shù) 名       : xpt2046_wirte_data
  5. * 函數(shù)功能                 : XPT2046寫數(shù)據(jù)
  6. * 輸    入       : dat:寫入的數(shù)據(jù)
  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++)//循環(huán)8次,每次傳輸一位,共一個字節(jié)
  15.         {
  16.                 DIN = dat >> 7;//先傳高位再傳低位
  17.                 dat <<= 1;//將低位移到高位
  18.                 CLK = 0;//CLK由低到高產生一個上升沿,從而寫入數(shù)據(jù)
  19.                 _nop_();        
  20.                 CLK = 1;
  21.                 _nop_();
  22.         }
  23. }

  24. /*******************************************************************************
  25. * 函 數(shù) 名       : xpt2046_read_data
  26. * 函數(shù)功能                 : XPT2046讀數(shù)據(jù)
  27. * 輸    入       : 無
  28. * 輸    出             : XPT2046返回12位數(shù)據(jù)
  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++)//循環(huán)12次,每次讀取一位,大于一個字節(jié)數(shù),所以返回值類型是u16
  37.         {
  38.                 dat <<= 1;
  39.                 CLK = 1;
  40.                 _nop_();
  41.                 CLK = 0; //CLK由高到低產生一個下降沿,從而讀取數(shù)據(jù)
  42.                 _nop_();
  43.                 dat |= DOUT;//先讀取高位,再讀取低位。        
  44.         }
  45.         return dat;        
  46. }

  47. /*******************************************************************************
  48. * 函 數(shù) 名       : xpt2046_read_adc_value
  49. * 函數(shù)功能                 : XPT2046讀AD數(shù)據(jù)
  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);//發(fā)送命令字
  60.         for(i=6; i>0; i--);//延時等待轉換結果
  61.         CLK = 1;
  62.         _nop_();
  63.         CLK = 0;//發(fā)送一個時鐘,清除BUSY
  64.         _nop_();
  65.         adc_value=xpt2046_read_data();
  66.         CS = 1;//關閉XPT2046
  67.         return adc_value;
  68. }
復制代碼

我反復看了好幾遍 不知道為什么 可能是我C語言基礎太薄弱了。。希望大佬幫我指出不足 謝謝


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:68189 發(fā)表于 2022-7-28 21:26 | 只看該作者
你的代碼與原代碼只有一處不同,你代碼的53行與原代碼的71行不同,別的語句都相同......
回復

使用道具 舉報

板凳
ID:78901 發(fā)表于 2022-7-28 21:51 | 只看該作者
不管能否跑起來,先看編譯能否通過
回復

使用道具 舉報

地板
ID:401113 發(fā)表于 2022-7-29 06:01 | 只看該作者
編譯時有沒有報錯?這個教材用的實驗板和你用的是一樣的嗎?如果實驗板不同,那么你的針腳定義是不是弄錯了?
回復

使用道具 舉報

5#
ID:331575 發(fā)表于 2022-7-29 09:52 | 只看該作者
看看頭文件,intrins.h,函數(shù),應用于程序設計,一般出C51單片機編程中,一般程序中需要使用到空指令_nop_();字符循環(huán)移位指令_crol_等時使用。
回復

使用道具 舉報

6#
ID:1040766 發(fā)表于 2022-7-29 16:55 | 只看該作者
wpppmlah 發(fā)表于 2022-7-28 21:26
你的代碼與原代碼只有一處不同,你代碼的53行與原代碼的71行不同,別的語句都相同......

感謝 我這里確實寫錯了 我應該調函數(shù)得 結果忘了寫 ()了 但是居然沒有報錯。。。。。就是53行那里。。
回復

使用道具 舉報

7#
ID:146878 發(fā)表于 2022-7-31 22:22 | 只看該作者
woshixy1 發(fā)表于 2022-7-29 16:55
感謝 我這里確實寫錯了 我應該調函數(shù)得 結果忘了寫 ()了 但是居然沒有報錯。。。。。就是53行那里。。

當編譯器檢查寬松時,adc_value=xpt2046_read_data是沒有錯的。造成的結果是把xpt2046_read_data函數(shù)地址賦到adc_value,相當于adc_value一直賦入一個常數(shù)。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表