|
本帖最后由 你速度發(fā)生的 于 2020-6-21 00:11 編輯
我想咨詢各位大佬,我是19級(jí)大一,我學(xué)習(xí)單片機(jī)有半年左右,對(duì)單片機(jī)的理解只到大概可以看懂,51普中的板子例程也都走了一遍。但是和我一師兄習(xí)單片機(jī)的師兄他就比我深入很多,我們那個(gè)時(shí)候制作一個(gè)小項(xiàng)目LCD1602液晶顯示溫度并設(shè)定溫度上下限,蜂鳴器報(bào)警提示超限。我?guī)熜炙谱鬟@個(gè)程序只有
這是不是說明我學(xué)習(xí)的進(jìn)度慢了他很多,我看單片機(jī)的書看到時(shí)序,串口什么的原理就頭疼,看久了就發(fā)呆去了,求各位大佬支招。主要是想問學(xué)習(xí)單片機(jī)是否要像我?guī)熜帜菢由钊氲膶W(xué)習(xí),我應(yīng)該怎么學(xué)
- #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次測(cè)量的溫度為:+%0.2f\n",q++,tp);
- }
- /*******************************************************************************
- * 函 數(shù) 名 :UsartConfiguration()
- * 函數(shù)功能 :設(shè)置串口
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void UsartConfiguration(void)
- {
-
- TMOD=0x20;//即0010 0000,定時(shí)器/計(jì)數(shù)器1,工作方式2
- TH1=0xfd;//設(shè)置波特率為9600
- TL1=0xfd;
- TR1=1;//啟動(dòng)定時(shí)器/計(jì)數(shù)器1
- SCON=0x50; //0101 0000.串口工作方式1,允許串行控制
- PCON=0x00;//設(shè)置SMOD=0
- IE=0x90; //CPU允許中斷,串行允許中斷
- TI=1;//
- }
- 而我自己的
- /*******************************************************************************
- 注意事項(xiàng):
- 根據(jù)自己使用的LCD1602是否帶有轉(zhuǎn)接板,如果帶有轉(zhuǎn)接板的即為4位,需在LCD.H頭文件中
- 將宏#define LCD1602_4PINS打開,我們這里使用的LCD1602是8位,所以默認(rèn)將該宏注釋。
- 接線說明:(開發(fā)攻略每個(gè)實(shí)驗(yàn)章節(jié)內(nèi)的實(shí)驗(yàn)現(xiàn)象都有對(duì)應(yīng)的接線圖說明)
- LCD1602接線參考LCD1602液晶顯示實(shí)驗(yàn)接線圖
- DS18B20傳感器接線參考DS18B20溫度傳感器實(shí)驗(yàn)接線圖
- 實(shí)驗(yàn)操作:
- LCD1602上顯示采集的溫度,同時(shí)
- 打開串口調(diào)試助手,將串口波特率選擇9600,打開串口,此時(shí)在串口上就會(huì)顯示采集的溫度,串口截圖參考文件夾下。
- *******************************************************************************/
- #include<reg51.h>
- #include"lcd.h"
- #include"temp.h"
- #include<intrins.h> //因?yàn)橐玫阶笥乙坪瘮?shù),所以加入這個(gè)頭文件
- typedef unsigned int u16; //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
- typedef unsigned char u8;
- sbit beep=P1^1;
- uchar i;
- int n=0;
- uchar CNCHAR[17] = "第1次測(cè)試溫度為:";
- 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í)函數(shù),i=1時(shí),大約延時(shí)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) //當(dāng)溫度值為負(fù)數(shù)
- {
- LcdWriteCom(0x80); //寫地址 80表示初始地址
- SBUF='-';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
- while(!TI); //等待發(fā)送數(shù)據(jù)完成
- TI=0; //清除發(fā)送完成標(biāo)志位
- LcdWriteData('-'); //顯示負(fù)
- //因?yàn)樽x取的溫度是實(shí)際溫度的補(bǔ)碼,所以減1,再取反求出原碼
- temp=temp-1;
- temp=~temp;
- tp=temp;
- temp=tp*0.0625*100+0.5;
- //留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
- //后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
- //算由?.5,還是在小數(shù)點(diǎn)后面。
-
- }
- else
- {
- LcdWriteCom(0x80); //寫地址 80表示初始地址
- LcdWriteData('+'); //顯示正
- SBUF='+';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
- while(!TI); //等待發(fā)送數(shù)據(jù)完成
- TI=0; //清除發(fā)送完成標(biāo)志位
- tp=temp;//因?yàn)閿?shù)據(jù)處理有小數(shù)點(diǎn)所以將溫度賦給一個(gè)浮點(diǎn)型變量
- //如果溫度是正的那么,那么正數(shù)的原碼就是補(bǔ)碼它本身
- temp=tp*0.0625*100+0.5;
- //留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
- //后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
- //算加上0.5,還是在小數(shù)點(diǎn)后面。
- }
- 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]); //個(gè)位
- 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ù)點(diǎn)
- SBUF = '0'+datas[3];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
- while (!TI); //等待發(fā)送數(shù)據(jù)完成
- TI = 0;
- LcdWriteCom(0x87); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[4]); //顯示小數(shù)點(diǎn)
- 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è)置計(jì)數(shù)器工作方式2
- PCON=0x00;//即SMOD=1,波特率不加倍
- TH1=0xFD;//計(jì)數(shù)器初值。波特率是9600,晶振為11.0592MHz
- TL1=0xFD;
- // ES=1; //打開接收中斷
- // EA=1; //打開總中斷
- TR1=1;//打開計(jì)數(shù)器
- }
復(fù)制代碼
|
|