本帖最后由 你速度發生的 于 2020-6-21 00:11 編輯
我想咨詢各位大佬,我是19級大一,我學習單片機有半年左右,對單片機的理解只到大概可以看懂,51普中的板子例程也都走了一遍。但是和我一師兄習單片機的師兄他就比我深入很多,我們那個時候制作一個小項目LCD1602液晶顯示溫度并設定溫度上下限,蜂鳴器報警提示超限。我師兄他制作這個程序只有
這是不是說明我學習的進度慢了他很多,我看單片機的書看到時序,串口什么的原理就頭疼,看久了就發呆去了,求各位大佬支招。主要是想問學習單片機是否要像我師兄那樣深入的學習,我應該怎么學
- #include <reg51.h>
- #include "temp.h"
- #include <stdio.h>
- void LcdDisplay(int);
- void UsartConfiguration(void);
- /*******************************************************************************
- * 函數名 : main
- * 函數功能 : 主函數
- * 輸入 : 無
- * 輸出 : 無
- *******************************************************************************/
- void main()
- {
-
- UsartConfiguration();//初始化
- EA=1; //打開總中斷
- while(1)
- {
- LcdDisplay(Ds18b20ReadTemp());
- Delay1ms(100);//0.1s鐘刷一次
-
- }
- }
- /*******************************************************************************
- * 函數名 : LcdDisplay()
- * 函數功能 : LCD顯示讀取到的溫度
- * 輸入 : v
- * 輸出 : 無
- *******************************************************************************/
- void LcdDisplay(int temp) //lcd顯示
- {
- static int q=0;
- int i=0;
- char datas[] = {0, 0, 0, 0, 0}; //定義數組
- 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);
- }
- /*******************************************************************************
- * 函 數 名 :UsartConfiguration()
- * 函數功能 :設置串口
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void UsartConfiguration(void)
- {
-
- TMOD=0x20;//即0010 0000,定時器/計數器1,工作方式2
- TH1=0xfd;//設置波特率為9600
- TL1=0xfd;
- TR1=1;//啟動定時器/計數器1
- SCON=0x50; //0101 0000.串口工作方式1,允許串行控制
- PCON=0x00;//設置SMOD=0
- IE=0x90; //CPU允許中斷,串行允許中斷
- TI=1;//
- }
- 而我自己的
- /*******************************************************************************
- 注意事項:
- 根據自己使用的LCD1602是否帶有轉接板,如果帶有轉接板的即為4位,需在LCD.H頭文件中
- 將宏#define LCD1602_4PINS打開,我們這里使用的LCD1602是8位,所以默認將該宏注釋。
- 接線說明:(開發攻略每個實驗章節內的實驗現象都有對應的接線圖說明)
- LCD1602接線參考LCD1602液晶顯示實驗接線圖
- DS18B20傳感器接線參考DS18B20溫度傳感器實驗接線圖
- 實驗操作:
- LCD1602上顯示采集的溫度,同時
- 打開串口調試助手,將串口波特率選擇9600,打開串口,此時在串口上就會顯示采集的溫度,串口截圖參考文件夾下。
- *******************************************************************************/
- #include<reg51.h>
- #include"lcd.h"
- #include"temp.h"
- #include<intrins.h> //因為要用到左右移函數,所以加入這個頭文件
- typedef unsigned int u16; //對數據類型進行聲明定義
- 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;
- /*******************************************************************************
- * 函 數 名 : delay
- * 函數功能 : 延時函數,i=1時,大約延時10us
- *******************************************************************************/
- void delay(u16 i)
- {
- while(i--);
- }
- /*******************************************************************************
- * 函數名 : main
- * 函數功能 : 主函數
- * 輸入 : 無
- * 輸出 : 無
- *******************************************************************************/
- 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鐘刷一次
- }
- }
- /*******************************************************************************
- * 函數名 : LcdDisplay()
- * 函數功能 : LCD顯示讀取到的溫度
- * 輸入 : v
- * 輸出 : 無
- *******************************************************************************/
- void LcdDisplay(int temp) //lcd顯示
- {
- unsigned char i, datas[] = {0, 0, 0, 0, 0}; //定義數組
- float tp;
- if(temp< 0) //當溫度值為負數
- {
- LcdWriteCom(0x80); //寫地址 80表示初始地址
- SBUF='-';//將接收到的數據放入到發送寄存器
- while(!TI); //等待發送數據完成
- TI=0; //清除發送完成標志位
- LcdWriteData('-'); //顯示負
- //因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
- temp=temp-1;
- temp=~temp;
- tp=temp;
- temp=tp*0.0625*100+0.5;
- //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
- //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
- //算由?.5,還是在小數點后面。
-
- }
- else
- {
- LcdWriteCom(0x80); //寫地址 80表示初始地址
- LcdWriteData('+'); //顯示正
- SBUF='+';//將接收到的數據放入到發送寄存器
- while(!TI); //等待發送數據完成
- TI=0; //清除發送完成標志位
- tp=temp;//因為數據處理有小數點所以將溫度賦給一個浮點型變量
- //如果溫度是正的那么,那么正數的原碼就是補碼它本身
- temp=tp*0.0625*100+0.5;
- //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
- //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
- //算加上0.5,還是在小數點后面。
- }
- 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];//將接收到的數據放入到發送寄存器
- while (!TI); //等待發送數據完成
- TI = 0;
-
- LcdWriteCom(0x83); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[1]); //十位
- SBUF = '0'+datas[1];//將接收到的數據放入到發送寄存器
- while (!TI); //等待發送數據完成
- TI = 0;
- LcdWriteCom(0x84); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[2]); //個位
- SBUF = '0'+datas[2];//將接收到的數據放入到發送寄存器
- while (!TI); //等待發送數據完成
- TI = 0;
- LcdWriteCom(0x85); //寫地址 80表示初始地址
- LcdWriteData('.'); //顯示 ‘.’
- SBUF = '.';//將接收到的數據放入到發送寄存器
- while (!TI); //等待發送數據完成
- TI = 0;
- LcdWriteCom(0x86); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[3]); //顯示小數點
- SBUF = '0'+datas[3];//將接收到的數據放入到發送寄存器
- while (!TI); //等待發送數據完成
- TI = 0;
- LcdWriteCom(0x87); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[4]); //顯示小數點
- SBUF = '0'+datas[4];//將接收到的數據放入到發送寄存器
- while (!TI); //等待發送數據完成
- TI = 0;
- for(i=0; i<17; i++)
- {
- SBUF = CNCHAR[i];//將接收到的數據放入到發送寄存器
- while (!TI); //等待發送數據完成
- 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;
- }
- }
- /*******************************************************************************
- * 函 數 名 :UsartConfiguration()
- * 函數功能 :設置串口
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void UsartConfiguration()
- {
- SCON=0x50;//設置串口工作方式1
- TMOD=0x20;//設置計數器工作方式2
- PCON=0x00;//即SMOD=1,波特率不加倍
- TH1=0xFD;//計數器初值。波特率是9600,晶振為11.0592MHz
- TL1=0xFD;
- // ES=1; //打開接收中斷
- // EA=1; //打開總中斷
- TR1=1;//打開計數器
- }
復制代碼
|