欧美极品高清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)該怎么學
#include <reg51.h>
#include "temp.h"
#include <stdio.h>
void LcdDisplay(int);
void UsartConfiguration(void);
/*******************************************************************************
* 函數(shù)名 : main
* 函數(shù)功能 : 主函數(shù)
* 輸入 : 無
* 輸出 : 無
*******************************************************************************/
void main()
{
UsartConfiguration();//初始化
EA=1; //打開總中斷
while(1)
{
LcdDisplay(Ds18b20ReadTemp());
Delay1ms(100);//0.1s鐘刷一次
}
}
/*******************************************************************************
* 函數(shù)名 : LcdDisplay()
* 函數(shù)功能 : LCD顯示讀取到的溫度
* 輸入 : v
* 輸出 : 無
*******************************************************************************/
void LcdDisplay(int temp) //lcd顯示
{
static int q=0;
int i=0;
char datas[] = {0, 0, 0, 0, 0}; //定義數(shù)組
float tp;
temp=temp-1;
tp=temp;
tp=tp*0.0625+0.5;
// temp=tp*0.0625*100+0.5;
// tp=(float)temp/100;
printf("第%d次測量的溫度為:+%0.2f\n",q++,tp);
}
/*******************************************************************************
* 函 數(shù) 名 :UsartConfiguration()
* 函數(shù)功能 :設(shè)置串口
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void UsartConfiguration(void)
{
TMOD=0x20;//即0010 0000,定時器/計數(shù)器1,工作方式2
TH1=0xfd;//設(shè)置波特率為9600
TL1=0xfd;
TR1=1;//啟動定時器/計數(shù)器1
SCON=0x50; //0101 0000.串口工作方式1,允許串行控制
PCON=0x00;//設(shè)置SMOD=0
IE=0x90; //CPU允許中斷,串行允許中斷
TI=1;//
}
而我自己的
/*******************************************************************************
注意事項:
根據(jù)自己使用的LCD1602是否帶有轉(zhuǎn)接板,如果帶有轉(zhuǎn)接板的即為4位,需在LCD.H頭文件中
將宏#define LCD1602_4PINS打開,我們這里使用的LCD1602是8位,所以默認將該宏注釋。
接線說明:(開發(fā)攻略每個實驗章節(jié)內(nèi)的實驗現(xiàn)象都有對應(yīng)的接線圖說明)
LCD1602接線參考LCD1602液晶顯示實驗接線圖
DS18B20傳感器接線參考DS18B20溫度傳感器實驗接線圖
實驗操作:
LCD1602上顯示采集的溫度,同時
打開串口調(diào)試助手,將串口波特率選擇9600,打開串口,此時在串口上就會顯示采集的溫度,串口截圖參考文件夾下。
*******************************************************************************/
#include<reg51.h>
#include"lcd.h"
#include"temp.h"
#include<intrins.h> //因為要用到左右移函數(shù),所以加入這個頭文件
typedef unsigned int u16; //對數(shù)據(jù)類型進行聲明定義
typedef unsigned char u8;
sbit beep=P1^1;
uchar i;
int n=0;
uchar CNCHAR[17] = "第1次測試溫度為:";
uchar lx[1]="1";
void LcdDisplay(int);
void UsartConfiguration();
sbit LSA=P0^7;
sbit LSB=P2^3;
sbit LSC=P2^4;
/*******************************************************************************
* 函 數(shù) 名 : delay
* 函數(shù)功能 : 延時函數(shù),i=1時,大約延時10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函數(shù)名 : main
* 函數(shù)功能 : 主函數(shù)
* 輸入 : 無
* 輸出 : 無
*******************************************************************************/
void main()
{
UsartConfiguration();
LcdInit(); //初始化LCD1602
LcdWriteCom(0x88); //寫地址 80表示初始地址
LcdWriteData('C');
while(1)
{
LcdDisplay(Ds18b20ReadTemp());
if((Ds18b20ReadTemp()>480)||(Ds18b20ReadTemp()<400))
{
for(i=0;i<120;i++)
{
beep=~beep;
delay(100);
};
}
else
{
;
};
// Delay1ms(1000);//1s鐘刷一次
}
}
/*******************************************************************************
* 函數(shù)名 : LcdDisplay()
* 函數(shù)功能 : LCD顯示讀取到的溫度
* 輸入 : v
* 輸出 : 無
*******************************************************************************/
void LcdDisplay(int temp) //lcd顯示
{
unsigned char i, datas[] = {0, 0, 0, 0, 0}; //定義數(shù)組
float tp;
if(temp< 0) //當溫度值為負數(shù)
{
LcdWriteCom(0x80); //寫地址 80表示初始地址
SBUF='-';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while(!TI); //等待發(fā)送數(shù)據(jù)完成
TI=0; //清除發(fā)送完成標志位
LcdWriteData('-'); //顯示負
//因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
temp=temp-1;
temp=~temp;
tp=temp;
temp=tp*0.0625*100+0.5;
//留兩個小數(shù)點就*100,+0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點
//后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
//算由?.5,還是在小數(shù)點后面。
}
else
{
LcdWriteCom(0x80); //寫地址 80表示初始地址
LcdWriteData('+'); //顯示正
SBUF='+';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while(!TI); //等待發(fā)送數(shù)據(jù)完成
TI=0; //清除發(fā)送完成標志位
tp=temp;//因為數(shù)據(jù)處理有小數(shù)點所以將溫度賦給一個浮點型變量
//如果溫度是正的那么,那么正數(shù)的原碼就是補碼它本身
temp=tp*0.0625*100+0.5;
//留兩個小數(shù)點就*100,+0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點
//后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
//算加上0.5,還是在小數(shù)點后面。
}
datas[0] = temp / 10000;
datas[1] = temp % 10000 / 1000;
datas[2] = temp % 1000 / 100;
datas[3] = temp % 100 / 10;
datas[4] = temp % 10;
LcdWriteCom(0x82); //寫地址 80表示初始地址
LcdWriteData('0'+datas[0]); //百位
SBUF = '0'+datas[0];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while (!TI); //等待發(fā)送數(shù)據(jù)完成
TI = 0;
LcdWriteCom(0x83); //寫地址 80表示初始地址
LcdWriteData('0'+datas[1]); //十位
SBUF = '0'+datas[1];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while (!TI); //等待發(fā)送數(shù)據(jù)完成
TI = 0;
LcdWriteCom(0x84); //寫地址 80表示初始地址
LcdWriteData('0'+datas[2]); //個位
SBUF = '0'+datas[2];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while (!TI); //等待發(fā)送數(shù)據(jù)完成
TI = 0;
LcdWriteCom(0x85); //寫地址 80表示初始地址
LcdWriteData('.'); //顯示 ‘.’
SBUF = '.';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while (!TI); //等待發(fā)送數(shù)據(jù)完成
TI = 0;
LcdWriteCom(0x86); //寫地址 80表示初始地址
LcdWriteData('0'+datas[3]); //顯示小數(shù)點
SBUF = '0'+datas[3];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while (!TI); //等待發(fā)送數(shù)據(jù)完成
TI = 0;
LcdWriteCom(0x87); //寫地址 80表示初始地址
LcdWriteData('0'+datas[4]); //顯示小數(shù)點
SBUF = '0'+datas[4];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while (!TI); //等待發(fā)送數(shù)據(jù)完成
TI = 0;
for(i=0; i<17; i++)
{
SBUF = CNCHAR[i];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while (!TI); //等待發(fā)送數(shù)據(jù)完成
TI = 0;
}
if((CNCHAR[2]='1')&&(n<9))我只在這里修改了一下
{
n++;
CNCHAR[2]=lx[0];
lx[0]=lx[0]+1;
}
else
{
CNCHAR[2]='1';
lx[0]='1';
n=0;
}
}
/*******************************************************************************
* 函 數(shù) 名 :UsartConfiguration()
* 函數(shù)功能 :設(shè)置串口
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void UsartConfiguration()
{
SCON=0x50;//設(shè)置串口工作方式1
TMOD=0x20;//設(shè)置計數(shù)器工作方式2
PCON=0x00;//即SMOD=1,波特率不加倍
TH1=0xFD;//計數(shù)器初值。波特率是9600,晶振為11.0592MHz
TL1=0xFD;
// ES=1; //打開接收中斷
// EA=1; //打開總中斷
TR1=1;//打開計數(shù)器
}
復制代碼
作者:
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