導航:首頁 > 操作系統 > 單片機串口和gio

單片機串口和gio

發布時間:2022-05-21 07:12:59

A. 8051單片機課程設計實訓教材的目錄

第1章緒論
1.1課程設計所需硬體工具
1.2專題製作所需軟體使用工具
1.38051程序開發測試平台
1.4使用免費匯編編譯
1.589CXX燒錄模擬器操作實例
1.6自製8051微電腦單板IO51
1.7IO51操作實例
1.8以Windows98工作模式結合DOS模式來執行
第2章8051課程設計中的基本軟硬體設計
2.18051各種基本的硬體設計
2.2工作指示燈LED
2.38051延遲時間計算
2.4基本按鍵設計
2.5建立8051通信介面
2.6簡易8051調試界面
2.7壓電喇叭測試
2.8鍵盤掃描
2.9掃描控制七段顯示器
2.10LCD介面控制
2.118051定時器模式的工作
2.12定時器模式0測試
2.13定時器模式1測試
2.14定時器模式2測試
2.15以定時器產生各種頻率的聲音
2.16以定時器演奏一段旋律
第3章帶單片機的LCD時鍾
3.1功能說明
3.2控制電路
3.3控製程序
第4章定時鬧鈴
4.1功能說明
4.2控制電路
4.3控製程序
第5章定時鬧鈴LCD
5.1功能說明
5.2控制電路
5.3控製程序
第6章音樂倒數定時器
6.1功能說明
6.2控制電路
6.3控製程序
第7章密碼鎖控制
7.1功能說明
7.2控制電路
7.3控製程序
第8章可存儲式電子琴
8.1功能說明
8.2控制電路
8.3控製程序
第9章8051八音盒
9.1功能說明
9.2控制電路
9.3控製程序
第10章紅外線遙控器研究
10.1紅外線遙控器動作原理
10.2如何觀察紅外線遙控器信號
10.3紅外線遙控器解碼功能說明
10.4控制電路
10.5控製程序
第11章紅外線家電遙控
11.1功能說明
11.2控制電路
11.3控製程序
第12章8051伺服機控制
12.1伺服機工作原理及改裝
12.2功能說明
12.3控制電路
12.4控製程序
第13章8051伺服車控制
13.1功能說明
13.2伺服車組裝及實驗
13.3控制電路
13.4控製程序
第14章紅外線遙控伺服車
14.1功能說明
14.2遙控伺服車組裝及實驗
14.3控制電路
14.4控製程序
第15章無線電家電遙控
15.1功能說明
15.2遙控編碼解碼控制
15.3控制電路
15.4控製程序
第16章8051聲控設計
16.1聲控基本知識介紹
16.2系統組成
16.3聲控模塊介紹
16.4基本控制電路
16.5基本控製程序
16.6聲控課題設計
附錄A簡易穩壓電源製作
附錄B本書實驗所需軟硬體工具及零件
附錄C8051內部控制寄存器介紹
附錄D8051指令集
附錄E如何自製8051單板
附錄F課程設計報告參考內容
附錄GIO51控制板窗口版驅動程序使用說明
附錄H如何使用KEIL8051開發系統匯編和編譯程序及調試
附錄IEPM8989CXX燒錄模擬器特性
附錄JIO518051IO控制板特性
附錄KVCMM聲控模塊特性
附錄LIO51控制板完整電路圖
附錄M需要從網站下載的相關資料的使用說明
附錄N硬體介面板版權聲明及如何訂購

B. 嵌入式溫濕度感測器C語言代碼求幫忙注釋

#include "ioCC2430.h" //包含頭文件,相應的板子以及感測器一些信息

#include "hal.h"

#include <math.h>

//#include <intrins.h>

#include <stdio.h>


typedef union //定義聯合體,

{

unsigned int i;

float f;

} value; //定義聯合體類型名稱為value


#define noACK 0

#define ACK 1

#define STATUS_REG_W 0x06 //0x06 = 0000 0110

#define STATUS_REG_R 0x07 //0x07 = 0000 0111

#define MEASURE_TEMP 0x03 //0x03 = 0000 0011

#define MEASURE_HUMI 0x05 //0x05 = 0000 0101

#define RESET 0x1e //0x1e = 0001 1110

#define SDA P1_6 //定義SDA代表的是P1_6腳

#define SCL P1_7

#define begin P2_0

unsigned char d1,d2,d3,d4,d5,d6,d7; //定義無符號字元型變數


void Wait(unsigned int ms) //定義wait函數,主要用於軟體循環,延時作用

{

unsigned char g,k;

while(ms)

{

for(g = 0;g <= 167; g++)

{

for(k = 0;k <= 48; k++);

}

ms--;

}

}


void QWait() //1us的延時

{

asm("NOP"); //加入匯編操作語句,空操作,主要用於機器周期執行

asm("NOP");

asm("NOP");

asm("NOP");

asm("NOP");

asm("NOP");

asm("NOP");

asm("NOP");

asm("NOP");

asm("NOP");

asm("NOP");

}


void initUART(void) //初始化單片機的串口

{

IO_PER_LOC_USART0_AT_PORT0_PIN2345(); //具體函數的定義與用法,你得參考頭文件中的程序代碼了

IO_DIR_PORT_PIN(1, 6, IO_OUT);

IO_DIR_PORT_PIN(1, 7, IO_OUT);

//IO_IMODE_PORT_PIN(1, 6, IO_IMODE_TRI);

//IO_IMODE_PORT_PIN(1, 7, IO_IMODE_TRI);

IO_DIR_PORT_PIN(2, 0, IO_OUT);

IO_FUNC_PORT_PIN(2, 0, IO_FUNC_GIO);

//SET_MAIN_CLOCK_SOURCE(RC);

SET_MAIN_CLOCK_SOURCE(CRYSTAL);

UART_SETUP(0, 115200, HIGH_STOP); //設置傳輸數據的波特率115200

UTX0IF = 1;

U0CSR |= 0XC7; //U0CSR = U0CSR | 0x1010 0111 (進行位或操作)

IEN0 |= 0x84;

SDA = 1;

SCL = 0;

}


int putchar (int c) //定義輸入字元函數,給的參數是一個整型的數

{

if (c == ' ') //判斷參數c的值是否和' '的值相等

{

while (!UTX0IF); //執行的時候UTX0IF的值是0,此處不是很理解?

UTX0IF = 0; //給UTX0IF賦0

U0DBUF = 0x0d; //U0DBUF賦值0x0d = 0000 1011

}

while (!UTX0IF);

UTX0IF = 0;

return (U0DBUF = c); //如果c的值不是' '也就是換行符的時候,將c的值傳遞到U0DBUF寄存器中

}


char s_write_byte(unsigned char value) //定義寫位元組函數(8位)

{

unsigned char i,error = 0;

for (i = 0x80;i > 0;i /= 2) //i 賦初始值0x80 = 128, 執行判斷是i > 0,執行語句是i = i / 2; 即i = 128,64,32,16,8,4,2,1,0.5(0),8位

{

if (i & value)

SDA = 1;

else

SDA = 0;

SCL = 1; //此時SCL埠處,也就是p1_7引腳處是高電平

QWait(); //因為寫入需要時間,所以程序之中加入下面幾條語句

QWait();

QWait();

QWait();

QWait();

SCL = 0; //使能p1_7眼角處低電平,使的數據寫入(具體需要看單片機控制晶元的手冊

asm("NOP");

asm("NOP");

}

SDA = 1;

SCL = 1;

asm("NOP");

error = SDA;

QWait();

QWait();

QWait();

SDA = 1;

SCL = 0;

return error;

}


char s_read_byte(unsigned char ack) //讀取數據,按照位元組位的順序讀取(8位)128 = 1000 0000 ,64 = 0100 0000, 32 = 0010 0000 ,16 = 0001 0000, 8 = 0000 1000, 4 = 0000 0100 , 2 = 0000 0010, 1 = 0000 0001

{

unsigned char i,val = 0;

SDA= 1;

for(i = 0x80;i > 0;i /= 2) //同上

{

SCL = 1;

if (SDA) //判斷SDA處是否有高電平

val = (val | i); //進行或操作

else

val = (val | 0x00);

SCL = 0;

QWait();

QWait();

QWait();

QWait();

QWait();

}

SDA = !ack;

SCL = 1;

QWait();

QWait();

QWait();

QWait();

QWait();

SCL = 0;

SDA = 1;


return val; //返回讀取到的數據,一個位元組,八位

}


void s_transstart(void) //傳輸使能函數,就是給控制器引腳處相應電平,使對應模塊工作

{

SDA = 1;

SCL = 0;

QWait();

QWait();

SCL = 1;

QWait();

QWait();

SDA = 0;

QWait();

QWait();

SCL = 0;

QWait();

QWait();

QWait();

QWait();

QWait();

SCL = 1;

QWait();

QWait();

SDA = 1;

QWait();

QWait();

SCL = 0;

QWait();

QWait();

}


void s_connectionreset(void) //復位操作函數

{

unsigned char i;

SDA = 1;

SCL = 0;

for(i = 0;i < 9; i++)

{

SCL = 1;

QWait();

QWait();

SCL = 0;

QWait();

QWait();

}

s_transstart(); //調用開始函數

}


char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode) //函數,主要統計傳輸的數據個數

{

unsigned er = 0;

unsigned int i,j;

s_transstart();

switch(mode)

{

case 3 :er += s_write_byte(3);

break;

case 5 :er += s_write_byte(5);

break;

default :break;

}

for(i = 0;i < 65535;i++)

{

for(j = 0;j < 65535;j++)

{if(SDA == 0)

{

break;

}

}

if(SDA == 0)

{

break;

}


}

if(SDA)

{

er += 1;

}

*(p_value) = s_read_byte(ACK);

*(p_value + 1) = s_read_byte(ACK);

*p_checksum = s_read_byte(noACK);

d6 = *(p_value);

d7=*(p_value + 1);

return er;

}


void calc_sth11(float *p_humidity ,float *p_temperature)//計算溫度值

{

const float C1 =- 4.0;

const float C2 =+ 0.0405;

const float C3 =- 0.0000028;

const float T1 =+ 0.01;

const float T2 =+ 0.00008;

float rh =* p_humidity;

float t =* p_temperature;

float rh_lin;

float rh_true;

float t_C;

t_C = t * 0.01 - 44.0 ;

rh_lin = C3 * rh * rh + C2 * rh + C1;

rh_true = (t * 0.01 - 40.0 - 25) * (T1 + T2 * rh) + rh_lin;

if(rh_true > 100)

{

rh_true = 100;

}

if(rh_true < 0.1)

{

rh_true = 0.1;

}

*p_temperature = t_C;

*p_humidity = rh_true;

}


void main() //主函數

{

value humi_val,temp_val; //聲明兩個聯合體變數

unsigned char error,checksum; //聲明兩個無符號的字元型變數

initUART(); //初始化串口

P1INP |= 0xC0; //初始化P1引腳 , 0xC0 = 1010 0000 ,使P1_7和P1_5引腳為1

begin = 0;

s_connectionreset();

while(1) //無限循環操作

{

error = 0;

error += s_measure((unsigned char*) &humi_val.i,&checksum,5); //讀入串口的數據進行溫度的計算

d1 = d6;

d2 = d7;

error += s_measure((unsigned char*) &temp_val.i,&checksum,3);

d3 = d6;

d4 = d7;

if(error != 0)

s_connectionreset();

else

{

humi_val.f = (float)humi_val.i;

temp_val.f = (float)temp_val.i;

humi_val.f = d1 * 256 + d2;

temp_val.f = d3 * 256 + d4;

calc_sth11(&humi_val.f,&temp_val.f);

printf("temp:%5.1fC humi:%5.1f%% ",temp_val.f,humi_val.f);

// printf("t1:%x h1:%x ",d1,d2);

//printf("t2:%x h2:%x ",d3,d4);

}

Wait(150);

}

}


閱讀全文

與單片機串口和gio相關的資料

熱點內容
javajunit4for 瀏覽:843
華為伺服器如何進陣列卡配置 瀏覽:433
apache伺服器ip地址訪問 瀏覽:718
如何買到安卓手機預裝軟體 瀏覽:537
冤罪百度雲不要壓縮 瀏覽:85
蘇州雲存儲伺服器 瀏覽:173
解壓收納原聲 瀏覽:384
java注冊驗證 瀏覽:374
火花app怎麼上推薦 瀏覽:980
什麼app能游戲投屏到電視上 瀏覽:455
伺服器託管到雲端是什麼意思 瀏覽:835
app保存草稿怎麼用 瀏覽:808
安卓如何進入proumb 瀏覽:144
主機虛擬雲伺服器 瀏覽:619
刪除分區加密的空間會不會恢復 瀏覽:706
京東app客戶上門怎麼看搜索量 瀏覽:741
怎麼在農行app購買黃金 瀏覽:46
c型開發板和單片機 瀏覽:146
虛擬機建立用戶的模板文件夾 瀏覽:904
無錫代碼編程培訓班 瀏覽:633