嵌入式板级系统设计【课设】

简介: 嵌入式板级系统设计【课设】

前言

2023-11-20 08:49:57

以下内容源自《【创作模板五】》

仅供学习交流使用

笔记【嵌入式板级系统设计】

资料学习

面包板焊接注意

P1:mini USB

JP4:usb转串口

U1:电源

U3:

R1~7:电阻 规格 (型号阻值)

LED1~4:灯 正负极

按钮:正反

焊接教程

老司机焊接纯干货分享,让你焊接不迷路,很适合零基础小白

焊接电路板

基础代码

GPIO 外部中断 定时中断 三合一

/****************************************  2015-05-28  **************************************************
**                               
**                                      XY Embeded Lib.
**                               
**
**--------------File Info-------------------------------------------------------------------------------
** File name:     main.c
** Last modified Date:  2015-05-28
** Last Version:    1.0
** Descriptions:    The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by:      ZQL
** Created date:    2015-05-28
** Version:         1.0
** Descriptions:    The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:     ZQL
** Modified date:   2015-05-28
** Version:
** Descriptions:    GPIO输出实验,控制LED1闪烁。
**
********************************************************************************************************/
#include "lpc213x.h"
#include "TypeDef.h"
extern  void IRQEnable(void);
extern  void IRQDisable(void);
extern  void FIQEnable(void);
extern  void FIQDisable(void);
const uint32 LED1 = (1 << 17);  // P1.18控制LED1,低电平点亮 
const uint32 LED2 = (1 << 18);  // P1.18控制LED1,低电平点亮 
const uint32 LED3 = (1 << 19);  // P1.18控制LED1,低电平点亮 
const uint32 LED4 = (1 << 20);  // P1.18控制LED1,低电平点亮
const uint32 LEDS = LED1 | LED2 | LED3 | LED4;  // P1.18控制LED1,低电平点亮
const uint32 LEDS1 = LED1 | LED3;
const uint32 LEDS2 = LED2 | LED4;
const uint32 KEY1 = (1 << 16);  // P1.18控制LED1,低电平点亮 
const uint32 KEY2 = (1 << 14);  // P1.18控制LED1,低电平点亮 
const uint32 KEY3 = (1 << 15);  // P1.18控制LED1,低电平点亮 
const uint32 KEYS = (0x07<<14);
uint32 j;
//定时器
#define Fosc  11059200          // 开发板外时钟频率
#define Fcclk (5*Fosc)        // Keil 默认的CPU时钟设置
#define Fpclk (Fcclk/4)       // Keil 默认的DEV时钟设置
/*
*********************************************************************************************************
** 函数名称 :DelayNS()
** 函数功能 :长软件延时
** 入口参数 :dly  延时参数,值越大,延时越久
** 出口参数 :无
*********************************************************************************************************
*/
void DelayNS (uint32 dly)
{
  uint32 i;
  for ( ; dly>0; dly--)
    for (i=0; i<50000; i++);
}
void __irq IRQ_Eint0_ISR (void)
{
  volatile uint32 Vkey=0;
  IO0SET = LEDS;
  /*  等待外部中断信号恢复为高电平,若信号保持为低电平,中断标志会一直置位。*/
  while ((EXTINT & 0x01) != 0)//循环检测外部中断信号是否恢复为高电平,若信号保持为低电平,中断标志位会一直置位。
  {
    EXTINT = 0x01;        /* 清除EINT0中断标志    */
  }
  VICVectAddr = 0;        /* 向量中断结束       */
}
/*
*********************************************************************************************************
** 函数名称 :main()
** 函数功能 :用P1.18控制LED1,让LED1闪烁。
** 调试说明 :需将跳线JP12和LED1短接。
*********************************************************************************************************
*/
int main (void)
{
//  PINSEL1 = 0x00000000;     // 设置管脚连接GPIO,此行可省掉-----复位默认P0[31:16]连接GPIO
  volatile uint32 Vkey=0;
  PINSEL0 = PINSEL0 & (~0xf0000000);  // P1[25:16]连接GPIO,此行可省掉-----复位默认P1[25:16]连接GPIO
  PINSEL1 = 0x00000001; // P1[25:16]连接GPIO,此行可省掉-----复位默认P1[25:16]连接GPIO
  IO0DIR  |= LEDS;
//中断程序
  EXTMODE = 0x00;         /* 设置EINT0为'低电平'方式触发。       */
  EXTPOLAR = 0x00; 
//  EXTMODE = 0x00;         /* 设置EINT0为负沿方式触发。        */
//  EXTPOLAR = 0x00;
                          /* 极性寄存器使用默认值0 */
  IRQEnable();          // 使能IRQ中断
  //IRQDisable();           // 禁能IRQ中断
  /* 打开EINT0中断(使用向量中断) */
  VICIntSelect   = 0x00000000;  /* 设置所有中断分配为IRQ中断*/
  VICVectCntl0   = 0x20 | 0x0e; /* 分配外部中断0到向量中断0  */
  VICVectAddr0   = (uint32)IRQ_Eint0_ISR;   /* 设置中断服务程序地址 */
  EXTINT         = 0x01;        /* 清除EINT0中断标志        */
  VICIntEnable   = 1 << 0x0e;   /* 使能EINT0中断            */
/* 定时器0初始化 */
  T0CTCR &= 0xf0;       // Set T0 as Timer mode
  T0TC   = 0;           // 定时器设置为0  
  T0PR   = 0;           // 时钟不分频
  T0MCR  = 0x03;        // 设置T0MR0匹配后复位T0TC,并产生中断标志
  //T0MR0  = Fpclk / 2;   // 0.5秒钟定时 --- 匹配目标值
  T0MR0  = Fpclk/4 ;      // 0.25秒钟定时 --- 匹配目标值
  T0TCR  = 0x01;        // 启动定时器  
/* 定时器1初始化 */ 
  T1CTCR &= 0xf0;       // Set T0 as Timer mode
  T1TC   = 0;           // 定时器设置为0  
  T1PR   = 0;           // 时钟不分频
  T1MCR  = 0x03;        // 设置T0MR0匹配后复位T0TC,并产生中断标志
  //T0MR0  = Fpclk / 2;   // 0.5秒钟定时 --- 匹配目标值
  T1MR0  = Fpclk/2 ;      // 0.5秒钟定时 --- 匹配目标值
  T1TCR  = 0x01;        // 启动定时器  
  while(1){
    Vkey = (IO0PIN & KEYS);
    //读取开关
    if ((Vkey & KEY2) == 0)
      j=2;
    else if ((Vkey & KEY3) == 0)
      j=3;
    if(j == 3){
      //定时
      int temp = 10;
        while (temp--)
        {
          if ((T0IR & 0x01) == 0x01)
          {
            if ((IO0SET & LEDS1) == 0)
              IO0SET = LEDS1;     // 关闭BEEP 
            else
              IO0CLR = LEDS1;
            T0IR = 0x01;          // 清除中断标志 
          }
          if ((T1IR & 0x01) == 0x01)
          {
            if ((IO0SET & LEDS2) == 0)
              IO0SET = LEDS2;     // 关闭BEEP 
            else
              IO0CLR = LEDS2;
            T1IR = 0x01;          // 清除中断标志 
          }
          DelayNS(25);
        }
    }
    else if(j == 2){
      //流水灯
        IO0CLR = LED1;
        DelayNS(25);
        IO0SET = LED1;      
        DelayNS(25);
        IO0CLR = LED2;
        DelayNS(25);
        IO0SET = LED2;      
        DelayNS(25);
        IO0CLR = LED3;
        DelayNS(25);
        IO0SET = LED3;      
        DelayNS(25);
        IO0CLR = LED4;
        DelayNS(25);
        IO0SET = LED4;      
        DelayNS(25);
    }
    else {
      //全亮
      IO0CLR = LEDS;
    }
  }
    //return 0;
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

串口

/****************************************  2015-05-28  **************************************************
**                               
**                                      XY Embeded Lib.
**                                     QQ: 646938309
**
**--------------File Info-------------------------------------------------------------------------------
** File name:     main.c
** Last modified Date:  2015-05-28
** Last Version:    1.0
** Descriptions:    The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by:      Zhao QuanLiang
** Created date:    2015-05-28
** Version:         1.0
** Descriptions:    The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:     Zhao QuanLiang
** Modified date:   2015-05-28
** Version:
** Descriptions:    UART0 monitor the data input and send the data back.
**                  本例程中修改了startup.s 的 128th 行,as ‘PLLCFG_Val EQU 0x23’ 原为 0x24
**                  (0x23 --- Fcclk 4*Fosc, 0x24 ---- Fcclk 5*Fosc, Fosc = 11059200Hz)
********************************************************************************************************/
#include "lpc213x.h"
#include "TypeDef.h"
extern  void IRQEnable(void);
extern  void IRQDisable(void);
extern  void FIQEnable(void);
extern  void FIQDisable(void);
#define Fpclk 11059200      // 
#define LINE_L 8      // 行长
#define PAGE_L 2      // 段长
/* 定义串口模式设置数据结构 */
typedef struct UartMode
{
  uint8 datab;    // 字长度,5/6/7/8可选
  uint8 stopb;    // 停止位,1/2可选
  uint8 parity;   // 奇偶校验位,0-无校验,1-奇校验,2-偶校验
}UARTMODE;
volatile uint8 rcv_buf[8];    // UART0数据接收缓冲区
volatile uint8 rcv_new;     // 接收新数据标志
volatile uint8 zql_U0IIR;
volatile uint8 zql_chNum;
/*
*********************************************************************************************************
** 函数名称 :IRQ_UART0()
** 函数功能 :串口0接收中断服务程序
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void __irq IRQ_UART0 (void)
{
  uint8 i=0;
  rcv_new = 1;      // 设置接收到新的数据标志
  zql_U0IIR = (U0IIR >> 1) & 0x07;
  switch (zql_U0IIR){       // 分析中断源 
  case 0x02:
    for (i=0; i<8; i++)
      rcv_buf[i] = U0RBR;   // 读取FIFO的数据,并清除中断  
    break;
  case 0x06:
    while((U0LSR & 0x01) == 0x01)
      {
        rcv_buf[i] = U0RBR;   // 读取FIFO的数据,并清除中断
        i++;
      }
    break;
  } 
  zql_chNum=i;
  zql_U0IIR=U0IIR;
  VICVectAddr = 0x00;     // 中断处理结束
}
/*
*********************************************************************************************************
** 函数名称 :UART0_SendByte()
** 函数功能 :向串口0发送1字节数据
** 入口参数 :dat  要发送的数据
** 出口参数 :无
*********************************************************************************************************
*/
void UART0_SendByte (uint8 dat)
{
  U0THR = dat;  // 要发送的数据
}
/*
*********************************************************************************************************
** 函数名称 :UART0_SendBuf()
** 函数功能 :向串口发送8字节数据
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void UART0_SendBuf (void)
{
  uint8 i;
  for (i=0; i<zql_chNum; i++)
    UART0_SendByte(rcv_buf[i]);
  UART0_SendByte(0x0d);
  UART0_SendByte(0x0a);
  while ((U0LSR & 0x20) == 0);  // 等待数据发送完毕
}
/*
*********************************************************************************************************
** 函数名称 :UART0_Init()
** 函数功能 :串口初始化,设置工作模式和波特率。
** 入口参数 :baud 波特率
**        set 模式设置(UARTMODE数据结构)
** 出口参数 :1-初始化成功,  0-初始化失败
*********************************************************************************************************
*/
int8 UART0_Init (uint32 baud, UARTMODE set)
{
  uint32 bak;
  /* 参数检查与过滤 */
  if ((baud ==0 ) || (baud > 115200)) return (0);
  if ((set.datab <5) || (set.datab > 8))  return (0);
  if ((set.stopb == 0) || (set.stopb > 2))  return (0);
  if (set.parity > 4) return (0);
  /* 设置串口波特率 */
  U0LCR = 0x80;           // DLAB = 1 
  bak   = (Fpclk >> 4) / baud;
  U0DLM = bak >> 8;
  U0DLL = bak & 0xFF;
  /* 设置串口模式 */
  bak   = set.datab - 5;        // 设置字长-----准备 UxLCR[1:0] 数据
  if (set.stopb == 2)         // 设置停止位长-----准备 UxLCR[2:2] 数据
    bak |= 0x04;  // 判断是否为2位停止位
  if (set.parity != 0)        // 设置有无'奇偶校验'-----准备 UxLCR[3:3] 数据
  {
    set.parity = set.parity - 1;
    bak |= 0x08;
  }
  bak |= set.parity << 4;       // 设置奇偶校验-----准备 UxLCR[3:3] 数据
  U0LCR = bak;    // 装载UxLCR,  且UxLCR[7:7]=0 , 即 位 DLAB=0
  return (1);
}
/*
*********************************************************************************************************
** 函数名称 :main()
** 函数功能 :从串口UART0接收字符串"ABCDEFGH",并发送回上位机显示。
** 调试说明 :需要PC串口显示终端软件如EasyARM.exe。
*********************************************************************************************************
*/
int main (void)
{
  UARTMODE set;
  set.datab  = 8;
  set.stopb  = 1;
  set.parity = 0;
  rcv_new = 0;
  zql_chNum=0;
  PINSEL0 = 0x00000005;       // 设置GPIO_0[1:0]连接到UART0
  UART0_Init(115200, set);      // 串口初始化
  U0FCR = 0x81;           // 使能FIFO,并设置触发点为8字节
  //U0FCR = 0x01;           // 使能FIFO,并设置触发点为1字节
  //U0IER = 0x01;           // 允许RBR中断,即接收中断
  U0IER = 0x05;           // 允许RBR和字符超时中断,即接收中断
  IRQEnable();            // 使能IRQ中断
  /* 使能UART0中断 */
  VICIntSelect = 0x00000000;      // 设置所有的通道为IRQ中断
  VICVectCntl0 = 0x20 | 0x06;     // UART0分配到IRQ slot0,即最高优先级
  VICVectAddr0 = (uint32)IRQ_UART0; // 设置UART0向量地址
  VICIntEnable = 1 << 0x06;     // 使能UART0中断
  while (1)
  {
    if (rcv_new == 1)       // 如果有UART接收,则转发
    { 
      rcv_new =0;
      UART0_SendBuf();
    }
  }
  //  return 0;
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

综合实验 风扇控制系统

#include "lpc213x.h"
#include "TypeDef.h"
extern void IRQEnable(void);
extern void IRQDisable(void);
extern void FIQEnable(void);
extern void FIQDisable(void);
const uint32 INA = (1 << 17);    // P0.17控制INA,控制风扇转速的输入信号线
const uint32 INB = (1 << 18);    // P0.18控制INB,控制风扇转向的输入信号线。
const uint32 LEDS = INA | INB;    // P1.18控制LED1和LED2,低电平点亮
const uint32 LEDS1 = INA;
const uint32 LEDS2 = INB;
const uint32 KEY1 = (1 << 16);    // P1.16控制KEY1,低电平按下
const uint32 KEY2 = (1 << 14);    // P1.14控制KEY2,低电平按下
const uint32 KEY3 = (1 << 15);    // P1.15控制KEY3,低电平按下
const uint32 KEYS = (0x07 << 14);
uint32 j;
//定时器
#define Fosc  11059200                  // 开发板外时钟频率
#define Fcclk (5*Fosc)              // Keil 默认的CPU时钟设置
#define Fpclk (Fcclk/4)             // Keil 默认的DEV时钟设置
/*
*********************************************************************************************************
** 函数名称 :DelayNS()
** 函数功能 :长软件延时
** 入口参数 :dly    延时参数,值越大,延时越久
** 出口参数 :无
*********************************************************************************************************
*/
void DelayNS(uint32 dly)
{
    uint32 i;
    for (; dly > 0; dly--)
        for (i = 0; i < 50000; i++)
            ;
}
void __irq IRQ_Eint0_ISR(void)
{
    volatile uint32 Vkey = 0;
    //全灭
    IO0SET=LEDS;
    /*     等待外部中断信号恢复为高电平,若信号保持为低电平,中断标志会一直置位。*/
    while ((EXTINT & 0x01) != 0) //循环检测外部中断信号是否恢复为高电平,若信号保持为低电平,中断标志位会一直置位。
    {
        EXTINT = 0x01;                 /* 清除EINT0中断标志        */
    }
    VICVectAddr = 0;                /* 向量中断结束                */
}
/*
*********************************************************************************************************
** 函数名称 :main()
** 函数功能 :用P1.18控制LED1,让LED1闪烁。
** 调试说明 :需将跳线JP12和LED1短接。
*********************************************************************************************************
*/
int main(void)
{
    volatile uint32 Vkey = 0;
    PINSEL0 = PINSEL0 & (~0xf0000000); // P1[25:16]连接GPIO,此行可省掉-----复位默认P1[25:16]连接GPIO
    PINSEL1 = 0x00000001;               // P1[25:16]连接GPIO,此行可省掉-----复位默认P1[25:16]连接GPIO
    IO0DIR |= LEDS;
    //中断程序
    EXTMODE = 0x00;                 /* 设置EINT0为'低电平'方式触发。                */
    EXTPOLAR = 0x00;
    VICIntSelect = 0x00000000;    /* 设置所有中断分配为IRQ中断*/
    VICVectCntl0 = 0x20 | 0x0e;    /* 分配外部中断0到向量中断0 */
    VICVectAddr0 = (uint32)IRQ_Eint0_ISR;    /* 设置中断服务程序地址    */
    EXTINT = 0x01;                /* 清除EINT0中断标志                */
    VICIntEnable = 1 << 0x0e;    /* 使能EINT0中断                        */
    /* 定时器0初始化 */
    T0CTCR &= 0xf0;          // Set T0 as Timer mode
    T0TC = 0;                     // 定时器设置为0
    T0PR = 0;                     // 时钟不分频
    T0MCR = 0x03;                // 设置T0MR0匹配后复位T0TC,并产生中断标志
    T0MR0 = Fpclk / 4;            // 0.25秒钟定时 --- 匹配目标值
    T0TCR = 0x01;                // 启动定时器
    while (1) {
        Vkey = (IO0PIN & KEYS);
        //读取开关
        if ((Vkey & KEY2) == 0)
            j = 2;                  
        else if ((Vkey & KEY3) == 0)
            j = 3;
        else
            j = 0;
        if (j == 2) {
            //风扇转动
            IO0SET = INB;
            if ((T0IR & 0x01) == 0x01)
            {
               if ((IO0SET & LEDS1) == 0)
                    IO0SET = LEDS1;            // 关闭BEEP
               else
                    IO0CLR = LEDS1;
               T0IR = 0x01;                    // 清除中断标志
             }
        }
        else if (j == 3) {
            //定时
            int temp = 10;
            while (temp--)
            {
                IO0SET = INB;
                if ((T0IR & 0x01) == 0x01)
                {
                    if ((IO0SET & LEDS1) == 0)
                        IO0SET = LEDS1;            // 关闭BEEP
                    else
                        IO0CLR = LEDS1;
                    T0IR = 0x01;                    // 清除中断标志
                }
                DelayNS(25);
            }
            IO0CLR = LEDS;
        }
    }
}

下板

三合一

K1 控制 外部中断 按下四个灯全灭

K2 流水灯

K3 定时中断 K1和K3 0.25秒闪烁 K2和K4 0.5秒闪烁

窗口

打开XCOM

设置波特率9600

打开窗口

发送文字,会接受文字

综合实验

初始 Led1和Led2全量 风扇不转

K1 外部中断 使Led1和Led2 灭

K2 使得Led1亮 Led2灭 风扇转动

K3 使得风扇转动一段时间,就停

最后

2023-12-7 20:01:13

我们都有光明的未来

不必感谢我,也不必记得我

祝大家考研上岸

祝大家工作顺利

祝大家得偿所愿

祝大家如愿以偿

点赞收藏关注哦

相关文章
|
6月前
|
Web App开发 传感器 Linux
【嵌入式软件工程师面经】STM32单片机
【嵌入式软件工程师面经】STM32单片机
161 1
|
7月前
|
传感器 数据采集 物联网
基于STM32的光敏传感器数据采集系统-嵌入式系统与设计课程设计2
基于STM32的光敏传感器数据采集系统-嵌入式系统与设计课程设计
736 0
|
JavaScript 芯片
聊聊身边的嵌入式,2年质保期刚过就翘辫子,这是什么骚设计?
聊聊身边的嵌入式,2年质保期刚过就翘辫子,这是什么骚设计?
|
7月前
|
传感器 图形学 芯片
嵌入式单片机上练手的小型图形库
嵌入式单片机上练手的小型图形库
54 0
|
7月前
|
传感器
毕业设计 基于51单片机自动智能浇花系统设计
毕业设计 基于51单片机自动智能浇花系统设计
|
7月前
|
传感器 数据采集 物联网
基于STM32的光敏传感器数据采集系统-嵌入式系统与设计课程设计1
基于STM32的光敏传感器数据采集系统-嵌入式系统与设计课程设计
559 0
|
存储 数据采集 监控
|
消息中间件 Windows
单片机程序构架
单片机程序构架
|
存储 大数据 芯片
嵌入式单片机智能药盒设计(含代码)
嵌入式单片机智能药盒设计(含代码)
嵌入式单片机智能药盒设计(含代码)
|
传感器 存储 算法
嵌入式单片机智能手表实验之优秀
嵌入式单片机智能手表实验之优秀
201 0
嵌入式单片机智能手表实验之优秀