基于MSP430G2553的模拟风扇控制系统

 本次设计是通过CCS和AD15设计的一个模拟风扇控制系统,该系统主要包括独立键盘电路模块、直流稳压电路模块、程序下载电路模块、数码管显示模块、三极管LED驱动模块、电机驱动电路模块。本次设计方MSP430G2553为控制核心,合理应用该单片机的资源,以最好的方式实现本设计,并且达到了设计要求中的各项指标。关键词:MSP430G2553、直流电机、MAX7219驱动、PWM控制

话不多说,直接上代码:
该代码纯属个人编写,仅供参考,小白一个,哈哈哈哈。当然有好多东西没有封装成函数。

下面展示一些 内联代码片

// A code block
主函数
// An highlighted block
#include <msp430.h>
#include "stdint.h"
#include "SMG.h"
#include "DS18B20.h"
#include "Inital.h"#define Point 0x80const unsigned char tabel[14]={0x7e,    //'0'0x06,    //'1'0x6d,    //'2'0x79,    //'3'0x33,    //'4'0x5b,    //'5'0x5f,    //'6'0x70,    //'7'0x7f,    //'8'0x7b,    //'9'0x01,    //'-'0x4e,    //'C'0x00     //'不显示'
};uint8_t time = 0;   //时间记录
uint8_t cishu = 0;  //50ms*20=1s
uint8_t flag0 = 0;   //模式标志位
uint8_t flag1 = 0;  //时间标志位
uint8_t flag2 = 0;  //判断显示温度标志位
uint8_t model = 0;  //模式
uint8_t Model = 0;  //模式
uint16_t n=0;       //记录当前TACCR2的值
uint8_t Tempreture;//时间显示
void Display1(void)
{uint8_t baiwei,shiwei,gewei;baiwei=time/100;shiwei=time%100/10;gewei=time%10;Write_Max7219(1,tabel[gewei]);Write_Max7219(2,tabel[shiwei]);Write_Max7219(3,tabel[baiwei]);Write_Max7219(4,tabel[0]);
}
//model显示
void Display2(void)
{Write_Max7219(5,tabel[12]);Write_Max7219(6,tabel[10]);Write_Max7219(7,tabel[model]);Write_Max7219(8,tabel[10]);
}
//温度显示
void Display3(void)
{uint8_t ge,shi;shi=Tempreture/10;ge=Tempreture%10;Write_Max7219(1,tabel[11]);Write_Max7219(2,tabel[ge]);Write_Max7219(3,tabel[shi]);Write_Max7219(4,tabel[12]);
}
//初始化
void Display_all0(void)
{Write_Max7219(1,tabel[0]);Write_Max7219(2,tabel[0]);Write_Max7219(3,tabel[0]);Write_Max7219(4,tabel[0]);Write_Max7219(5,tabel[12]);Write_Max7219(6,tabel[10]);Write_Max7219(7,tabel[0]);Write_Max7219(8,tabel[10]);
}/** main.c*/
void main(void)
{WDTCTL = WDTPW | WDTHOLD; // stop watchdog timerInitSystemClock();InitZHDIO();InitPWM();InitTimer0HZD();Init_Max7219_IO();Init_Max7219_();Display_all0();P1OUT &= ~BIT5;P1OUT &= ~BIT6;P1OUT &= ~BIT7;/*开启总中断*/__bis_SR_register(GIE);while(1){Display1();Display2();while(flag2==1){Tempreture = DS18B20_Conert();Display2();Display3();__delay_cycles(2);}__delay_cycles(2);}
}#pragma vector = PORT1_VECTOR
__interrupt void port1_ISR(void)
{__delay_cycles(500000);    //0.1s消抖/*P1.1中断,切换模式*/if(P1IFG&BIT1){P1IFG &= ~BIT1;switch(flag0){case 0:if(time!=0)TA1CCR2 = 400;           //20%else TA1CCR2 = 499;flag0=1;model=1;Model=1;n=400;P1OUT |= BIT5;P1OUT &= ~BIT6;P1OUT &= ~BIT7;break;case 1:if(time!=0)TA1CCR2 = 350;           //30%else TA1CCR2 = 499;flag0=2;model=2;Model=2;n=350;P1OUT |= BIT6;P1OUT &= ~BIT5;P1OUT &= ~BIT7;break;case 2:if(time!=0)TA1CCR2 = 150;           //70%else TA1CCR2 = 499;flag0=0;model=3;Model=3;n=150;P1OUT |= BIT7;P1OUT &= ~BIT5;P1OUT &= ~BIT6;break;default:break;}Display2();}/*P1.2中断,选择时间*/if(P1IFG&BIT2){TA1CCR2 = n;P1IFG &= ~BIT2;TA0CTL &= ~TAIE;         /*关闭定时器中断*/TA0CTL |= TACLR;         /*TAR清零,保证重新从0计数*/switch(flag1){case 0:time=60;flag1=1;cishu=0;    //cishu也清零break;case 1:time=120;flag1=2;cishu=0;break;case 2:time=180;flag1=0;cishu=0;break;default:break;}TA0CTL |= TAIE;         /*开启定时器中断*/}/*P1.3中断,停止*/if(P1IFG&BIT3){P1IFG &= ~BIT3;TA1CCR2=499;    //PWM停止产生time=0;             //时间归0flag1=0;    //保证从60s开始P1OUT &= ~BIT5;P1OUT &= ~BIT6;P1OUT &= ~BIT7;  //指示灯全部熄灭}/*P1.4中断,显示温度*/if(P1IFG&BIT4){P1IFG &= ~BIT4;Tempreture = DS18B20_Conert();if(flag2==1) {flag2=0;model=Model;}   //标志位,判断显示温度还是时间else         {flag2=1;model=4;}}
}/*定时器中断,倒计时*/
#pragma vector = TIMER0_A1_VECTOR
__interrupt void Timer0ZHD(void)
{switch(TA0IV)               //由于寄存器的共用,需要判断到底是哪个中断被执行{                       //读取了TA0IV后,中断标志位自动清零case 0x02:break;case 0x04:break;case 0x0A:if(cishu==20)       //50ms*20=1s{cishu=0;if(time>0)time--;else{time=0;TA1CCR2=499;    //PWM停止产生}}else cishu++;break;default:break;}
}

头文件:
下面展示一些 内联代码片

// A code block
var foo = 'bar';
// An highlighted block
/** DS18B20.h**  Created on: 2020年12月1日*      Author: duwei*/#ifndef DS18B20_H_
#define DS18B20_H_
//P2.4
#define DS18B20_DIR     P2DIR
#define DS18B20_OUT     P2OUT
#define DS18B20_IN      P2IN
#define DS18B20_DQ      BIT4#define DS18B20_H   DS18B20_OUT|=DS18B20_DQ        //DQ置位
#define DS18B20_L   DS18B20_OUT&=~DS18B20_DQ       //DQ复位#define DQ_IN       DS18B20_DIR &= ~DS18B20_DQ     //设置DQ为输入
#define DQ_OUT      DS18B20_DIR |= DS18B20_DQ      //设置DQ为输出
#define READ_DQ     (DS18B20_IN&DS18B20_DQ)        //读DQ电平#define CPU_F ((double)1000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))void DS18B20_init();                              //DS18B20初始化
unsigned char DS18B20_Reset();                    //DS18B20复位
void DS18B20_WriteData(unsigned char);            //写数据到DS18B20
unsigned char DS18B20_ReadData();                 //读数据
uint8_t DS18B20_Conert();                           //转换温度#endif /* DS18B20_H_ */

下面展示一些 内联代码片

// A code block
var foo = 'bar';
// An highlighted block
#include <msp430.h>
#include "stdint.h"
#include "DS18B20.h"/**********************************************************
*DS18B20初始化
*函数名称:DS18B20_Init()
*说明:本初始化程序可以不要,因为18B20在出厂时就被配置为12位精度了
**********************************************************/
void DS18B20_Init()
{DS18B20_Reset();DS18B20_WriteData(0xCC);  // 跳过ROMDS18B20_WriteData(0x4E);  // 写暂存器DS18B20_WriteData(0x64);  // 往暂存器的第三字节中写上限值100℃DS18B20_WriteData(0x00);  // 往暂存器的第四字节中写下限值0℃DS18B20_WriteData(0x7F);  // 将配置寄存器配置为12位精度DS18B20_Reset();
}/**********************************************************
*复位DS18B20(通过存在脉冲可以判断DS1820是否损坏)
*函数名称:DS18B20_Reset()
**********************************************************/
unsigned char DS18B20_Reset()
{unsigned char flag;DQ_OUT;                       //DQ为输出DS18B20_H;delay_us(8);                  //延时8微秒DS18B20_L;                    //拉低总线delay_us(500);                //延时500微秒,产生复位脉冲,必须大于480微秒DS18B20_H;delay_us(80);              //15~60us 后接收 60-240us的存在脉冲,必须大于60微秒DQ_IN;if(READ_DQ)flag=0;           //等待从机 DS18B20 应答(低电平有效)else flag=1;DQ_OUT;delay_us(440);DS18B20_H;return(flag);
}/**********************************************************
*写数据到DS18B20
*函数名称:DS18B20_WriteData()
**********************************************************/
void DS18B20_WriteData(unsigned char wData)
{unsigned char i;DQ_OUT;                     //DQ为输出for (i=8;i>0;i--){DS18B20_L;                  //拉低总线,产生写信号delay_us(15);               //延时在15us~30usif(wData&0x01){DS18B20_H;}             //发送1位else {DS18B20_L;}delay_us(45);               //延时15~60usDS18B20_H;                  //释放总线,等待总线恢复wData>>=1;                  //准备下一位数据的传送}
}/**********************************************************
*从DS18B20中读出数据
*函数名称:DS18B20_ReadData()
**********************************************************/
unsigned char DS18B20_ReadData()
{unsigned char i,TmepData;for(i=8;i>0;i--){TmepData>>=1;             //数据右移DQ_OUT;                   //DQ为输出DS18B20_L;                //拉低总线,产生读信号delay_us(6);DS18B20_H;                //释放总线,准备读数据delay_us(4);DQ_IN;                    //DQ为输入if(READ_DQ){TmepData|=0x80;}delay_us(65);}return TmepData;          //返回读到的数据
}/**********************************************************
*DS18B20转换温度
*函数名称:DS18B20_Conert()
**********************************************************/
uint8_t DS18B20_Conert(void)
{unsigned char TempData1,TempData2,wendu;unsigned int uu;DS18B20_Reset();DS18B20_WriteData(0xCC);       // 跳过ROMDS18B20_WriteData(0x44);       // 开始转换delay_us(500);                 //延时一般在500us不能过小DS18B20_Reset();DS18B20_WriteData(0xCC);       // 跳过ROMDS18B20_WriteData(0xBE);       //读取 RAMTempData1=DS18B20_ReadData();  //读低八位,LS Byte, RAM0TempData2=DS18B20_ReadData();  //读高八位,MS Byte, RAM1delay_ms(200);                 //延时750~900ms,保证工作周期DS18B20_Reset();uu=TempData2;uu <<=8;uu = uu|TempData1;wendu=(uint8_t)(uu*0.00625*10+0.5);return wendu;
}

下面展示一些 内联代码片

// A code block
var foo = 'bar';
// An highlighted block
#ifndef SMG_H_
#define SMG_H_#define Max7219_pinCS_CLR  P2OUT &=~BIT0
#define Max7219_pinCS_SET  P2OUT |=BIT0#define Max7219_pinCLK_CLR  P2OUT &=~BIT1
#define Max7219_pinCLK_SET  P2OUT |=BIT1#define Max7219_pinDIN_CLR  P2OUT &=~BIT2
#define Max7219_pinDIN_SET  P2OUT |=BIT2/* address define */
#define NO_OP              0x00
#define DIGIT0             0x01
#define DIGIT1             0x02
#define DIGIT2             0x03
#define DIGIT3             0x04
#define DIGIT4             0x05
#define DIGIT5             0x06
#define DIGIT6             0x07
#define DIGIT7             0x08
#define DECODE_MODE        0x09
#define INTENSITY          0x0A
#define SCAN_LIMIT         0x0B
#define SHUT_DOWN          0x0C
#define DISPLAY_TEST       0x0F/**********/
void Write_Max7219(uint8_t address,uint8_t data);
void Init_Max7219_(void);
void Init_Max7219_IO(void);#endif /* SMG_H_ */

下面展示一些 内联代码片

// A code block
var foo = 'bar';
// An highlighted block
#include <msp430.h>
#include "stdint.h"
#include "SMG.h"void Write_Max7219(uint8_t address,uint8_t data)
{uint8_t i;Max7219_pinCS_CLR;   //拉低片选线,选中器件//发送地址for(i=0;i<8;i++){Max7219_pinCLK_CLR;__delay_cycles(2);if(address & 0x80){Max7219_pinDIN_SET;}else {Max7219_pinDIN_CLR;}__delay_cycles(2);address=address<<1; //左移一位Max7219_pinCLK_SET;__delay_cycles(2);}//发送数据for(i=0;i<8;i++){Max7219_pinCLK_CLR;__delay_cycles(2);if(data & 0x80){Max7219_pinDIN_SET;}else {Max7219_pinDIN_CLR;}__delay_cycles(2);data=data<<1; //左移一位Max7219_pinCLK_SET;__delay_cycles(2);}Max7219_pinCS_SET; //发送结束,上升沿锁存数据
}void Init_Max7219_(void)
{Write_Max7219(SHUT_DOWN,0x01);           //正常工作状态Write_Max7219(DISPLAY_TEST,0x00);        //测试关Write_Max7219(DECODE_MODE,0x00);         //选用全译码模式Write_Max7219(SCAN_LIMIT,0x07);          //8只LED全用Write_Max7219(INTENSITY,0x04);           //亮度4级
}void Init_Max7219_IO(void)
{P2DIR |= BIT0+BIT1+BIT2;                  //输出模式}

下面展示一些 内联代码片

// A code block
var foo = 'bar';
// An highlighted block
#include <msp430.h>
#include "stdint.h"
#include "Inital.h"void InitSystemClock(void)
{/*配置DCO频率为1MHZ*/DCOCTL = CALDCO_1MHZ;BCSCTL1 = CALBC1_1MHZ;/*配置SMCLK的时钟源为DCO*/BCSCTL2 &= ~SELS;/*配置SMCLK的分频系数置为1*/BCSCTL2 &= ~(DIVS0 | DIVS1);
}void InitZHDIO(void)
{P1DIR &= ~BIT1;             //P1.1输入方向P1REN |= BIT1;              //使能P1.1上拉电阻P1OUT |= BIT1;              //P1.1先置高P1IE |= BIT1;               //打开P1.1中断P1IES |= BIT1;              //设定下降沿触发P1IFG &= ~BIT1;             //中断标志位清零P1DIR &= ~BIT2;             //P1.2输入方向P1REN |= BIT2;              //使能P1.2上拉电阻P1OUT |= BIT2;              //P1.2先置高P1IE |= BIT2;               //打开P1.2中断P1IES |= BIT2;              //设定下降沿触发P1IFG &= ~BIT2;             //中断标志位清零P1DIR &= ~BIT3;             //P1.3输入方向P1REN |= BIT3;              //使能P1.3上拉电阻P1OUT |= BIT3;              //P1.3先置高P1IE |= BIT3;               //打开P1.3中断P1IES |= BIT3;              //设定下降沿触发P1IFG &= ~BIT3;             //中断标志位清零P1DIR &= ~BIT4;             //P1.4输入方向P1REN |= BIT4;              //使能P1.4上拉电阻P1OUT |= BIT4;              //P1.4先置高P1IE |= BIT4;               //打开P1.4中断P1IES |= BIT4;              //设定下降沿触发P1IFG &= ~BIT4;             //中断标志位清零P1DIR |= BIT5;P1DIR |= BIT6;P1DIR |= BIT7;P2REN &= ~BIT5;}void InitTimer0HZD(void)
{TA0CTL |= TASSEL_2;     /*设置时钟源为SMCLK*/TA0CCTL1 |= CAP;        /*比较模式*/TA0CTL |= MC_1;         /*设置工作模式为UP*/TA0CCR0 = 49999;        //50ms 设置定时间隔TA0CTL |= TAIE;         /*开启定时器中断*/TA0CTL &= ~TAIFG;       /*清除中断标志位*/
}void InitPWM(void)
{TA1CTL |= TASSEL_2;     /*设置时钟模式为SMCLK*/TA1CTL |= MC0|MC1;      /*UP/DOWM模式*/TA1CCR0 = 499;          /*初始值*/TA1CCR2 = 499;TA1CCTL0 &= ~CAP;       /*设置为比较模式*/TA1CCTL2 &= ~CAP;TA1CCTL2 |= OUTMOD_6;   /*设置比较模式6*/P2SEL |= BIT5;          /*设置I/O复用*/P2DIR |= BIT5;
}

下面展示一些 内联代码片

// A code block
var foo = 'bar';
// An highlighted block
/** Inital.h**  Created on: 2020年12月1日*      Author: duwei*/#ifndef INITAL_H_
#define INITAL_H_void InitSystemClock(void);
void InitZHDIO(void);
void InitTimer0HZD(void);
void InitPWM(void);#endif /* INITAL_H_ */

基于MSP430G2553的模拟风扇控制系统相关推荐

  1. 基于单片机的模拟风扇控制系统

    1.试题 (1)功能简述 "模拟风扇控制系统"能够模拟电风扇工作,通过按键控制风扇的转动速度和定时时间,数码管实时显示风扇的工作模式,动态倒计时显示剩余的定时时间,系统主要由数码管 ...

  2. 蓝桥杯单片机第七届省赛-模拟风扇控制系统

    九层妖塔 起于垒土 ● 改编自国信长天蓝桥杯官方蓝皮书例程,按照自己的习惯进行了补充和修改 蓝桥杯单片机第七届省赛-模拟风扇控制系统 Notes1:按键按下后在某些情况下给一定的缓冲时间 Notes2 ...

  3. 蓝桥杯单片机CT107D_16_模拟风扇控制系统

    #include<reg52.h> #include"onewire.h"sbit L8 = P0^7; //工作LED sbit L1 = P0^0; sbit L2 ...

  4. 蓝桥杯单片机第七届省赛题详细讲解(模拟风扇控制系统)

    看之前强烈建议先自己做一遍!!! 演示视频 题目讲解 完整程序 main.c onewire.h onewire.c 工程文件 演示视频 题目讲解 首先还是从整个赛题的程序框图开始看起,如图. 做题之 ...

  5. 第七届蓝桥杯初赛——————模拟风扇控制系统

    代码部分(实现题目要求的全部功能) #include<stc15f2k60s2.h> #include<intrins.h> #define uchar unsigned ch ...

  6. 模拟风扇控制系统(按键控制)

    前言 学习了数码管扫描,按键扫描,定时器,中断,三极管,pwm后浅试项目.初始为2分钟倒计时,风速为A,红灯800ms闪烁一次,蓝灯跟随风速不同亮度不同,使用按键控制.按键k1控制计时,按后停止倒计时 ...

  7. 基于自适应算法和增量式PID算法的模拟直升飞机控制系统

    基于自适应算法和增量式PID算法的模拟直升飞机控制系统 文章目录 基于自适应算法和增量式PID算法的模拟直升飞机控制系统 控制系统硬件 单片机系统 传感器系统介绍 直升机模拟系统介绍 系统模块介绍 A ...

  8. 基于stm32单片机智能温控风扇控制系统Proteus仿真

    资料编号:103  下面是相关功能视频演示: 103-基于stm32单片机智能温控风扇控制系统Proteus仿真(源码+仿真+全套资料) 功能介绍:采用stm32单片机.ds18b20温度传感器采集温 ...

  9. 基于Labview的水位水温控制系统——虚拟仪器实验设计报告

    基于LabVIEW的水位水温控制系统 摘要:本项目基于LabVIEW实现了一个由一定温度冷水和一定温度热水混合成为温水的系统,主要实现对冷水出水量和热水出水量的自动化控制,使得到的温水达到设定的目标水 ...

最新文章

  1. java sscanf_sscanf 详细说明
  2. 阿里《Java开发手册》中的 1 个bug!
  3. IIS,apche,nginx,301域名重定向设置
  4. java中数组合并的方法,数组合并--Java原生方法
  5. 各种机器学习的应用场景分别是什么
  6. java获取路径中的文件名_3种Java从文件路径中获取文件名的方法
  7. CentOS 7 重装mysql编译过程报错解决方法
  8. 对称 symmetric
  9. C语言C++制作游戏外挂,一个简单的内存外挂!
  10. win10定时语音提醒
  11. pymysql操作MySQL数据库表-----爬虫豆瓣top250电影并存入数据库
  12. MySQL表如何导入图片_mysql中怎样插入图片
  13. 电子厂计算机常用英语,电子厂常用英语词汇
  14. PC端移动端IP查询
  15. JSon解析之JSonKit
  16. 什么是海外调查问卷?都有哪些形式
  17. Notes of Python Cookbook (Chr1-Chr3)
  18. Linux管理员易犯的错误
  19. FANUC机器人4种启动方式的具体操作步骤
  20. 基础教学:用python实现儿时游戏飞机大战(带源码)

热门文章

  1. win10笔记本电脑找不到WLAN
  2. 2022年中式面点师(高级)特种作业证考试题库及模拟考试
  3. 上海交通大学出版社python教材答案学生信息管理系统_学生信息管理系统(最终版)...
  4. Java虚拟机基本结构
  5. AIoT赋能保险业新发展
  6. 反向解析与PTR(Pointer Record)
  7. 股票入门基础知识37:识别交易中的支撑位和阻力位
  8. php 日历排班的例子,基于ThinkPHP实现的日历功能实例详解
  9. pyqt5中显示web页面(外部web、本地web)
  10. 'BMap' is not defined 解决方案