久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

新手學習單片機進度很慢,應該如何學習?

  [復制鏈接]
跳轉到指定樓層
樓主
ID:695930 發表于 2020-6-20 20:31 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 你速度發生的 于 2020-6-21 00:11 編輯

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

這是不是說明我學習的進度慢了他很多,我看單片機的書看到時序,串口什么的原理就頭疼,看久了就發呆去了,求各位大佬支招。主要是想問學習單片機是否要像我師兄那樣深入的學習,我應該怎么學
  1. #include <reg51.h>
  2. #include "temp.h"
  3. #include <stdio.h>
  4. void LcdDisplay(int);
  5. void UsartConfiguration(void);
  6. /*******************************************************************************
  7. * 函數名         : main
  8. * 函數功能     : 主函數
  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. * 函數名         : LcdDisplay()
  25. * 函數功能     : 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}; //定義數組
  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. * 函 數 名         :UsartConfiguration()
  45. * 函數功能     :設置串口
  46. * 輸    入         : 無
  47. * 輸    出         : 無
  48. *******************************************************************************/
  49. void UsartConfiguration(void)
  50. {

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


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

  68. 實驗操作:
  69. LCD1602上顯示采集的溫度,同時
  70. 打開串口調試助手,將串口波特率選擇9600,打開串口,此時在串口上就會顯示采集的溫度,串口截圖參考文件夾下。
  71. *******************************************************************************/
  72. #include<reg51.h>
  73. #include"lcd.h"
  74. #include"temp.h"
  75. #include<intrins.h>  //因為要用到左右移函數,所以加入這個頭文件
  76. typedef unsigned int u16;   //對數據類型進行聲明定義
  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. * 函 數 名         : delay
  90. * 函數功能     : 延時函數,i=1時,大約延時10us
  91. *******************************************************************************/
  92. void delay(u16 i)
  93. {
  94. while(i--);
  95. }
  96. /*******************************************************************************
  97. * 函數名         : main
  98. * 函數功能     : 主函數
  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. * 函數名         : LcdDisplay()
  128. * 函數功能     : LCD顯示讀取到的溫度
  129. * 輸入           : v
  130. * 輸出           : 無
  131. *******************************************************************************/
  132. void LcdDisplay(int temp)   //lcd顯示
  133. {
  134.    unsigned char i, datas[] = {0, 0, 0, 0, 0}; //定義數組
  135. float tp;  
  136. if(temp< 0)    //當溫度值為負數
  137.    {
  138.     LcdWriteCom(0x80);  //寫地址 80表示初始地址
  139.   SBUF='-';//將接收到的數據放入到發送寄存器
  140.   while(!TI);            //等待發送數據完成
  141.   TI=0;       //清除發送完成標志位
  142.      LcdWriteData('-');    //顯示負
  143.   //因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
  144.   temp=temp-1;
  145.   temp=~temp;
  146.   tp=temp;
  147.   temp=tp*0.0625*100+0.5;
  148.   //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
  149.   //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  150.   //算由?.5,還是在小數點后面。

  151.    }
  152.   else
  153.    {   
  154.     LcdWriteCom(0x80);  //寫地址 80表示初始地址
  155.      LcdWriteData('+');   //顯示正
  156.   SBUF='+';//將接收到的數據放入到發送寄存器
  157.   while(!TI);            //等待發送數據完成
  158.   TI=0;       //清除發送完成標志位
  159.   tp=temp;//因為數據處理有小數點所以將溫度賦給一個浮點型變量
  160.   //如果溫度是正的那么,那么正數的原碼就是補碼它本身
  161.   temp=tp*0.0625*100+0.5;
  162.   //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
  163.   //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  164.   //算加上0.5,還是在小數點后面。
  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];//將接收到的數據放入到發送寄存器
  174. while (!TI);            //等待發送數據完成
  175. TI = 0;

  176. LcdWriteCom(0x83);   //寫地址 80表示初始地址
  177. LcdWriteData('0'+datas[1]); //十位
  178. SBUF = '0'+datas[1];//將接收到的數據放入到發送寄存器
  179. while (!TI);            //等待發送數據完成
  180. TI = 0;
  181. LcdWriteCom(0x84);  //寫地址 80表示初始地址
  182. LcdWriteData('0'+datas[2]); //個位
  183. SBUF = '0'+datas[2];//將接收到的數據放入到發送寄存器
  184. while (!TI);            //等待發送數據完成
  185. TI = 0;
  186. LcdWriteCom(0x85);  //寫地址 80表示初始地址
  187. LcdWriteData('.');   //顯示 ‘.’
  188. SBUF = '.';//將接收到的數據放入到發送寄存器
  189. while (!TI);            //等待發送數據完成
  190. TI = 0;
  191. LcdWriteCom(0x86);   //寫地址 80表示初始地址
  192. LcdWriteData('0'+datas[3]); //顯示小數點  
  193. SBUF = '0'+datas[3];//將接收到的數據放入到發送寄存器
  194. while (!TI);            //等待發送數據完成
  195. TI = 0;
  196. LcdWriteCom(0x87);   //寫地址 80表示初始地址
  197. LcdWriteData('0'+datas[4]); //顯示小數點
  198. SBUF = '0'+datas[4];//將接收到的數據放入到發送寄存器
  199. while (!TI);            //等待發送數據完成
  200. TI = 0;
  201. for(i=0; i<17; i++)
  202. {
  203.    SBUF = CNCHAR[i];//將接收到的數據放入到發送寄存器
  204.   while (!TI);            //等待發送數據完成
  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. * 函 數 名         :UsartConfiguration()
  222. * 函數功能     :設置串口
  223. * 輸    入         : 無
  224. * 輸    出         : 無
  225. *******************************************************************************/
  226. void UsartConfiguration()
  227. {
  228.   SCON=0x50;//設置串口工作方式1
  229. TMOD=0x20;//設置計數器工作方式2
  230. PCON=0x00;//即SMOD=1,波特率不加倍
  231. TH1=0xFD;//計數器初值。波特率是9600,晶振為11.0592MHz
  232. TL1=0xFD;
  233. // ES=1;      //打開接收中斷
  234. // EA=1;      //打開總中斷
  235. TR1=1;//打開計數器
  236. }
復制代碼




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

使用道具 舉報

沙發
ID:748788 發表于 2020-6-21 10:53 | 只看該作者
你的師兄除了跟著課本走,還多動了腦子,在原有程序的基礎上加了新的東西。這正是你缺少的。編程就要多動腦子,而且是越用越好用
回復

使用道具 舉報

板凳
ID:235200 發表于 2020-6-21 11:36 | 只看該作者
說明與單片機相關的基礎知識薄弱,需要進一步加深學習
回復

使用道具 舉報

地板
ID:785582 發表于 2020-6-21 12:47 | 只看該作者
先從理論知識開始,硬啃,然后結合編程實踐應該會好很多
回復

使用道具 舉報

5#
ID:47286 發表于 2020-6-21 18:06 | 只看該作者
這事的關鍵不在技術本身 在你自己 你是特想學么 你是一定要學么 如果倆條件都滿足 時間其實不是問題 人的進步又不是線性的 也許是對數曲線也許是指數曲線
回復

使用道具 舉報

6#
ID:420836 發表于 2020-6-21 23:18 | 只看該作者
要很好地學習單片機,需要大量的實踐經驗,例如編程和制作。
回復

使用道具 舉報

7#
ID:785561 發表于 2020-6-22 07:40 | 只看該作者
理論+實踐,從中深層次理解!!!
回復

使用道具 舉報

8#
ID:162664 發表于 2020-6-22 09:48 | 只看該作者
我認為基礎的硬件知識對理解mcu的深入程度有一定的輔助作用。一:基礎模塊的修煉。(第一個階段不要看匯編,用c語言。匯編門檻太高容易一下子把脆弱的積極性和興趣給打擊掉。)
1:建議找個單片機的教程,先把單片機的基礎模塊摸一遍,理解基礎的mcu模塊(通論本質上就是串行和并行的區別。了解本質之后就是規則的問題而已)
1.2:輸出輸出端口操作、定時器、pwm模塊、adc轉換、模擬iic、模擬spi、硬件uart、外部中斷、系統時鐘、看門狗(你可能用的stc的mcu,系統時鐘可以暫時不弄,iic、spi的先用模擬的方式來。)
2:寄存器的操作一定要自己寫,可以參考別人寫得來拓展一下思路,(對mcu寄存器基本的操作可以參考新唐n76e003的demo程序,官網有資料。)
2.1:這個過程中你買一個邏輯分析儀(30rmb)、串口接收的ch340(8rmb),如果有示波器更好、暫時不強求。
3:每一個模塊需要一些硬件知識,一般的教程都會講解的。基礎的按鍵操作濾波、lcd的現實在這個過程中會學。
通訊部分優先uart、后spi、iic。uart不要模擬實現,用mcu模塊方式實現(模擬只是讓你對它了解更深刻,一般使用不模擬)。iic、spi先用模擬方式實現后用mcu模塊方式實現。
二:代碼編寫修煉
1:因為上述的操作是mcu的模塊操作,接下來是怎么優化和讓你程序變得貼近應用。需要對編寫代碼方式的修煉。
1.1:c51的語言的修煉暫時不需要做的太深刻。指針和結構體慢慢來(先看懂,再慢慢會用),基礎的if else siwtch while break  for #define 差不多就夠了(可能有遺漏一時想不起來)
2:看看《單片機編程魔法師》。最基礎的兩個思想要掌握。( 一定要擺脫掉對 delay這種延時超過1ms的用法 ,delay可以用,但是不能延時時間太長,影響程序的并行效率。)
2.1:驅動的思想/程序分層。
2.2:定時器的多層復用。
2.3:多任務并行(偽并行)。
三:基礎的模塊會了之后,并行的思想吸收了一些,這樣可以應用在項目上。再反推回來去深刻理解mcu的基本原理和硬件的知識。。
回復

使用道具 舉報

9#
ID:677449 發表于 2020-6-22 10:48 | 只看該作者
從簡單的開始做起,從驅動定時串口中斷等一步步學習,代碼復雜的肯定比簡單的費腦子
回復

使用道具 舉報

10#
ID:786442 發表于 2020-6-22 11:00 | 只看該作者
先看單片機原理,再學編程。
回復

使用道具 舉報

11#
ID:786687 發表于 2020-6-22 15:13 | 只看該作者
找一塊單片機開發板進行練習。可以自己花錢買一塊單片機的開發板,不需要功能太全,對于初學者來說功能非常多的板子,上面有很多東西你這輩子都用不著。建議有流水燈、數碼管、獨立鍵盤、矩陣鍵盤、AD或DA(原理一樣)、液晶、蜂鳴器,有這些就差不多了。如果上面提到的這些,你能熟練應用,那可以說對于單片機方面的硬件你已經入門了,剩下的就是自己練習設計電路,不斷的積累經驗。
回復

使用道具 舉報

12#
ID:355173 發表于 2020-6-22 17:17 | 只看該作者
多做實驗,自己動手去做才會發現其中隱藏了許多自己沒注意到的各種坑,然后從中找到解決方法,多去看各個寄存器的作用以及單片機的datasheet
回復

使用道具 舉報

13#
ID:772467 發表于 2020-6-22 19:23 來自手機 | 只看該作者
大概了解整體框架,后來的實驗設計,會逼著你學會很多
回復

使用道具 舉報

14#
ID:787349 發表于 2020-6-23 09:32 | 只看該作者
我覺得可以結合一些實際的需求或者是例子,這樣有了時間節點要求的話就會倒逼自己去學。再有串口什么的原理可以去b站看視頻學習很快就能學會
回復

使用道具 舉報

15#
ID:147017 發表于 2020-6-23 10:32 | 只看該作者
找一些自己感興趣的dome入手,這樣的話會更快的有成效
回復

使用道具 舉報

16#
ID:91521 發表于 2020-6-23 12:19 | 只看該作者
基礎一定要扎實,以后多看一些別人編的程序就可以了
回復

使用道具 舉報

17#
ID:452950 發表于 2020-6-25 13:18 | 只看該作者
自己設計一個小項目,解決制作過程中實際遇到的問題,就能理解的更透徹。
回復

使用道具 舉報

18#
ID:363342 發表于 2020-6-25 20:41 | 只看該作者
還是得自己多動腦思考,把例程跑幾遍后就開始自己試著改程序,后續慢慢自己寫
回復

使用道具 舉報

19#
ID:695930 發表于 2020-6-25 22:23 | 只看該作者
謝謝大家的回復,我會繼續努力的,我發現應該是我在做小項目思考的不夠發散,我每次都是做完項目之后就沒想了,而我的師兄他想的更深入
回復

使用道具 舉報

20#
ID:682197 發表于 2020-6-27 18:45 | 只看該作者
51單片機新手也就50多個程序去了解,點燈,鍵盤,蜂鳴器,中斷,串口,lcd,ds18b20...,半年能學完自己打一遍就不錯了。
多看視頻,再去看書,視頻有些人已經總結好了,現在跟以前不一樣了,要學會利用網絡,看書只是復習或查缺,看數據手冊是做單片機必備的,越早學習怎么看越好。
多參加比賽,做項目是最鍛煉自己和提高最快的,學不下去就是沒有時限和動力,一旦你做下去的時候,你會發現其實時間會越來越不夠
回復

使用道具 舉報

21#
ID:733205 發表于 2020-7-21 15:20 | 只看該作者
慢不要緊,只要每一次比上一次有進步就行,快也并不一定好,基礎打牢點更好
回復

使用道具 舉報

22#
ID:981034 發表于 2022-1-21 14:25 | 只看該作者
欲速則不達,慢慢來
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一区二 | 午夜爱爱毛片xxxx视频免费看 | 国产精品免费一区二区三区四区 | 玖玖国产精品视频 | 免费一级欧美在线观看视频 | 欧美成年网站 | 免费的日批视频 | 欧美在线国产精品 | 国产日韩欧美中文 | 在线亚洲精品 | 一区二区三区中文字幕 | 91久久综合 | 国产亚洲人成a在线v网站 | 91免费在线 | 91精品国产色综合久久不卡蜜臀 | 超碰日本| 久久的色| 精品欧美一区二区精品久久 | 黄片毛片免费观看 | 欧美日韩1区2区3区 欧美久久一区 | 国产视频精品免费 | 中文字幕综合 | 午夜精品一区二区三区在线观看 | 日日天天 | 国产精品毛片一区二区在线看 | 精品久久一区 | 国产精品成人一区二区三区夜夜夜 | 欧美性jizz18性欧美 | 欧美极品视频 | 911精品美国片911久久久 | 日韩成年人视频在线 | 欧美激情国产日韩精品一区18 | 亚洲国产片 | 人人鲁人人莫人人爱精品 | 在线成人精品视频 | 九九久久久 | 中文字幕第二区 | 久久久久成人精品免费播放动漫 | 久久精品小视频 | 一区观看| 精品久久影院 |