樓層數可選,硬件可刪除。16層內任意設置最大樓層數,用不到的樓層硬件可以刪除,不影響程序。提供串口通訊,波特率可在main初使化里設置。更新了詳細注釋版本,需要學習的朋友請關注銀穗之家回復:16層電梯源碼。即可下獲取詳細注釋版。
電梯仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
/*Uart串口發送函數示例:
1.USART_SendByte(u8 dat) //發送單字節數據
例:USART_SendByte(0x04);
2.USART_Send(u8* arr,u16 len) //發送多字節數據
例:
Usart.TX_BUFF[0]=0xA1;
Usart.TX_BUFF[1]=0x08;
Usart.TX_BUFF[2]=0x04;
Usart.TX_BUFF[3]=0xF9;
USART_SendByte(Usart.TX_BUFF,4);
或
u8 Arr[16]={0xA1,0x08,0x04,0xF9};
USART_SendByte(Arr,4);
3.USART_SendStr(u8* str) //發送字符串數據
USART_SendStr("大吉在利,晚上吃雞!rn");
4.有關電梯通信代碼參考:
<1>發送電梯當前樓層給其他設備: USART_SendByte(ElevState.CurrentFloor);
<2>發送電梯當前運行方向給其他設備: USART_SendByte(ElevState.Direction);
<3>發送電梯當前所有數據給其他設備: USART_Send((u8*)(&ElevState),sizeof(ElevState));
*/
單片機源程序如下:
/*************************電梯主程序*****************************/
#include "reg51.h"
#include "intrins.h"
/*********************程序選擇****************************/
#define USE_MODE 0 //0-定時模擬 1-傳感器
/****************************************************************/
/*********************平臺移植部分代碼****************************/
//定時器模擬版接口:
#if (USE_MODE==0)
sbit DOOR=P3^5; //電梯門開關控制信號
sbit ElevMotor_P=P3^6; //電梯電機正極控制信號
sbit ElevMotor_N=P3^7; //電梯電機負極控制信號
sbit SHCP=P0^5; //74HC595 LED、數碼管顯示驅動
sbit DS=P0^6; //74HC595 LED、數碼管顯示驅動
sbit STCP=P0^7; //74HC595 LED、數碼管顯示驅動
#define KeyPort_X P1 //矩陣按鍵接口
#define KeyPort_Y P2 //矩陣按鍵接口
#endif
//除以上定義的IO外,還需用到P33作為矩陣鍵盤的中斷觸發引腳
//8路與門可用芯片:CD4068或74LS30(芯片是與非門)+出端接一個三極管反向電平。
//傳感器版接口:
#if (USE_MODE==1)
sbit DOOR_CLOSE_SENSOR=P3^4;//電梯門關閉檢測傳感器輸入
sbit DOOR=P3^5; //電梯門開關控制信號
sbit ElevMotor_P=P3^6; //電梯電機正極控制信號
sbit ElevMotor_N=P3^7; //電梯電機負極控制信號
sbit SHCP=P0^5; //74HC595 LED、數碼管顯示驅動
sbit DS=P0^6; //74HC595 LED、數碼管顯示驅動
sbit STCP=P0^7; //74HC595 LED、數碼管顯示驅動
#define KeyPort_X P1 //矩陣按鍵接口
#define KeyPort_Y P2 //矩陣按鍵接口
#endif
//除以上定義的IO外,還需用到P33作為矩陣鍵盤的中斷觸發引腳
//需用到P32作為樓層限位開關觸發中斷引腳
//每個樓層一個限位開關,接在N路輸入的與門芯片上
//如果大于8層,可用兩個8路輸入的與門芯片+一個2路的與門芯片組合
//8路與門:用8路與非門CD4068或74LS30+輸出端接一個三極管反向電平。
/****************************************************************/
/***********************樓梯參數設置*****************************/
#define MaxFloor 16 //電梯總樓層(最大16)
#define FloorStayTime 40 //單位:50ms, 樓層停留時間:40*50ms=2S
#define DoorStayTime 2 //單位:S , 電梯門停留時間
#define SEG_Num 2 //數碼管數量(為1時請刪除第一個數碼管的595)
/****************************************************************/
#define u8 unsigned char
#define u16 unsigned int
#define TRUE 1
#define FALSE 0
#define Null 0
#define STOP 1
#define UP 2
#define DOWN 3
#define UP_IN 0x01
#define UP_OUT 0x02
#define DOWN_IN 0x04
#define DOWN_OUT 0x08
#define Elev_UP ElevMotor_P=0;ElevMotor_N=1 //低電平有效
#define Elev_DOWN ElevMotor_P=1;ElevMotor_N=0 //低電平有效
#define Elev_STOP ElevMotor_P=1;ElevMotor_N=1 //低電平有效
#define OPEN 1
#define CLOSE 0
#define DOOR_Open DOOR=OPEN
#define DOOR_Close DOOR=CLOSE
#define SHCP_H SHCP=1
#define SHCP_L SHCP=0
#define DS_H DS=1
#define DS_L DS=0
#define STCP_H STCP=1
#define STCP_L STCP=0
#if MaxFloor>8
#define MHC595_NUM 8
#else
#define MHC595_NUM 5
#endif
#define SEGPort 0x01
#define LED_IN_Port 0x02
#define LED_OUT_UP_Port 0x03
#define LED_OUT_DOWN_Port 0x04
typedef struct
{
u8 ElevRunning; //電梯運行狀態標志
u8 CurrentFloor; //當前電梯所處樓層
u8 Direction; //電梯運行方向
u8 FloorCallTable[MaxFloor+1];//數組[0]不用,從[1]開始使用 ,呼叫列表(所有樓層呼叫的信息均保存于此)
u8 FloorTimerCount; //計時
u8 ArriveFlag; //到達樓層信號(用于停止或在前一樓層提前加減速)(定時器模擬的用不到)
u8 FreeFlag; //電梯空閑狀態標志
}TYPEDEF_ELEVSTATE;
TYPEDEF_ELEVSTATE ElevState; //電梯狀態結構體
//u8 code SEG_NUM[]={0x3f,0x06,0x5b,0x4f,0x66,0x6D,0x7D,0x07,0x7f,0x6f}; //共陰SEG數碼管段碼 0~9
u8 code SEG_NUM[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共陽SEG數碼管段碼 0~F
u16 code LED_NUM[]={0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //SEG數碼管段碼 0~9
u8 HC595_BUFF[MHC595_NUM]={0};
u8 Timer_Second;
u16 TimerCount;
u8 RIOver_Flag=0;
u8 ExternKey[2]={0}; //外部按鍵按下信息
u8 FloorCallTableBUFF[MaxFloor+10]={0};
u8 KeyPressFlag=0;
#define USART_RX_LEN 20 //接收緩存長度(請勿超過芯片rom剩余大小)
typedef struct
{
u8 RX_BUFF[USART_RX_LEN]; //接收緩存
u8 TX_BUFF[USART_RX_LEN]; //發送緩存
u16 RX_COUNT;
}USART;
USART Usart;
void delay_ms(u16 xms);
void delay_s(u8 xs);
void EXTI0_Init(void);
void Timer0_Init(void);
void USART_Configure(u16 BaudRate);
void HC595_Send(u8 *p);
u8 KeyScan(void);
void KeyDatHandle(u8 key);
void WaitDoorOpen(u8 ts);
void WaitDoorClose(u8 ts);
void SEG_Display(u8 segnum);
void LED_ON(u8 addr,u8 lednum);
void LED_OFF(u8 addr,u8 lednum);
void DlevWorkState(u8 state);
void Elevator(void);
u8 FloorCall_UP(u8 floorside);
u8 FloorCall_DOWN(u8 floorside);
u8 DelNullCheck(void);
void FloorCallCheck(void);
void USART_SendByte(u8 dat);
void USART_Send(u8* arr,u16 len);
void USART_SendStr(u8* str);
void SYSYEM_INIT(void);
void delay_ms(u16 xms)
{
u8 i;
u16 t;
for(t=xms;t>0;t--)
for(i=112;i>0;i--);
}
void delay_s(u8 xs)
{
TimerCount=0;
Timer_Second=0;
while(Timer_Second void EXTI0_Init(void) { EA = 1; IT0= 1; //下降沿觸發 EX0= 1; } void EXTI1_Init(void) { EA = 1; IT1= 1; //下降沿觸發 EX1= 1; } …………………… …………限于本文篇幅 余下代碼請從51黑下載附件………… else if(((key>0)&&(key<=8))||((key>32)&&(key<=40))) //樓梯內的樓層選擇按鍵(使用第1行和第5行作為電梯內部16個按鍵,每行8個鍵) { if(key>32) tempkey=key-32+8; else tempkey=key; if(tempkey<=MaxFloor) { LED_ON(LED_IN_Port,tempkey); if(((tempkey>ElevState.CurrentFloor)&&(tempkey if((tempkey } else if(((key>9)&&(key<=16))||((key>40)&&(key<=48))) //每個樓層門口外的向下按鍵(底樓按向下無效),第2行和第6行 { if(key>40) tempkey=key-40+8; else tempkey=key-8; if((tempkey>1)&&(tempkey<=MaxFloor)) { LED_ON(LED_OUT_DOWN_Port,tempkey); ElevState.FloorCallTable[tempkey]|=DOWN_OUT; } } else if(((key>16)&&(key<=24))||((key>48)&&(key<56))) //每個樓層門口外的向上按鍵(頂樓按向上無效),第2行和第7行 { if(key>48) tempkey=key-48+8; else tempkey=key-16; if(tempkey LED_ON(LED_OUT_UP_Port,tempkey); ElevState.FloorCallTable[tempkey]|=UP_OUT; } } else if(key==25) //開門 { if(ElevState.ElevRunning==FALSE) { if(DOOR==CLOSE) DOOR_Open; } }
上一篇:51單片機+74HC138驅動16*96點陣顯示漢字的Proteus仿真+源代碼
下一篇:簡單的單片機按鍵控制流水燈
推薦閱讀最新更新時間:2025-04-23 15:44








設計資源 培訓 開發板 精華推薦
- SRT-96B-MEZ-LTE-A、Shiratech LTE 和傳感器夾層板
- AM2G-1215DH30Z ±15V 2 瓦 DC/DC 轉換器的典型應用
- LTC1164-7 低功率、線性相位 8 階低通濾波器的典型應用
- LT6654AHS6-1.25 電壓基準的典型應用,具有升壓輸出電流和電流限制
- 具有關斷功能的 LT1086IT 5V 穩壓器的典型應用
- 電磁光電門 通用
- #第五屆立創電子設計大賽#個人顯示終端
- 使用 Analog Devices 的 LT8570IDD-1 的參考設計
- 具有欠壓鎖定功能的 LT3973EMSE-3.3 5V 降壓轉換器的典型應用
- resonance:用于card10的共振插件板添加視頻輸出
- 高通攜手中國“汽車朋友圈”亮相2025上海車展: 加速駕駛輔助普惠,推動艙駕創新升級
- 工業市場正在快速回暖,德州儀器如何重塑電力電子市場?
- 特斯拉:美國交付的Model Y/3電池包已實現100%美國生產
- 地平線與博世深化合作,攜手為多家車企提供輔助駕駛產品
- 強化中國市場戰略布局,德州儀器正靈活應對全球關稅挑戰
- Molex莫仕通過本地合作和創新加強支持中國汽車行業
- 貿澤開售Texas Instruments適用于高分辨率AR HUD的 全新DLP4620S-Q1 0.46"汽車數字微鏡器件
- ROHM推出高功率密度的新型SiC模塊,將實現車載充電器小型化!
- 用上車規級UFS 4.0,讓出行變得高效且可靠
- 車載測試技術解析:聚焦高帶寬、多通道同步采集與協議分析