標(biāo)題: 我寫的單片機(jī)程序?yàn)槭裁磁懿黄饋?lái)? [打印本頁(yè)]

作者: woshixy1    時(shí)間: 2022-7-28 01:37
標(biāo)題: 我寫的單片機(jī)程序?yàn)槭裁磁懿黄饋?lái)?
個(gè)位前輩好
我最近在學(xué)習(xí)51單片機(jī)
發(fā)現(xiàn) 我寫得 程序幾乎和教材給的程序一樣 但就是跑不來(lái)

希望前輩能幫我指點(diǎn)一下 謝謝

感謝大家得指點(diǎn) 確實(shí) 是我的程序 寫錯(cuò)了。。
我應(yīng)該調(diào)函數(shù)得 結(jié)果忘了寫 ()了 但是居然沒(méi)有報(bào)錯(cuò)。。。。。就是53行那里。。居然可以生產(chǎn)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;//時(shí)序先置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;//時(shí)序置0 方便下次產(chǎn)生上升沿
  12.         _nop_();
  13.         xpt2046_DCLK=1;// 時(shí)序置1 產(chǎn)生上升沿
  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;//產(chǎn)生下降沿 方便下次循環(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. }
復(fù)制代碼
然后再放上官方得
  1. #include "xpt2046.h"
  2. #include "intrins.h"

  3. /*******************************************************************************
  4. * 函 數(shù) 名       : xpt2046_wirte_data
  5. * 函數(shù)功能                 : XPT2046寫數(shù)據(jù)
  6. * 輸    入       : dat:寫入的數(shù)據(jù)
  7. * 輸    出             : 無(wú)
  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次,每次傳輸一位,共一個(gè)字節(jié)
  15.         {
  16.                 DIN = dat >> 7;//先傳高位再傳低位
  17.                 dat <<= 1;//將低位移到高位
  18.                 CLK = 0;//CLK由低到高產(chǎn)生一個(gè)上升沿,從而寫入數(shù)據(jù)
  19.                 _nop_();        
  20.                 CLK = 1;
  21.                 _nop_();
  22.         }
  23. }

  24. /*******************************************************************************
  25. * 函 數(shù) 名       : xpt2046_read_data
  26. * 函數(shù)功能                 : XPT2046讀數(shù)據(jù)
  27. * 輸    入       : 無(wú)
  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次,每次讀取一位,大于一個(gè)字節(jié)數(shù),所以返回值類型是u16
  37.         {
  38.                 dat <<= 1;
  39.                 CLK = 1;
  40.                 _nop_();
  41.                 CLK = 0; //CLK由高到低產(chǎn)生一個(gè)下降沿,從而讀取數(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;//先拉低時(shí)鐘
  58.         CS  = 0;//使能XPT2046
  59.         xpt2046_wirte_data(cmd);//發(fā)送命令字
  60.         for(i=6; i>0; i--);//延時(shí)等待轉(zhuǎn)換結(jié)果
  61.         CLK = 1;
  62.         _nop_();
  63.         CLK = 0;//發(fā)送一個(gè)時(shí)鐘,清除BUSY
  64.         _nop_();
  65.         adc_value=xpt2046_read_data();
  66.         CS = 1;//關(guān)閉XPT2046
  67.         return adc_value;
  68. }
復(fù)制代碼

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



作者: wpppmlah    時(shí)間: 2022-7-28 21:26
你的代碼與原代碼只有一處不同,你代碼的53行與原代碼的71行不同,別的語(yǔ)句都相同......
作者: fsj5098    時(shí)間: 2022-7-28 21:51
不管能否跑起來(lái),先看編譯能否通過(guò)
作者: 海洋漁業(yè)    時(shí)間: 2022-7-29 06:01
編譯時(shí)有沒(méi)有報(bào)錯(cuò)?這個(gè)教材用的實(shí)驗(yàn)板和你用的是一樣的嗎?如果實(shí)驗(yàn)板不同,那么你的針腳定義是不是弄錯(cuò)了?
作者: 15942379927    時(shí)間: 2022-7-29 09:52
看看頭文件,intrins.h,函數(shù),應(yīng)用于程序設(shè)計(jì),一般出C51單片機(jī)編程中,一般程序中需要使用到空指令_nop_();字符循環(huán)移位指令_crol_等時(shí)使用。
作者: woshixy1    時(shí)間: 2022-7-29 16:55
wpppmlah 發(fā)表于 2022-7-28 21:26
你的代碼與原代碼只有一處不同,你代碼的53行與原代碼的71行不同,別的語(yǔ)句都相同......

感謝 我這里確實(shí)寫錯(cuò)了 我應(yīng)該調(diào)函數(shù)得 結(jié)果忘了寫 ()了 但是居然沒(méi)有報(bào)錯(cuò)。。。。。就是53行那里。。
作者: pdwdzz    時(shí)間: 2022-7-31 22:22
woshixy1 發(fā)表于 2022-7-29 16:55
感謝 我這里確實(shí)寫錯(cuò)了 我應(yīng)該調(diào)函數(shù)得 結(jié)果忘了寫 ()了 但是居然沒(méi)有報(bào)錯(cuò)。。。。。就是53行那里。。

當(dāng)編譯器檢查寬松時(shí),adc_value=xpt2046_read_data是沒(méi)有錯(cuò)的。造成的結(jié)果是把xpt2046_read_data函數(shù)地址賦到adc_value,相當(dāng)于adc_value一直賦入一個(gè)常數(shù)。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1