北京科技大学天津学院信息工程系嵌入式系统及应用报告
2.2.3 控制器模块
本课题的控制器模块式采用KL25芯片作为MCU,如图。KL25的 P0.0~P0.7作为四联七段数码管总线;P2.4作为连接DS18B20的I/O口;P1.7作为升温电路的控制端;P2.0~P2.3控制四个七段数码管的亮灭。
2.2. 4电源电路
给系统电路输入一个稳定的+5V
的电源(如图) 输入电源 输出+5V 7805 1000uF 0.1uF 470uF 0.1uF
10
。
北京科技大学天津学院信息工程系嵌入式系统及应用报告
三.软件设计
3.1 DHT11数据的部分程序代码为:
#include \ //包含头文件,相应的板子以及传感器一些信息 #include \ #include
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--; }
11
北京科技大学天津学院信息工程系嵌入式系统及应用报告
}
void QWait() //1us的延时 {
asm(\ //加入汇编操作语句,空操作,主要用于机器周期执行 asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ }
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; }
12
北京科技大学天津学院信息工程系嵌入式系统及应用报告
int putchar (int c) //定义输入字符函数,给的参数是一个整型的数 {
if (c == '\\n') //判断参数c的值是否和'\\n'的值相等 {
while (!UTX0IF); //执行的时候UTX0IF的值是0,此处不是很理解? UTX0IF = 0; //给UTX0IF赋0
U0DBUF = 0x0d; //U0DBUF赋值0x0d = 0000 1011 }
while (!UTX0IF); UTX0IF = 0;
return (U0DBUF = c); //如果c的值不是'\\n'也就是换行符的时候,将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(\ asm(\ } SDA = 1; SCL = 1;
13
北京科技大学天津学院信息工程系嵌入式系统及应用报告
asm(\ 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;
14