欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 新手學習單片機進度很慢,應(yīng)該如何學習? [打印本頁]

作者: 你速度發(fā)生的    時間: 2020-6-20 20:31
標題: 新手學習單片機進度很慢,應(yīng)該如何學習?
本帖最后由 你速度發(fā)生的 于 2020-6-21 00:11 編輯

我想咨詢各位大佬,我是19級大一,我學習單片機有半年左右,對單片機的理解只到大概可以看懂,51普中的板子例程也都走了一遍。但是和我一師兄習單片機的師兄他就比我深入很多,我們那個時候制作一個小項目LCD1602液晶顯示溫度并設(shè)定溫度上下限,蜂鳴器報警提示超限。我?guī)熜炙谱鬟@個程序只有

這是不是說明我學習的進度慢了他很多,我看單片機的書看到時序,串口什么的原理就頭疼,看久了就發(fā)呆去了,求各位大佬支招。主要是想問學習單片機是否要像我?guī)熜帜菢由钊氲膶W習,我應(yīng)該怎么學
  1. #include <reg51.h>
  2. #include "temp.h"
  3. #include <stdio.h>
  4. void LcdDisplay(int);
  5. void UsartConfiguration(void);
  6. /*******************************************************************************
  7. * 函數(shù)名         : main
  8. * 函數(shù)功能     : 主函數(shù)
  9. * 輸入           : 無
  10. * 輸出           : 無
  11. *******************************************************************************/
  12. void main()
  13. {

  14. UsartConfiguration();//初始化
  15. EA=1;      //打開總中斷
  16. while(1)
  17. {
  18.    LcdDisplay(Ds18b20ReadTemp());  
  19.    Delay1ms(100);//0.1s鐘刷一次
  20.    
  21. }
  22. }
  23. /*******************************************************************************
  24. * 函數(shù)名         : LcdDisplay()
  25. * 函數(shù)功能     : LCD顯示讀取到的溫度
  26. * 輸入           : v
  27. * 輸出           : 無
  28. *******************************************************************************/
  29. void LcdDisplay(int temp)   //lcd顯示
  30. {
  31.   static int q=0;
  32. int i=0;
  33.   char  datas[] = {0, 0, 0, 0, 0}; //定義數(shù)組
  34. float tp;  

  35.   temp=temp-1;
  36.   
  37.   tp=temp;
  38. tp=tp*0.0625+0.5;
  39. //  temp=tp*0.0625*100+0.5;
  40. // tp=(float)temp/100;
  41.   printf("第%d次測量的溫度為:+%0.2f\n",q++,tp);
  42. }
  43. /*******************************************************************************
  44. * 函 數(shù) 名         :UsartConfiguration()
  45. * 函數(shù)功能     :設(shè)置串口
  46. * 輸    入         : 無
  47. * 輸    出         : 無
  48. *******************************************************************************/
  49. void UsartConfiguration(void)
  50. {

  51. TMOD=0x20;//即0010 0000,定時器/計數(shù)器1,工作方式2
  52. TH1=0xfd;//設(shè)置波特率為9600
  53. TL1=0xfd;
  54. TR1=1;//啟動定時器/計數(shù)器1
  55. SCON=0x50; //0101 0000.串口工作方式1,允許串行控制
  56. PCON=0x00;//設(shè)置SMOD=0
  57. IE=0x90; //CPU允許中斷,串行允許中斷
  58. TI=1;//
  59. }


  60. 而我自己的
  61. /*******************************************************************************
  62. 注意事項:
  63. 根據(jù)自己使用的LCD1602是否帶有轉(zhuǎn)接板,如果帶有轉(zhuǎn)接板的即為4位,需在LCD.H頭文件中
  64. 將宏#define LCD1602_4PINS打開,我們這里使用的LCD1602是8位,所以默認將該宏注釋。
  65. 接線說明:(開發(fā)攻略每個實驗章節(jié)內(nèi)的實驗現(xiàn)象都有對應(yīng)的接線圖說明)
  66. LCD1602接線參考LCD1602液晶顯示實驗接線圖
  67. DS18B20傳感器接線參考DS18B20溫度傳感器實驗接線圖

  68. 實驗操作:
  69. LCD1602上顯示采集的溫度,同時
  70. 打開串口調(diào)試助手,將串口波特率選擇9600,打開串口,此時在串口上就會顯示采集的溫度,串口截圖參考文件夾下。
  71. *******************************************************************************/
  72. #include<reg51.h>
  73. #include"lcd.h"
  74. #include"temp.h"
  75. #include<intrins.h>  //因為要用到左右移函數(shù),所以加入這個頭文件
  76. typedef unsigned int u16;   //對數(shù)據(jù)類型進行聲明定義
  77. typedef unsigned char u8;
  78. sbit beep=P1^1;
  79. uchar i;
  80. int n=0;
  81. uchar CNCHAR[17] = "第1次測試溫度為:";
  82. uchar lx[1]="1";
  83. void LcdDisplay(int);
  84. void UsartConfiguration();
  85. sbit LSA=P0^7;
  86. sbit LSB=P2^3;
  87. sbit LSC=P2^4;
  88. /*******************************************************************************
  89. * 函 數(shù) 名         : delay
  90. * 函數(shù)功能     : 延時函數(shù),i=1時,大約延時10us
  91. *******************************************************************************/
  92. void delay(u16 i)
  93. {
  94. while(i--);
  95. }
  96. /*******************************************************************************
  97. * 函數(shù)名         : main
  98. * 函數(shù)功能     : 主函數(shù)
  99. * 輸入           : 無
  100. * 輸出           : 無
  101. *******************************************************************************/
  102. void main()
  103. {
  104. UsartConfiguration();
  105. LcdInit();    //初始化LCD1602
  106. LcdWriteCom(0x88); //寫地址 80表示初始地址
  107. LcdWriteData('C');
  108. while(1)
  109. {
  110.   LcdDisplay(Ds18b20ReadTemp());
  111.          if((Ds18b20ReadTemp()>480)||(Ds18b20ReadTemp()<400))
  112.   {
  113.       for(i=0;i<120;i++)
  114.    {
  115.    beep=~beep;
  116.     delay(100);   
  117.    };
  118.   }
  119.   else
  120.   {
  121.      ;
  122.   };
  123. //  Delay1ms(1000);//1s鐘刷一次
  124. }
  125. }

  126. /*******************************************************************************
  127. * 函數(shù)名         : LcdDisplay()
  128. * 函數(shù)功能     : LCD顯示讀取到的溫度
  129. * 輸入           : v
  130. * 輸出           : 無
  131. *******************************************************************************/
  132. void LcdDisplay(int temp)   //lcd顯示
  133. {
  134.    unsigned char i, datas[] = {0, 0, 0, 0, 0}; //定義數(shù)組
  135. float tp;  
  136. if(temp< 0)    //當溫度值為負數(shù)
  137.    {
  138.     LcdWriteCom(0x80);  //寫地址 80表示初始地址
  139.   SBUF='-';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  140.   while(!TI);            //等待發(fā)送數(shù)據(jù)完成
  141.   TI=0;       //清除發(fā)送完成標志位
  142.      LcdWriteData('-');    //顯示負
  143.   //因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
  144.   temp=temp-1;
  145.   temp=~temp;
  146.   tp=temp;
  147.   temp=tp*0.0625*100+0.5;
  148.   //留兩個小數(shù)點就*100,+0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點
  149.   //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  150.   //算由?.5,還是在小數(shù)點后面。

  151.    }
  152.   else
  153.    {   
  154.     LcdWriteCom(0x80);  //寫地址 80表示初始地址
  155.      LcdWriteData('+');   //顯示正
  156.   SBUF='+';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  157.   while(!TI);            //等待發(fā)送數(shù)據(jù)完成
  158.   TI=0;       //清除發(fā)送完成標志位
  159.   tp=temp;//因為數(shù)據(jù)處理有小數(shù)點所以將溫度賦給一個浮點型變量
  160.   //如果溫度是正的那么,那么正數(shù)的原碼就是補碼它本身
  161.   temp=tp*0.0625*100+0.5;
  162.   //留兩個小數(shù)點就*100,+0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點
  163.   //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  164.   //算加上0.5,還是在小數(shù)點后面。
  165. }
  166. datas[0] = temp / 10000;
  167. datas[1] = temp % 10000 / 1000;
  168. datas[2] = temp % 1000 / 100;
  169. datas[3] = temp % 100 / 10;
  170. datas[4] = temp % 10;
  171. LcdWriteCom(0x82);    //寫地址 80表示初始地址
  172. LcdWriteData('0'+datas[0]); //百位
  173. SBUF = '0'+datas[0];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  174. while (!TI);            //等待發(fā)送數(shù)據(jù)完成
  175. TI = 0;

  176. LcdWriteCom(0x83);   //寫地址 80表示初始地址
  177. LcdWriteData('0'+datas[1]); //十位
  178. SBUF = '0'+datas[1];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  179. while (!TI);            //等待發(fā)送數(shù)據(jù)完成
  180. TI = 0;
  181. LcdWriteCom(0x84);  //寫地址 80表示初始地址
  182. LcdWriteData('0'+datas[2]); //個位
  183. SBUF = '0'+datas[2];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  184. while (!TI);            //等待發(fā)送數(shù)據(jù)完成
  185. TI = 0;
  186. LcdWriteCom(0x85);  //寫地址 80表示初始地址
  187. LcdWriteData('.');   //顯示 ‘.’
  188. SBUF = '.';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  189. while (!TI);            //等待發(fā)送數(shù)據(jù)完成
  190. TI = 0;
  191. LcdWriteCom(0x86);   //寫地址 80表示初始地址
  192. LcdWriteData('0'+datas[3]); //顯示小數(shù)點  
  193. SBUF = '0'+datas[3];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  194. while (!TI);            //等待發(fā)送數(shù)據(jù)完成
  195. TI = 0;
  196. LcdWriteCom(0x87);   //寫地址 80表示初始地址
  197. LcdWriteData('0'+datas[4]); //顯示小數(shù)點
  198. SBUF = '0'+datas[4];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  199. while (!TI);            //等待發(fā)送數(shù)據(jù)完成
  200. TI = 0;
  201. for(i=0; i<17; i++)
  202. {
  203.    SBUF = CNCHAR[i];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  204.   while (!TI);            //等待發(fā)送數(shù)據(jù)完成
  205.   TI = 0;
  206. }
  207.   if((CNCHAR[2]='1')&&(n<9))我只在這里修改了一下
  208.   {
  209.     n++;
  210.        CNCHAR[2]=lx[0];
  211.        lx[0]=lx[0]+1;   
  212.   }
  213.   else
  214. {
  215.     CNCHAR[2]='1';
  216.    lx[0]='1';
  217.    n=0;
  218. }
  219. }
  220. /*******************************************************************************
  221. * 函 數(shù) 名         :UsartConfiguration()
  222. * 函數(shù)功能     :設(shè)置串口
  223. * 輸    入         : 無
  224. * 輸    出         : 無
  225. *******************************************************************************/
  226. void UsartConfiguration()
  227. {
  228.   SCON=0x50;//設(shè)置串口工作方式1
  229. TMOD=0x20;//設(shè)置計數(shù)器工作方式2
  230. PCON=0x00;//即SMOD=1,波特率不加倍
  231. TH1=0xFD;//計數(shù)器初值。波特率是9600,晶振為11.0592MHz
  232. TL1=0xFD;
  233. // ES=1;      //打開接收中斷
  234. // EA=1;      //打開總中斷
  235. TR1=1;//打開計數(shù)器
  236. }
復制代碼





作者: wwh2382    時間: 2020-6-21 10:53
你的師兄除了跟著課本走,還多動了腦子,在原有程序的基礎(chǔ)上加了新的東西。這正是你缺少的。編程就要多動腦子,而且是越用越好用
作者: csmyldl    時間: 2020-6-21 11:36
說明與單片機相關(guān)的基礎(chǔ)知識薄弱,需要進一步加深學習
作者: xsjsensei    時間: 2020-6-21 12:47
先從理論知識開始,硬啃,然后結(jié)合編程實踐應(yīng)該會好很多
作者: dzbj    時間: 2020-6-21 18:06
這事的關(guān)鍵不在技術(shù)本身 在你自己 你是特想學么 你是一定要學么 如果倆條件都滿足 時間其實不是問題 人的進步又不是線性的 也許是對數(shù)曲線也許是指數(shù)曲線
作者: TTQ001    時間: 2020-6-21 23:18
要很好地學習單片機,需要大量的實踐經(jīng)驗,例如編程和制作。
作者: 17803856022    時間: 2020-6-22 07:40
理論+實踐,從中深層次理解。。
作者: gxslxxm    時間: 2020-6-22 09:48
我認為基礎(chǔ)的硬件知識對理解mcu的深入程度有一定的輔助作用。一:基礎(chǔ)模塊的修煉。(第一個階段不要看匯編,用c語言。匯編門檻太高容易一下子把脆弱的積極性和興趣給打擊掉。)
1:建議找個單片機的教程,先把單片機的基礎(chǔ)模塊摸一遍,理解基礎(chǔ)的mcu模塊(通論本質(zhì)上就是串行和并行的區(qū)別。了解本質(zhì)之后就是規(guī)則的問題而已)
1.2:輸出輸出端口操作、定時器、pwm模塊、adc轉(zhuǎn)換、模擬iic、模擬spi、硬件uart、外部中斷、系統(tǒng)時鐘、看門狗(你可能用的stc的mcu,系統(tǒng)時鐘可以暫時不弄,iic、spi的先用模擬的方式來。)
2:寄存器的操作一定要自己寫,可以參考別人寫得來拓展一下思路,(對mcu寄存器基本的操作可以參考新唐n76e003的demo程序,官網(wǎng)有資料。)
2.1:這個過程中你買一個邏輯分析儀(30rmb)、串口接收的ch340(8rmb),如果有示波器更好、暫時不強求。
3:每一個模塊需要一些硬件知識,一般的教程都會講解的;A(chǔ)的按鍵操作濾波、lcd的現(xiàn)實在這個過程中會學。
通訊部分優(yōu)先uart、后spi、iic。uart不要模擬實現(xiàn),用mcu模塊方式實現(xiàn)(模擬只是讓你對它了解更深刻,一般使用不模擬)。iic、spi先用模擬方式實現(xiàn)后用mcu模塊方式實現(xiàn)。
二:代碼編寫修煉
1:因為上述的操作是mcu的模塊操作,接下來是怎么優(yōu)化和讓你程序變得貼近應(yīng)用。需要對編寫代碼方式的修煉。
1.1:c51的語言的修煉暫時不需要做的太深刻。指針和結(jié)構(gòu)體慢慢來(先看懂,再慢慢會用),基礎(chǔ)的if else siwtch while break  for #define 差不多就夠了(可能有遺漏一時想不起來)
2:看看《單片機編程魔法師》。最基礎(chǔ)的兩個思想要掌握。( 一定要擺脫掉對 delay這種延時超過1ms的用法 ,delay可以用,但是不能延時時間太長,影響程序的并行效率。)
2.1:驅(qū)動的思想/程序分層。
2.2:定時器的多層復用。
2.3:多任務(wù)并行(偽并行)。
三:基礎(chǔ)的模塊會了之后,并行的思想吸收了一些,這樣可以應(yīng)用在項目上。再反推回來去深刻理解mcu的基本原理和硬件的知識。。

作者: 愛你的豬    時間: 2020-6-22 10:48
從簡單的開始做起,從驅(qū)動定時串口中斷等一步步學習,代碼復雜的肯定比簡單的費腦子

作者: NiiBoo    時間: 2020-6-22 11:00
先看單片機原理,再學編程。
作者: 1398653046    時間: 2020-6-22 15:13
找一塊單片機開發(fā)板進行練習?梢宰约夯ㄥX買一塊單片機的開發(fā)板,不需要功能太全,對于初學者來說功能非常多的板子,上面有很多東西你這輩子都用不著。建議有流水燈、數(shù)碼管、獨立鍵盤、矩陣鍵盤、AD或DA(原理一樣)、液晶、蜂鳴器,有這些就差不多了。如果上面提到的這些,你能熟練應(yīng)用,那可以說對于單片機方面的硬件你已經(jīng)入門了,剩下的就是自己練習設(shè)計電路,不斷的積累經(jīng)驗。
作者: a179996496    時間: 2020-6-22 17:17
多做實驗,自己動手去做才會發(fā)現(xiàn)其中隱藏了許多自己沒注意到的各種坑,然后從中找到解決方法,多去看各個寄存器的作用以及單片機的datasheet
作者: 苣茜    時間: 2020-6-22 19:23
大概了解整體框架,后來的實驗設(shè)計,會逼著你學會很多
作者: 想吃魚的蝦    時間: 2020-6-23 09:32
我覺得可以結(jié)合一些實際的需求或者是例子,這樣有了時間節(jié)點要求的話就會倒逼自己去學。再有串口什么的原理可以去b站看視頻學習很快就能學會
作者: drf63329272    時間: 2020-6-23 10:32
找一些自己感興趣的dome入手,這樣的話會更快的有成效
作者: daiya    時間: 2020-6-23 12:19
基礎(chǔ)一定要扎實,以后多看一些別人編的程序就可以了
作者: xxpp2011    時間: 2020-6-25 13:18
自己設(shè)計一個小項目,解決制作過程中實際遇到的問題,就能理解的更透徹。
作者: 是啊啊啊啊啊    時間: 2020-6-25 20:41
還是得自己多動腦思考,把例程跑幾遍后就開始自己試著改程序,后續(xù)慢慢自己寫
作者: 你速度發(fā)生的    時間: 2020-6-25 22:23
謝謝大家的回復,我會繼續(xù)努力的,我發(fā)現(xiàn)應(yīng)該是我在做小項目思考的不夠發(fā)散,我每次都是做完項目之后就沒想了,而我的師兄他想的更深入
作者: 阿銘不吃小辣椒    時間: 2020-6-27 18:45
51單片機新手也就50多個程序去了解,點燈,鍵盤,蜂鳴器,中斷,串口,lcd,ds18b20...,半年能學完自己打一遍就不錯了。
多看視頻,再去看書,視頻有些人已經(jīng)總結(jié)好了,現(xiàn)在跟以前不一樣了,要學會利用網(wǎng)絡(luò),看書只是復習或查缺,看數(shù)據(jù)手冊是做單片機必備的,越早學習怎么看越好。
多參加比賽,做項目是最鍛煉自己和提高最快的,學不下去就是沒有時限和動力,一旦你做下去的時候,你會發(fā)現(xiàn)其實時間會越來越不夠
作者: 草草111111    時間: 2020-7-21 15:20
慢不要緊,只要每一次比上一次有進步就行,快也并不一定好,基礎(chǔ)打牢點更好
作者: HAPPY3    時間: 2022-1-21 14:25
欲速則不達,慢慢來




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