找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1795|回复: 1
打印 上一主题 下一主题
收起左侧

stc15单片机空调系统源程序设计

[复制链接]
跳转到指定楼层
楼主
ID:528775 发表于 2019-10-12 09:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于15单片机进行空调系统的设计

单片机源程序如下:
  1. /****************************************Copyright (c)****************************************************
  2. **                                       
  3. **                                 
  4. **
  5. **--------------File Info---------------------------------------------------------------------------------
  6. ** File name:                       
  7. ** Last modified Date:         
  8. ** Last Version:                  
  9. ** Descriptions:                                                       
  10. **--------------------------------------------------------------------------------------------------------
  11. ** Created by:                        FiYu
  12. ** Created date:                2016-7-1
  13. ** Version:                            1.0
  14. ** Descriptions:                PWM呼吸灯实验                                       
  15. **--------------------------------------------------------------------------------------------------------
  16. ** Modified by:                        FiYu
  17. ** Modified date:                2016-11-1
  18. ** Version:                                  2.0
  19. ** Descriptions:          
  20. ** Rechecked by:       
  21. **********************************************************************************************************/
  22. /****-----请阅读ReadMe.txt进行实验-----***********/
  23. #define MAIN_Fosc                11059200L        //定义主时钟
  24. #include        "15W4KxxS4.H"

  25. #define  uint16   unsigned int  
  26. #define  uint8    unsigned char  
  27. sbit KEY1=P2^3;
  28. sbit KEY2=P2^4;
  29. sbit KEY3=P2^5;
  30. sbit KEY4=P2^6;            //用户按键S3用IO口P54
  31. sbit ledpwmval=P5^5;   //蓝色

  32. /**************************************
  33. 功能描述:延时函数
  34. 入口参数:uint16 x ,该值为1时,延时1ms
  35. 返回值:无
  36. ***************************************/
  37. void delay_ms(uint16 x)
  38. {  
  39.         uint16 j,i;   
  40.         for(j=0;j<x;j++)   
  41.         {   
  42.                 for(i=0;i<1100;i++);   
  43.         }  
  44. }

  45. /**************************************************************************************
  46. 功能描述:对PWM3和PWM3进行初始化
  47. 入口参数:无
  48. 返回值:无
  49. **************************************************************************************/
  50. void PWM2PWM3_Configuration(void)
  51. {
  52.         PWMCFG &= 0xBF;                         //将CBTADC位置0,即PWM计数器归零时不触发ADC转换
  53.         PWMIF &= 0xBF;                         //将CBIF位置0,PWM计数器归零中断标志位,需软件清零
  54.        
  55.         P_SW2 |= 0x80;                         //将EAXSFR位置1,以访问PWM在扩展RAM区的特殊功能寄存器
  56.         //对PWM2的初始化部分
  57.         PWM2CR |= 0x08;                   //将PWM2_PS位置1,选择PWM2的输出引脚是P2.7
  58.         PWMCR |= 0x01;                         //将ENC2O位置1,PWM2的端口为PWM输出口,受PWM波形发生器控制       
  59.         PWMCFG &= 0xFE;                         //将C2INI位置0,设置PWM2输出端口的初始电平为低电平
  60.         PWMIF &= 0xFE;                         //将C2IF位置0,PWM2中断标志位,需软件清零
  61.         PWM2CR |= 0x04;                   //将EPWM2I位置1,使能PWM2中断
  62.         PWM2CR &= 0xFD;                   //将EC2T2SI位置0,关闭T2翻转时中断
  63.         PWM2CR &= 0xFE;                   //将EC2T1SI位置0,关闭T1翻转时中断
  64.    //对PWM3的初始化部分
  65.         PWM3CR |= 0x08;                   //将PWM3_PS位置1,选择PWM3的输出引脚是P4.5
  66.         PWMCR |= 0x02;                       //将ENC3O位置1,PWM3的端口为PWM输出口,受PWM波形发生器控制
  67.         PWMCFG &= 0xFD;                       //将C3INI位置0,设置PWM3输出端口的初始电平为低电平
  68.         PWMIF &= 0xFD;                       //将C3IF位置0,PWM3中断标志位,需软件清零
  69.         PWM3CR |= 0x04;                   //将EPWM3I位置1,使能PWM3中断
  70.         PWM3CR &= 0xFD;                   //将EC3T2SI位置0,关闭T2翻转时中断
  71.         PWM3CR &= 0xFE;                   //将EC3T1SI位置0,关闭T1翻转时中断
  72.         //对PWM2和PWM3翻转计数器赋初值
  73.         PWM2T1 =1;                 //赋值PWM2第一次翻转计数器值
  74.         PWM2T2 = 0x00FA;           //赋值PWM2第二次翻转计数器值
  75.         PWM3T1 =0x00FA;                 //赋值PWM3第一次翻转计数器值
  76.         PWM3T2 = 1;           //赋值PWM3第二次翻转计数器值
  77.        
  78.   //对PWM波形发生器时钟源进行初始化
  79.         PWMCKS |= 0x10;                         //将SELT2位置1,PWM时钟源为定时器2溢出脉冲
  80.         PWMC = 0x00FA;             //PWM计数器赋值(同时对PWMCH和PWMCL进行了赋值)
  81.         AUXR |= 0x04;                           //定时器2时钟为Fosc,即1T
  82.         T2L = 0xE0;                             //设定定时初值
  83.         T2H = 0xFE;                //设定定时初值
  84.         AUXR |= 0x10;              //启动定时器2
  85.         P_SW2 &= 0x7F;                         //将EAXSFR位置0,恢复访问XRAM
  86.        
  87.         //PWM外部异常控制寄存器的操作
  88.         PWMFDCR &= 0xDF;                       //将ENFD位置0,关闭PWM外部异常检测功能
  89.         PWMFDCR &= 0xF7;                       //将ENDI位置0,关闭PWM异常检测中断
  90.         PWMFDCR &= 0xFB;                       //将FDCMP位置0,比较器与PWM无关
  91.         PWMFDCR &= 0xFD;                       //将FDIO位置0,P2.4的状态与PWM无关
  92.         PWMFDCR &= 0xFE;                       //将FDIF位置0,PWM异常检测中断标志位,需软件清零
  93.        
  94.         IP2 |= 0x40;                           //将PPWM位置1,使能PWM中断为最高优先级中断
  95.         //使能PWM波形发生器
  96.         PWMCR |= 0x80;                         //将ENPWM位置1,使能PWM波形发生器,PWM计数器开始计数
  97.         PWMCR &= 0xBF;                         //将ECBI位置0,禁止PWM计数器归零中断
  98. }

  99. /***************************************************************************
  100. * 描  述 : PWM中断服务函数
  101. * 入  参 : 无
  102. * 返回值 : 无
  103. **************************************************************************/
  104. void PWM(void) interrupt PWM_VECTOR using 1
  105. {
  106.         PWMIF &= 0xBF;                         //将CBIF位置0,PWM计数器归零中断标志位,需软件清零
  107.         PWMIF &= 0xFE;                         //将C2IF位置0,PWM2中断标志位,需软件清零
  108.         PWMIF &= 0xFD;                         //将C3IF位置0,PWM3中断标志位,需软件清零
  109. }





  110.    void KEY_Scan(void)

  111. {          if(KEY1 == 0)
  112.           {
  113.             delay_ms(10);
  114.             
  115.           }
  116.           if(KEY2==0)
  117.           {delay_ms(10);
  118.           }
  119.                    while(1)
  120.   {
  121.                 KEY_Scan();    //按键输入检测函数

  122.   }       
  123. }
  124. /********************************************************
  125. 功能描述:主函数
  126. 入口参数:无
  127. 返回值:无
  128. *********************************************************/

  129. int main()
  130. {
  131.         uint8 flag=1;
  132.         uint16 ledpwmval=0;
  133.         uint16 ledpwmvala=1;
  134. /////////////////////////////////////////////////
  135. //注意: STC15W4K32S4系列的芯片,上电后所有与PWM相关的IO口均为
  136. //      高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用
  137. //相关IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2
  138. //        P2.3/P2.7/P3.7/P4.2/P4.4/P4.5
  139. /////////////////////////////////////////////////
  140.         P2M1 &= 0x7F;        P2M0 &= 0x7F;          //设置P2.7为准双向口
  141.         P4M1 &= 0xDF;        P4M0 &= 0xDF;          //设置P4.5为准双向口
  142.                  P2M1 &= 0x87;        P2M0 &= 0x87;          //设置P0.6为准双向口
  143.         P5M1 &= 0xCF;        P5M0 &= 0xCF;          //设置P5.4为准双向口
  144.         PWM2PWM3_Configuration();   //初始化PWM2和PWM3口
  145.         EA = 1;                                  //允许总中断
  146.        

  147.        
  148.                    while(1)
  149.                 {delay_ms(100);       //延迟每次指示灯亮度的时间,更方便观察实验现象
  150.                
  151.          if(KEY1)
  152.                        //如果标识符为1则递增变量ledpwmval
  153.                         ledpwmval=ledpwmval+10;
  154.                 while (KEY1 == 0); //等待按键释放
  155.                         ledpwmval=ledpwmval;
  156.                        
  157.                 if(KEY2)                //如果标识符为0则递减变量ledpwmval
  158.                         ledpwmval=ledpwmval-10;       
  159.                  while(KEY2 == 0);
  160.                         ledpwmval=ledpwmval;
  161.                 if(ledpwmval>256)    //如果变量ledpwmval递增到一定值则控制标识符为0,以实现ledpwmval递减
  162.                         KEY1=0;
  163.                         KEY2=1;
  164.                        
  165.                 if(ledpwmval==1)     //如果变量ledpwmval递减到一定值则控制标识符为1,以实现ledpwmval递增
  166.                         KEY1=1;       

  167.                
  168.                 ledpwmvala=256-ledpwmval;       
  169.                           
  170.    
  171.                 P_SW2 |= 0x80;                            //将EAXSFR位置1,以访问PWM在扩展RAM区的特殊功能寄存器
  172.                 PWM2T1 =(uint16)ledpwmval;    //赋值PWM2第一次翻转计数器值(不断变化值)
  173.                 PWM2T2 = 0x00FA;              //赋值PWM2第二次翻转计数器值(定值)
  174.                 PWM3T1 =(uint16)ledpwmvala;    //赋值PWM3第一次翻转计数器值(不断变化值)
  175.                 PWM3T2 = 0x00FA;              //赋值PWM3第二次翻转计数器值(定值)
  176.                 P_SW2 &= 0x7F;                            //将EAXSFR位置0,恢复访问XRAM
  177.                
  178.         }


  179. }
复制代码

所有资料51hei提供下载:
pwm.rar (322.51 KB, 下载次数: 17)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2019-10-12 23:54 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表