终于结束了一个星期的嵌入式课程设计(其实也就五天时间),简单说一下这个培训的过程吧。首先介绍了一下Linux的基础知识吧(反正后来也没用上),包括怎么在虚拟机中操作文件以及一些基础的操作命令,然后介绍了一下C语言基础(嵌入式开发用的也是C语言),最后就开始做东西了,下面开始正文……
貌似学习编程的第一步就是学的C语言吧,大家能走(hun)到这个地步,对C语言也比较了解。本来自信满满,但是写出的代码却差强人意,也就是下面这个错误吧:
for(int i = 0; i < 10; i++){
……
}
在循环条件中定义变量是 C++ 中允许的,但是在嵌入式开发中是不能有丝毫的含糊,这种写法不允许。
可能是使用 VC++6.0 写代码时,经常混淆使用 C++ 和 C 语言才导致现在自己的代码混乱。
课程设计中代码都是在这个软件中进行编写。(对应打开后缀为 .uvprojx 的文件)
所有的工程仿真都是在这个软件中进行的。(对应打开后缀为 .pdsprj 的文件)
STM32F103R6 芯片,这次课设主要使用这个芯片。
灯泡不亮的原因,可能是方向接反了。
开发任务
要求:
1. 完成电路图设计
2. 完成程序设计
功能要求:
3. 实时显示温湿度/光照强度
4. 通过菜单来实灯的亮灭(LED1/LED2),蜂鸣器开关,风扇开关
5. 在底行显示当前硬件状态,开启为1,关闭为0
6. 温度超过28度,或湿度高于85%进行报警
#include "stm32f10x.h"
#include "LQ12864.h"
#include "adc.h"
#include "dth11.h"
#define PUSH_UP 1
#define PUSH_DOWN 2
#define PUSH_OK 3
#define PUSH_NONE 4
void main_delay(int ms)
{
int i,j;
while(ms--)
{
for(i = 0;i < 5;i++)
for(j = 0;j < 512;j++);
}
}
void LED_Init()
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_SetBits(GPIOA,GPIO_Pin_4);
GPIO_SetBits(GPIOA,GPIO_Pin_5);
}
void Buzzer_Init()
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_SetBits(GPIOA,GPIO_Pin_6);
}
void Fan_Init()
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_SetBits(GPIOA,GPIO_Pin_7);
}
void key_init(){
GPIO_InitTypeDef init;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
init.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2| GPIO_Pin_3;
init.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &init);
}
int key_read(){
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0){
return PUSH_UP;
}else if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==0){
return PUSH_DOWN;
}else if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)==0){
return PUSH_OK;
}
else
return PUSH_NONE;
}
unsigned char Bmp013[] =
{
/*------------------------------------------------------------------------------
Ô´Îļþ / ÎÄ×Ö :
¿í¡Á¸ß£¨ÏñËØ£©: 64¡Á32
------------------------------------------------------------------------------*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0x70,0xF8,0xFC,
0x0C,0x04,0x00,0xF8,0xF8,0x00,0x00,0x80,0xC0,0xE0,0x70,0x38,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x38,0x70,0xE0,0x00,0x00,0x00,0x00,0x60,0x60,
0x60,0x60,0xF0,0xF0,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x3F,
0x00,0xC0,0xC0,0x3F,0x3F,0x33,0x33,0x33,0x31,0x30,0x38,0x38,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x38,0x70,0xE0,0x00,0x00,0x60,0x66,0x66,0x66,
0x66,0x66,0x7F,0x7F,0x66,0x66,0x66,0x66,0x66,0x60,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,
0x03,0xFF,0xFF,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0x70,0x00,0x00,0x00,0xFF,0xFF,
0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x1C,0x0E,0x07,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,
0x01,0x01,0x01,0x01,0x31,0x61,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
int main(void)
{
int i = 2;
int j;
int led1 = 0, led2 = 0; //±íʾÁ½¸öµÆµÄ³õʼ״̬£º0¡ª¡ªÃ𣬠1¡ª¡ªÁÁ
int beep = 0; //±íʾ·äÃùÆ÷µÄ״̬
int fan = 0; //±íʾ·çÉȵÄ״̬
uint16_t val;
u8 temp,hum;
char buf_temp[100]={0};
LED_Init();
LCD_Init();
Buzzer_Init();
Fan_Init();
Adc_Init();
DHT11_Init();
key_init();
//LCD_CLS();
//main_delay(1000);
//LCD_CLS();
while(1){
int key;
DHT11_Read_Data(&temp,&hum);
val = Get_Adc();
sprintf(buf_temp,"temp:%d hum:%d",temp,hum);
LCD_P6x8Str(0,0,(unsigned char *)buf_temp);
sprintf(buf_temp,"Light: %d",val);
LCD_P6x8Str(0,1,(unsigned char *)buf_temp);
LCD_P6x8Str(0,2,"LED1 ");
LCD_P6x8Str(0,3,"LED2 ");
LCD_P6x8Str(0,4,"BEEP ");
LCD_P6x8Str(0,5,"FAN ");
LCD_P6x8Str(40,i,"*");
sprintf(buf_temp,"L1:%d L2:%d BP:%d FAN:%d",led1,led2,beep,fan);
LCD_P6x8Str(0,6,(unsigned char *)buf_temp);
if(temp > 28 || hum > 85){
GPIO_ResetBits(GPIOA,GPIO_Pin_6);
GPIO_ResetBits(GPIOA,GPIO_Pin_7);
beep = 1;
fan = 1;
}else{
GPIO_SetBits(GPIOA,GPIO_Pin_6);
GPIO_SetBits(GPIOA,GPIO_Pin_7);
main_delay(100);
key = key_read();
if(key == PUSH_UP){
i--;
if(i < 2){
i = 5;
}
}else if(key == PUSH_DOWN){
i++;
if(i > 5){
i = 2;
}
}else if(key == PUSH_OK){
if(i == 2){
//¿ØÖÆLED1µÄÁÁÃð
if(led1 == 0){
GPIO_ResetBits(GPIOA,GPIO_Pin_4);
led1 = 1;
}else{
GPIO_SetBits(GPIOA,GPIO_Pin_4);
led1 = 0;
}
}else if(i == 3){
//¿ØÖÆLED2µÄÁÁÃð
if(led2 == 0){
GPIO_ResetBits(GPIOA,GPIO_Pin_5);
led2 = 1;
}else{
GPIO_SetBits(GPIOA,GPIO_Pin_5);
led2 = 0;
}
}else if(i == 4){
//¿ØÖÆ·äÃùÆ÷µÄ¿ª¹Ø
if(beep == 0){
GPIO_ResetBits(GPIOA,GPIO_Pin_6);
beep = 1;
}else{
GPIO_SetBits(GPIOA,GPIO_Pin_6);
beep = 0;
}
}else{
//¿ØÖÆ·çÉȵÄÁÁÃð
if(fan == 0){
GPIO_ResetBits(GPIOA,GPIO_Pin_7);
fan = 1;
}else{
GPIO_SetBits(GPIOA,GPIO_Pin_7);
fan = 0;
}
}
}
}
}
}
工程下载地址: 工程文件已经上传至CSDN,点击下载