首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

51程序中有错不会改解决办法

2012-03-01 
51程序中有错不会改#include reg51.htypedefunsigned char ucharsbit LEP1^4sbit KEY5P3^7sbit BUZ

51程序中有错不会改
#include <reg51.h>
typedef unsigned char uchar;
sbit LE=P1^4;
sbit KEY5=P3^7;
sbit BUZ=P3^0;
#define TIMER_HBYTE -50000/256 //定时50ms
#define TIMER_LBYTE -50000%256
uchar intr_counter; //设定的时间用需要产生的中断次数表示
uchar bdata byte; //在bdata区定义一个变量,便于位操作
sbit byte_7=byte^7; 
bit foul_flg; //是否有人犯规标志
bit time_over_flg; //是否倒计时超时标志
bit key_flg; //是否有人在规定时间内按键标志
uchar set_time(void); //函数功能:设置倒计时时间
bit control_key(void); //函数功能:检测主持人是否按键
uchar get_key_num(void); //函数功能:检测哪个参赛者按键
void display_time(void); //函数功能:显示倒计时剩余时间
void foul_handle(uchar); //函数功能:犯规处理
void key_handle(uchar); //函数功能:按键处理
void time_over_handle(void); //函数功能:超时处理
void init_t0(void); //函数功能:初始化T0定时器
void delay_20ms(void); //函数功能:延时20ms,按键去抖动
void buz_on(void) //函数功能:蜂鸣器响500ms

void main(void)
{
  uchar key_number;
  while(1)
  {
  foul_flg=0; //设置初始环境
  time_over_flg=0;
  TR0=0; //禁止T0运行
  write_digit(DIGIT0,LED_code[0x0]);//上电后3个数码管全部显示0
  write_digit(DIGIT1,LED_code[0x0]);
  write_digit(DIGIT2,LED_code[0x0]);
  while((control_key()==1)&&(foul_flg==0))
  //如果主持人没有按键
  {
  key_number=getkey_num(); //检查是否有人犯规
  if(key_number==0) //如果没有,进行下一次循环
  continue;
  else //如果有人犯规
  {
  foul_handle(); //犯规处理
  foul_flg=1; //设置犯规标志
  }
  }
  if(foul_flg==1) //如果有人犯规
  {
  while(control_key()==1); //等待主持人按键以进入下一轮
  continue; //主持人按键后进入下一轮
  }
  else //如果没有人犯规,必定是主持人允许答题
  {
  intr_counter=set_time(); //读取倒计时时间
  init_t0(); //定时器T0开始计时
  buz_on(); //蜂鸣器响500ms
  while(time_over_flg==0&&key_flg==0)
  {
  key_number=getkey_num(); //在规定时间内检查是否有按键
  if(key_number!=0) //如果有
  {
  key_handle(key_number);//按键处理
  key_flg=1; //设置有人按键答题标志
  TR0=0; //停止T0运行
  }
  else //否则循环检测
  {
  display_time(); //并显示剩余时间
  continue;
  }
  }
  if(key_flg==1) //如果有人在规定时间内答题
  {
  while(control_key==1); //等待主持人按键以进入下一轮
  continue; //主持人按键后进入下一轮
  }
  else //倒计时时间到仍无人按键
  {
  time_over_handle(); //超时处理
  while(control_key==1); //等待主持人按键以进入下一轮
  continue; //主持人按键后进入下一轮
  }
  }
  }
}
bit control_key(void) //检测主持人是否按键
{


  if(KEY5==1) //如果KEY5为高,说明没有按键
  return 1; //返回1,表示没有按键动作
  else //如果KEY5为低,说明可能有按键动作
  delay_20ms(); //延时20ms,去抖动
  if(KEY5==1) //如果20ms后KEY5变为高电平,是干扰
  return 1; //返回1
  else //如果20ms后仍为低电平,确认有按键动作
  return 0; //返回0
}
uchar set_time(void) //根据设置决定倒计时时间
{
  uchar intr_counter;
  if(P3^6==0) intr_counter=200; //10s
  else if(P3^5==0) intr_counter=160; //8s
  else if (P3^4==0) intr_counter=120; //6s
  else if (P3^3==0) intr_counter=80; //4s
  else intr_counter=200; //如果没有设置,默认为10s
  return intr_counter;
}
uchar get_key_num() //检测哪个参赛者按键
{
  uchar key_state=0;
  key_state=P1;
  key_state&=0x0f; //读取P1端口的低4位
  if(key_state==0x0f) //若均为高电平,说明无人按键
  return 0; //返回1
  else
  {
  key_state^=0xff;
  if(key_state&0x01) return 1; //如果KEY1被按下,返回1
  else if(key_state&0x02) return 2; //如果KEY2被按下,返回2
  else if(key_state&0x04) return 3; //如果KEY3被按下,返回3
  else return 4; //如果KEY4被按下,返回4
  }
}
void foul_handle(uchar key_number) //犯规处理
{
  write_digit(DIGIT0,key_number); //显示犯规者号码
  write_digit(DIGIT1,0x0f); //显示"FF"
  write_digit(DIGIT2,0x0f);
  buz_on(); //蜂鸣器响
}
void time_over_handle(void) //超时处理
{
  write_digit(DIGIT0,0x0); //显示"0"
  write_digit(DIGIT1,0x0e); //显示"EE"
  write_digit(DIGIT2,0x0e);
  buz_on(); //蜂鸣器响
}
void key_handle(uchar key_number) //按键处理
{
  write_digit(DIGIT0,key_number); //显示按键者号码
  buz_on();
}
void display_time(void) //显示倒计时剩余时间
{
  uchar number;
  write_digit(DIGIT0,LED_code[0]);
  number=int_counter/20; //秒数
  write_digit(DIGIT1,number/10); //秒数的十位数字
  write_digit(DIGIT2,number%10); //秒数的个位数字  
}
void buz_on(void)  
{
  uchar i;
  BUZ=0; //开蜂鸣器
  for(i=1;i<=25;i++) //延时500ms
  delay_20ms;
  BUZ=1; //关蜂鸣器
}
void init_t0(void)
{
  TMOD=0x01; //T0选择工作方式1,16位定时器
  TH0=TIMER_HBYTE; //定时时间为50ms
  TL0=TIMER_LBYTE;  
  EA=1; //使能CPU中断
  ET0=1; //使能T0溢出中断
  TR0=1; //T0运行  
}
void isr_t0(void) interrupt 1 //T0中断服务函数
{  
  TH0=TIMER_HBYTE; //定时时间为50ms
  TL0=TIMER_LBYTE;
  intr_counter--; //中断次数
  if(intr_counter==0) //倒计时时间到
  {
  time_over_flg=1; //设置超时标志
  TR0=0;//禁止T0运行
  }
}
void delay_20ms(void) //延时20ms
{
 uchar i,j;
 for(i=0;i<20;i++)
  for(j=0;j<120;j++);
}
void write_digit(uchar digit,uchar number) //显示数字


{
  if(number==0) P0=0x3f;
  else if(number==1) P0=0x06;
  else if(number==2) P0=0x5b;
  else if(number==3) P0=0x4f;
  else if(number==4) P0=0x66;
  else if(number==5) P0=0x6d;
  else if(number==6) P0=0x7d;
  else if(number==7) P0=0x07;
  else if(number==8) P0=0x7f;
  else if(number==9) P0=0x6f;
  else if(number==14) P0=0x79;
  else if(number==15) P0=0x71;
}

[解决办法]
哪里贴来程序?

数码管的地址DIGIT0, DIGIT1, DIGIT2 哪里定义的?
数码管的七段译码数组 LED_code 哪里定义的?
在buz_on函数里:
void buz_on(void)

uchar i; 
BUZ=0; //开蜂鸣器 
for(i=1;i <=25;i++) //延时500ms 
delay_20ms(); //函数调用要加括号 BUZ=1; //关蜂鸣器 

热点排行