基于51单片机的智能病房呼叫系统的设计与实现

一、前言

        显示床位号使用到4位数码管,为了节约单片IO口,使用TM1637来驱动数码管。

二、TM1637驱动芯片简介

基于51单片机的智能病房呼叫系统的设计与实现_第1张图片

三、电路设计,使用矩阵按键来模拟每个床位的呼叫按钮

基于51单片机的智能病房呼叫系统的设计与实现_第2张图片

四、编写51单片机代码

void delay_ms(u16 n)
{
	u8 i;
	while(n--)
	{
		i = 111;
		while(i--);
	}
}

u8 key_scan()
{
	u8 keyH, keyL, line, row;
	KEY=0xF0;
	if(KEY!=0xF0)
	{
		delay_ms(10); //消抖延时
		if(KEY!=0xF0)
		{
			keyH=KEY&0xF0;
			KEY=0x0F;
			keyL=KEY&0x0F;
			switch(keyH)
			{
				case 0x70: line=1;break;
				case 0xB0: line=2;break;
				case 0xD0: line=3;break;
				case 0xE0: line=4;break;
			}
			switch(keyL)
			{
				case 0x07: row=1;break;
				case 0x0B: row=2;break;
				case 0x0D: row=3;break;
				case 0x0E: row=4;break;
			}
			while(KEY!=0x0F);
			return (line-1)*4+row;
		}
	}
	return 0xFF;
}

code unsigned char tab[] =
{
        0x3F,/*0*/
        0x06,/*1*/
        0x5B,/*2*/
        0x4F,/*3*/
        0x66,/*4*/
        0x6D,/*5*/
        0x7D,/*6*/
        0x07,/*7*/
        0x7F,/*8*/
        0x6F,/*9*/
        0x77,/*10 A*/
        0x7C,/*11 b*/
        0x58,/*12 c*/
        0x5E,/*13 d*/
        0x79,/*14 E*/
        0x71,/*15 F*/
        0x76,/*16 H*/
        0x38,/*17 L*/
        0x54,/*18 n*/
        0x73,/*19 P*/
        0x3E,/*20 U*/
        0x00,/*21 黑屏*/
};

// TM1637串行数据线
sbit CLK = P2^0;
sbit DIO = P2^1;

// LED灯
sbit LED = P3^0;

void delay_us(unsigned int i)
{
	for (; i < 0; i--)
		_nop_();
}

// TM1637开始信号
void TM1637_Start()
{
	CLK	= 1;
	DIO = 1;
	delay_us(2);
	DIO = 0;
}

// TM1637结束信号
void TM1637_Stop()
{
	CLK = 0;
	DIO = 0;
	delay_us(2);
	CLK = 1;
	delay_us(2);
	DIO = 1;
}

void TM1637_ACK(void)
{
	CLK = 0;
	DIO = 1;
	while(DIO == 1);
	CLK =1;
}

// 向TM1637写数据
void TM1637_Write(unsigned char DATA)
{
	unsigned char i;
	for (i = 0; i < 8; i++)
	{
		CLK = 0;
		if (DATA & 0x01)
		{
			DIO = 1;
		}
		else
		{
			DIO = 0;
		}
		DATA = DATA >> 1;
		CLK = 1;
		delay_us(2);
	}
}

void TM1637_Display(u8 index)
{
	TM1637_Start();
	TM1637_Write(0x40);	 // 命令
	TM1637_ACK();
	TM1637_Stop();

	TM1637_Start();
	TM1637_Write(0xC0);	 // 地址
	TM1637_ACK();	
	TM1637_Write(0x3F);	 // 数据1
	TM1637_ACK();
	TM1637_Write(0x3F);	 // 数据2
	TM1637_ACK();
	TM1637_Write(0x3F);	 // 数据3
	TM1637_ACK();
	TM1637_Write(0x3F);	 // 数据4
	TM1637_ACK();
	TM1637_Write(0x3F);	 // 数据5
	TM1637_ACK();
	TM1637_Write(index);	 // 数据6
	TM1637_ACK();


	TM1637_Stop();


	TM1637_Start();
	TM1637_Write(0x89);	 // 亮度命令
	TM1637_ACK();
	TM1637_Stop();
}




void main()
{
	u8  num;
	LED =  LED_ON;
	TM1637_Display(tab[0]);
	while(1)
	{
		num = key_scan();
		if(num!=0xFF)
		{
			TM1637_Display(tab[num]);
		}
	}
}

五、电路仿真运行效果

基于51单片机的智能病房呼叫系统的设计与实现_第3张图片六、完整Proteus仿真电路图和51单片机源码下载:

链接:https://pan.baidu.com/s/1TojZnTWu3sGl8oGfjc2dhw?pwd=ga5p
提取码:ga5p

你可能感兴趣的:(51单片机,嵌入式硬件,单片机)