电子产业一站式赋能平台

PCB联盟网

搜索
查看: 1179|回复: 0
收起左侧

51单片机求助!!!

[复制链接]

591

主题

959

帖子

5157

积分

四级会员

Rank: 4

积分
5157
发表于 2023-6-6 17:37:46 | 显示全部楼层 |阅读模式
有没有大佬能帮我按这个要求加一下程序,实在是搞不懂了
51单片机求助!!!-1.jpg

#include<reg51.h>
sbit DIN=P3^0;//与max7219接口定义
sbit LOAD=P3^1;
sbit CLK=P3^2;
sbit key0=P1^0; //8路抢答器按键
sbit key1=P1^1;
sbit key2=P1^2;
sbit key3=P1^3;
sbit key4=P1^4;
sbit key5=P1^5;
sbit key6=P1^6;
sbit key7=P1^7;
sbit key_clear=P2^0;//主持人时间设置、清除
sbit begin=P2^1;//主持人开始按键
sbit sounder=P3^7;//蜂鸣器
unsigned char second=30;//秒表计数值
unsigned char counter=0;//counter每100,minite加1
unsigned char people=0;//抢答结果
unsigned char
num_add[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
        //max7219读写地址、内容
unsigned char num_dat[]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89};


unsigned char keyscan()//键盘扫描函数
{
unsigned char keyvalue,temp;
keyvalue=0;
P1=0xff;
temp=P1;
if(~(P1&temp))
  {
    switch(temp)
{
  case 0xfe:
    keyvalue=1;
    break;
  case 0xfd:
    keyvalue=2;
    break;
case 0xfb:
    keyvalue=3;
    break;
  case 0xf7:
    keyvalue=4;
    break;
case 0xef:
    keyvalue=5;
    break;
  case 0xdf:
    keyvalue=6;
    break;
  case 0xbf:
    keyvalue=7;
break;
      case 0x7f:
    keyvalue=8;
    break;
  default:
    keyvalue=0;
    break;
}
}
return keyvalue;
}
void max7219_send(unsigned char add,unsigned char dat)
                                // 函数功能:向max7219写命令
{
unsigned charADS,i,j;
   LOAD=0;
  i=0;
  while(i<16)
  {
if(i<8)
{
  ADS=add;
}
else
{
  ADS=dat;
}
for(j=8;j>=1;j--)
{
  DIN=ADS&0x80;
  ADS=ADS<<1;
  CLK=1;
  CLK=0;
}
i=i+8;
}
  LOAD=1;
}

void max7219_init()//函数功能:max7219初始化
{
max7219_send(0x0c,0x01);
  max7219_send(0x0b,0x07);
  max7219_send(0x0a,0xf5);
  max7219_send(0x09,0xff);
}
void time_display(unsigned char x)//函数功能:时间显示
{
unsigned char i,j;
  i=x/10;
  j=x%10;
  max7219_send(num_add[1],num_dat[j]);
  max7219_send(num_add[0],num_dat);
}


void scare_display(unsigned char x)//函数功能:抢答结果显示
{
  unsigned char i,j;
  i=x/10;
  j=x%10;
max7219_send(num_add[3],num_dat[j]);
  max7219_send(num_add[2],num_dat);
}


void holderscan()//函数功能:抢答时间设置,0-60s
{
  time_display(second);
  scare_display(people);
  if(~key_clear)//如果有键按下,改变抢答时间
  {
    while(~key_clear);
if(people)//如果抢答结果没有清空,抢答器重置
{
  second=30;
people=0;
}
if(second<60)
{
  second++;
}
else
{
  second=0;
}
  }
}


void timer_init()//定时器T0初始化
{
  EA=1;
  ET0=1;
  TMOD=0x01; //定时器T0方式0定时
TH0=0xd8;//装入定时器定时常数,设定10ms中断一次
TL0=0xef;
}
void main()
{
while(1)
{
do
{
holderscan();
}while(begin);//开始前进行设置,若未按下开始键
while(~begin);//防抖
max7219_init(); //芯片初始化
timer_init();  //中断初始化
TR0=1;  //开始中断
  do
{
time_display(second);
scare_display(people);
people=keyscan();
  }while((!people)&&(second));//运行直到抢答结束或时间结束
  TR0=0;
  }
}


void timer0() interrupt 1//定时器T0中断函数
{
  if(counter<100)
  {
    counter++;
if(counter==50)
{
  sounder=0;
}
}
else
{
    sounder=1;
    counter=0;
second=second-1;
}
  TH0=0xd8;//重新装载
  TL0=0xef;
  TR0=1;
}
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表