使用Multisim仿真单片机病房呼叫系统
1.设计任务与要求
- 使用两套优先级:同一个病人有两个按钮“急救”和“呼叫”。“急救”的优先级大于“呼叫”。同一种按钮下,病人的优先级排序为“病人0,病人1,病人2,病人3”。
- 病房内拥有4个病人。
- 输入信号可以声光显示。当按下任何一种按钮时,相应病人的灯光亮起。当该病人的“急救”按钮按下时,蜂鸣器报警响起。
- 输入信号拥有防误触功能。当同时按下两个自锁按钮时,将不会有任何输入。
- 拥有输出:按照优先级进行静态数码管的显示。
2 原理图
其中:U22、U24、U26、U28为七位显示译码芯片CD4511;U4为51单片机
3单片机U4内的程序:
#include<8051.h>
#define u32 unsigned int
void delay()
{
int i=0;
for(i=0;i<20;i++);
}
u32 get_num()
{
u32 sum = 0, carry = 1;
if (P17 == 0)
{
sum = sum + 4 * carry;
carry *= 10;
}
if (P15 == 0)
{
sum = sum + 3 * carry;
carry *= 10;
}
if (P13 == 0)
{
sum = sum + 2 * carry;
carry *= 10;
}
if (P11 == 0)
{
sum = sum + 1 * carry;
carry *= 10;
}
if (P16 == 0)
{
sum = sum + 4 * carry;
carry *= 10;
}
if (P14 == 0)
{
sum = sum + 3 * carry;
carry *= 10;
}
if (P12 == 0)
{
sum = sum + 2 * carry;
carry *= 10;
}
if (P10 == 0)
{
sum = sum + 1 * carry;
carry *= 10;
}
return sum;
}
void show_seg(u32 a)
{
u32 fir=a/1000;
u32 sec=(a%1000)/100;
u32 thi=(a%100)/10;
u32 fou=a%10;
//first bit show
if(fir==0)
{
P00=0;
}
else
{
P00=1;
P20=(fir-1)%2;
P21=(fir-1)/2;
}
//second bit show
if(sec==0)
{
P01=0;
}
else
{
P01=1;
P22=(sec-1)%2;
P23=(sec-1)/2;
}
//third bit show
if(thi==0)
{
P02=0;
}
else
{
P02=1;
P24=(thi-1)%2;
P25=(thi-1)/2;
}
//fourth bit show
if(fou==0)
{
P03=0;
}
else
{
P03=1;
P26=(fou-1)%2;
P27=(fou-1)/2;
}
}
void main()
{
int a=0;
while(1)
{
a=get_num();
show_seg(a);
}
}
4仿真结果
图中,2号病人叫了急救,0、1号病人叫了呼叫。最终显示“2、0、1”。达到预期功能。
图中,病人0同时按下了两个按钮,触发防误触功能。此时不显示0号病人的呼救,达到预期功能。
作者:一只锶呈