电烤箱的单片机程序设计

发布者:asd999ddd最新更新时间:2021-06-28 来源: eefocus关键字:电烤箱  单片机  程序设计 手机看文章 扫描二维码
随时随地手机看文章

有一天

我正在安静的上班,一个同学给我发消息,跟我说怎么设计一个电烤箱程序,他的硬件已经设计好了,但是不知道怎么写代码

题目是这样的

写单片机代码说起来简单,但是可不是意见草率的事情,我认为应该这样去做。

先画出流程图

然后就可以写代码了

#include    "reg51.h"

#include   


#define     MAIN_Fosc       24000000L   //定义主时钟



typedef     unsigned char   u8;

typedef     unsigned int    u16;

typedef     unsigned long   u32;


sfr P4   = 0xC0;

sfr P5   = 0xC8;

sfr P6   = 0xE8;

sfr P7   = 0xF8;

sfr P1M1 = 0x91;    //PxM1.n,PxM0.n     =00--->Standard,    01--->push-pull

sfr P1M0 = 0x92;    //                  =10--->pure input,  11--->open drain

sfr P0M1 = 0x93;

sfr P0M0 = 0x94;

sfr P2M1 = 0x95;

sfr P2M0 = 0x96;

sfr P3M1 = 0xB1;

sfr P3M0 = 0xB2;

sfr P4M1 = 0xB3;

sfr P4M0 = 0xB4;

sfr P5M1 = 0xC9;

sfr P5M0 = 0xCA;

sfr P6M1 = 0xCB;

sfr P6M0 = 0xCC;

sfr P7M1 = 0xE1;

sfr P7M0 = 0xE2;


sbit P00 = P0^0;

sbit P01 = P0^1;

sbit P02 = P0^2;

sbit P03 = P0^3;

sbit P04 = P0^4;

sbit P05 = P0^5;

sbit P06 = P0^6;

sbit P07 = P0^7;

sbit P10 = P1^0;

sbit P11 = P1^1;

sbit P12 = P1^2;

sbit P13 = P1^3;

sbit P14 = P1^4;

sbit P15 = P1^5;

sbit P16 = P1^6;

sbit P17 = P1^7;

sbit P20 = P2^0;

sbit P21 = P2^1;

sbit P22 = P2^2;

sbit P23 = P2^3;

sbit P24 = P2^4;

sbit P25 = P2^5;

sbit P26 = P2^6;

sbit P27 = P2^7;

sbit P30 = P3^0;

sbit P31 = P3^1;

sbit P32 = P3^2;

sbit P33 = P3^3;

sbit P34 = P3^4;

sbit P35 = P3^5;

sbit P36 = P3^6;

sbit P37 = P3^7;

sbit P40 = P4^0;

sbit P41 = P4^1;

sbit P42 = P4^2;

sbit P43 = P4^3;

sbit P44 = P4^4;

sbit P45 = P4^5;

sbit P46 = P4^6;

sbit P47 = P4^7;

sbit P50 = P5^0;

sbit P51 = P5^1;

sbit P52 = P5^2;

sbit P53 = P5^3;

sbit P54 = P5^4;

sbit P55 = P5^5;

sbit P56 = P5^6;

sbit P57 = P5^7;


u8 ledIndex;

u8 code ledNum[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};


void  delay_ms(u8 ms);


#define KEY_0  P57 /*按键*/

#define UP_500W P56 /*上层管*/

#define DOWN_200W P55 /*下层管*/

#define FUNJI P54 /*风机*/ 

#define true (1)

#define false (0)


enum STATE{


 STATE_UP_ON, /*启动上层管700W*/

 STATE_DOWN_ON, /*启动下层管200W*/

 STATE_FUN_ON, /*启动风机*/

 STATE_TIME1_5MIN, /*定时器1 5分钟*/

 STATE_TIME2_10MIN, /*定时器2 10分钟*/

 STATE_TIME3_5MIN, /*定时器3 5分钟*/

 

 STATE_idle,   /*空闲*/

};


struct strg_data{

 int time_cout;

};


enum STATE sys_state;

struct strg_data stu_data;


void gpio_init(void)

{

 P0M1 = 0;   P0M0 = 0;   //设置为准双向口

    P1M1 = 0;   P1M0 = 0;   //设置为准双向口

    P2M1 = 0;   P2M0 = 0;   //设置为准双向口

    P3M1 = 0;   P3M0 = 0;   //设置为准双向口

    P4M1 = 0;   P4M0 = 0;   //设置为准双向口

    P5M1 = 0;   P5M0 = 0;   //设置为准双向口

    P6M1 = 0;   P6M0 = 0;   //设置为准双向口

    P7M1 = 0;   P7M0 = 0;   //设置为准双向口

}


unsigned char get_key_value(void)

{

 if(KEY_0 == 1){

  delay_ms(200);

  if(KEY_0 == 1){

   return (true);

  }

 }

 return (false);

}


/******************** 主函数 **************************/

void main(void)

{


 gpio_init();


 sys_state =  STATE_idle;


 memset(&stu_data,0,sizeof(stu_data));

    while(1)

    {

  if(get_key_value() && sys_state == STATE_idle){

   sys_state = STATE_UP_ON;

  }


  switch(sys_state)

  {

   case STATE_UP_ON:

   {

     DOWN_200W = 1; /*启动下层管*/

     sys_state = STATE_TIME2_10MIN; 

   }

   break; 

   case STATE_TIME1_5MIN:

   {

     stu_data.time_cout ++;

     delay_ms(1000);

     if(stu_data.time_cout >= 5*60){

      stu_data.time_cout = 0;

     sys_state = STATE_DOWN_ON;

     }

   }

   break; 

   case STATE_TIME2_10MIN:

   {

     stu_data.time_cout ++;

     delay_ms(1000);

     if(stu_data.time_cout >= 10*60){

      stu_data.time_cout = 0;

     sys_state = STATE_TIME3_5MIN;


     DOWN_200W = 0; /*关闭下层管*/

     FUNJI = 1; /*启动风机*/

     }

   }

   break;

   case STATE_TIME3_5MIN:

   {

     stu_data.time_cout ++;

     delay_ms(1000);

     if(stu_data.time_cout >= 5*60){

      stu_data.time_cout = 0;

     sys_state = STATE_idle;


     UP_500W = 0; /*关闭上层管*/

     FUNJI = 0; /*关闭风机*/

     }

   }

   break;


   default:


   break;

  }

    }

}


//========================================================================

// 函数: void  delay_ms(u8 ms)

// 描述: 延时函数

// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.

// 返回: none.

// 版本: VER1.0

// 日期: 2013-4-1

// 备注: 

//========================================================================

void  delay_ms(u8 ms)

{

     u16 i;

     do{

          i = MAIN_Fosc / 13000;

          while(--i)    ;   //14T per loop

     }while(--ms);

}


我觉得代码写的比较一般,需要提升的地方还非常多,特别是里面结构体和变量名称的命名,还需要加强。


关键字:电烤箱  单片机  程序设计 引用地址:电烤箱的单片机程序设计

上一篇:单片机系统中的红外通信接口
下一篇:在MCS-51单片机中对特殊功能寄存器的C51定义

推荐阅读最新更新时间:2024-11-11 23:03

基于单片机的直流电机控制PWM调速代码
(PWM)脉冲宽度调制 脉冲宽度调制是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。 所谓PWM,就是脉冲宽度调制技术,其具有两个很重要的参数:频率和占空比。频率,就是周期的倒数;占空比,就是高电平在一个周期内所占的比例。 本次使用了电机驱动模块是L298N 实物图如下,改模
[单片机]
基于<font color='red'>单片机</font>的直流电机控制PWM调速代码
基于51单片机理解SG90舵机原理并用按键控制
具体功能实现 当按下开关时,舵机的角度分别运行到0°,45°,90°,135°,180°,0°(最后停止位置),其中每转动一个角度时间延时1s。 器件: AT89C52,sg90舵机,三根杜邦线公对母,两支按键 转动角度展示图: 转动至45° 转动至180° 转动至90° 知识介绍: sg90舵机简介 由直流电机、减速齿轮组、传感器(可变电阻)和控制电路组成的一套自动控制系统。 直流电机是一圈圈转动的,舵机只能在一定角度内转动(有最大旋转角度比如:180度),不能一圈圈转。 外部中断: STC89C52有4个外部中断; STC89C52的外部中断有两种触发方式: 下降沿触发和低电平触发 下降沿触发:当按键按
[单片机]
STC8单片机IO口简单模拟串行通信
我们都知道如何使用系统配置的串口初始化函数去使用我们的串口,就是只能使用固定的引脚去进行串行通信,就是下面这种方法, 如果想要使用其他的引脚来进行串行通信,就不可以了。下面教大学如何使用模拟串行通信,即可以使用任意引脚进行数据的收发。 1.计算传输一位数据所需要的时间,这与通信的波特率有关,在这里以波特率为1200bps为例。 波特率为1200,意思就是每秒传输的位数是1200位,那么每一位传输的时间就是1/1200*10的6次方=833us 这就表示传输每一位的时间是833us。 2.了解串行数据收发的过程,它的一帧数据一般包括1个起始位 + 8位有效数据(即一个字节)+ 1位停止位,还有校验位,在这里可要可
[单片机]
STC8<font color='red'>单片机</font>IO口简单模拟串行通信
基于S3C2440的nRF2401的接口电路和驱动程序设计
通信频率为2.4GHz 的ISM 频段,由于其免许可证、波长较短、天线的尺寸小、外围器件少等优点,适合于近距离无线通信。将ARM9 与nRF24E1 结合, 可以缩小设备体积, 降低系统功耗, 减少设备间连线困难等问题。针对ARM9 芯片S3C2440 的特点设计了对nFR24E1 的接口电路和驱动程序。对于在狭小空间中,有设备之间的数据共享要求的系统是一种有效解决途径。 2.4GHz 无线设备的使用,免去了系统之间连线的烦恼。一方面可以降低设备的成本,另一方面就是可以简化设备的安装。 特别是对于一些运动部件的实时测量,借助两个无线传输设备,可以将一部分测量设备做到运动部件上,另一部分安装在附近,就可以将运动部件的
[单片机]
基于S3C2440的nRF2401的接口电路和驱动<font color='red'>程序设计</font>
基于51单片机及DS18B20温度传感器数码管显示程序
#include reg52.h #include intrins.h sbit DQ=P1^4;//温度采集 sbit latch1=P2^2;//段锁存 sbit latch2=P2^3;//位锁存 unsigned char code dofly_DuanMa ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示段码0~9 unsigned char code dofly_WeiMa ={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//点亮数码管 unsigned char TempData ;//存储显示的度数 bit Re
[单片机]
基于单片机的多电机软起动系统
1 引言 随着国民经济的飞速发展,交流电动机在工业生产中扮演了极为重要的角色,作为各行业中的主要拖动电机,应用更为广泛。众所周知,交流电动机在全压起动时,起动电流达到额定电流的5~7倍,会对电网造成冲击;起动转矩约为额定转矩的2倍,加剧机械结构磨损。为了解决交流电动机的起动问题,通常需要使用软起动器进行软起动。 当前软起动器的监控一般由各自独立的监控单元进行,无法对整个系统实现全面的控制和监测。因此,建立一套数据通信系统将各软起动监控节点连接起来,组成完整的监控网络就显得非常必要。 相对于RS-485等通信标准,CAN(Controller Area Network)总线以其具有的诸多优点而在许多领域得到了应用。
[单片机]
基于<font color='red'>单片机</font>的多电机软起动系统
教你如何 51单片机控制mg995舵机
这是我的小车雏形,还没完成,之前就一直卡在舵机控制部分,今天终于搞定了。接下来我就将我注意的所有部分说出来,和大家分享一下我的经验: 1 单片机,舵机,电源共地; 2 用两个稳压芯片进行供电,将电源分开来; 3 舵机信号端没有直接连接单片机IO口,我串了一个10K的电阻,也就是这一步之后我就可以控制我的舵机了。 之前听很多人说是信号端直接连IO口也可以控制的,但是我就是一直都不可以了,今天我就串了一个10K的电阻之后意外发现可以控制舵机了 所以我就发这个帖子出来,和大家分享,同时感谢那些帮我思考的人,感谢你们~~ 需要比较清楚的电路的人可以留言,如果我看需要的人很多的话我就传上来吧~~~ 基于大众的要求,要求资料,那我就把我
[单片机]
教你如何 51<font color='red'>单片机</font>控制mg995舵机
GD32 MCU碰到IIC总线卡死怎么办?
大家在使用MCU IIC通信时,若碰到设备复位或者总线干扰等情况,可能会导致IIC总线卡死,表现上总线上SDA或者SCL其中一根线为低电平,IIC总线一直处于busy状态。此时若代码上一直等待总线空闲,则可能导致软件死机,为解决该问题,本视频提供了软件配置释放IIC总线的方法。 首先为大家介绍发生IIC总线卡死的两种情况:(1)主机在发送 START 信号后, 控制 SCL 产生 8 个时钟脉冲,然后拉低 SCL 信号为低电平,在这个时候,从设备输出应答信号,将 SDA 信号拉为低电平。如果这个时候主机异常复位, SCL 就会被释放为高电平。此时,如果从机没有复位,就会继续 I2C 的应答,将 SDA一直拉为低电平,直到 SC
[单片机]
GD32 <font color='red'>MCU</font>碰到IIC总线卡死怎么办?
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved