51单片机设计程序,实现当按下ADC分压键盘时,将相应的键号(01-16)通过两片具有SPI接口的74HC595芯片驱动最右端两个7段数码管显示,其余6个数码管关闭。
时间: 2024-03-24 22:40:42 浏览: 59
以下是51单片机的程序设计:
```c
#include <reg51.h>
#define FOSC 11059200L //晶振频率
#define BAUD 9600 //串口波特率
#define TIMER1_RELOAD (65536UL - (FOSC / 4 / BAUD))
sbit ADC_KEY = P1 ^ 0; //ADC分压键
sbit LATCH1 = P2 ^ 0; //74HC595锁存控制引脚
sbit LATCH2 = P2 ^ 1;
sbit SPI_CLK = P2 ^ 2; //74HC595串行时钟引脚
sbit SPI_DAT = P2 ^ 3; //74HC595串行数据引脚
unsigned char NUM_TABLE[] = { //数码管显示表
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};
void UART_Init()
{
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //设置定时器1为模式2
TMOD |= 0x20;
TH1 = TIMER1_RELOAD / 256; //设置定时器1重载值
TL1 = TIMER1_RELOAD % 256;
TR1 = 1; //启动定时器1
}
void UART_SendByte(unsigned char dat)
{
SBUF = dat;
while (!TI); //等待发送完成
TI = 0; //清除发送完成标志
}
void SPI_SendByte(unsigned char dat)
{
unsigned char i;
for (i = 0; i < 8; i++)
{
SPI_DAT = (dat & 0x80) ? 1 : 0; //发送最高位
SPI_CLK = 1;
SPI_CLK = 0;
dat <<= 1;
}
}
void Display_Num(unsigned char num)
{
SPI_SendByte(NUM_TABLE[num % 10]); //发送个位数
SPI_SendByte(NUM_TABLE[num / 10]); //发送十位数
LATCH1 = 1;
LATCH1 = 0;
LATCH2 = 1;
LATCH2 = 0;
}
void ADC_KeyScan()
{
static unsigned char keynum = 0;
static bit keypressed = 0;
if (!ADC_KEY && !keypressed)
{ //如果按键按下
keypressed = 1;
keynum++;
if (keynum > 16)
keynum = 1;
Display_Num(keynum); //显示键号
}
else if (ADC_KEY && keypressed)
{ //如果按键松开
keypressed = 0;
Display_Num(0); //关闭数码管
}
}
void main()
{
UART_Init(); //初始化串口
while (1)
{
ADC_KeyScan(); //扫描ADC分压键
}
}
```
程序中使用定时器1、SPI接口和74HC595芯片实现数码管的动态显示。当按下ADC分压键时,通过SPI接口将键号转换为相应的数码管显示码,然后驱动74HC595芯片将显示码发送到数码管进行显示,其余6个数码管关闭。注意SPI接口时序和74HC595锁存控制引脚的设置需要根据实际硬件情况进行调整。
阅读全文