有一天
我正在安静的上班,一个同学给我发消息,跟我说怎么设计一个电烤箱程序,他的硬件已经设计好了,但是不知道怎么写代码
题目是这样的
写单片机代码说起来简单,但是可不是意见草率的事情,我认为应该这样去做。
先画出流程图
然后就可以写代码了
#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
设计资源 培训 开发板 精华推荐
- 使用 NXP Semiconductors 的 PT4240PSE7QQA 的参考设计
- RDR-242 - 30 W 电源
- FTS_SPD_1.9.2
- LTM8003IY 5Vout 从 7Vin 到 40Vin 降压转换器的典型应用电路
- X-NUCLEO-NFC02A1,基于M24LR04E的动态NFC标签IC扩展板,用于STM32 Nucleo
- LT8335IDDB 3V 至 6V 输入、12V 升压转换器的典型应用电路
- LTC3803HS6-3、90% 效率同步反激式转换器的典型应用电路
- TCR5SB40U、200mA、4V 输出电压 CMOS 低压降稳压器的典型应用
- LTC3603EUF 1.2V、2.5A 降压稳压器(750kHz、突发模式操作)的典型应用电路
- XR76208 8A同步降压稳压器典型应用电路