高手帮忙看一下这程序

2019-03-24 19:11发布

#include<reg51.h>    //  包含51单片机寄存器定义的头文件
unsigned char code Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};  //数字0~9的段码
unsigned char int_time ; //中断次数计数变量
unsigned char second;    //秒计数变量
unsigned char minute;    //分钟计数变量
unsigned char hour;     //小时计数变量
unsigned char Count;  //计数变量sbit S1=P1^4;          //将S1位定义为P1.4
sbit S2=P1^5;          //将S2位定义为P1.5
sbit S3=P1^6;          //将S3位定义为P1.6
sbit S4=P1^7;          //将S4位定义为P1.7
sbit S5=P1^3     //将S5位定义为P1.3/*********************************************
函数声明
**********************************************/
//void time();
//void jishu();
/******************************************************************
函数功能:数码管扫描延时
********************************************************************/
void delay(void)    
{  unsigned char j;
   for(j=0;j<200;j++);
}/******************************************************************
函数功能:键盘扫描延时
********************************************************************/
void delay60ms(void)
  {
    unsigned char i,j;
  for(i=0;i<200;i++)
  for(j=0;j<150;j++);
  }/******************************************************************
函数功能:显示秒
入口参数:s
********************************************************************/
 
void DisplaySecond(unsigned char s)
{
   P2=0x02;        //P2.6引脚输出低电平, DS6点亮
   P0=Tab[s/10];          //显示十位
   delay();   P2=0x01;       //P2.7引脚输出低电平, DS7点亮
   P0=Tab[s%10];         //显示个位
 delay();
 P2=0x00;     //关闭所有数码管
  
 }
 
/******************************************************************
函数功能:显示分钟的子程序
入口参数:m
********************************************************************/
void DisplayMinute(unsigned char m)
{
      P2=0x10;   // P2.3引脚输出低电平, DS3点亮
      P0=Tab[m/10];//显示个位
   delay();
   P2=0x08;   // P2.4引脚输出低电平, DS4点亮
   P0=Tab[m%10];
   delay();
      P2=0X04;
      P0=0xbf;   //分隔符"-"的段码
   delay();   P2=0x00;   //关闭所有数码管  }/******************************************************************
函数功能:显示小时的子程序
入口参数:h
********************************************************************/
void DisplayHour(unsigned char h)
{
  
   P2=0x80;        //P2.0引脚输出低电平, DS0点亮
   P0=Tab[h/10];          //显示十位
   delay();
 
   P2=0x40;       //P2.1引脚输出低电平, DS1点亮
   P0=Tab[h%10];    //显示个位
 delay();   
 P2=0x20;     //P2.2引脚输出低电平, DS2点亮
    P0=0xbf;   //分隔符"-"的段码
   delay();   P2=0x00;     //关闭所有数码管
   
 }
/******************************************************************
函数功能:键盘扫描
********************************************************************/
void key_scan(void)
{
     P1=0xf8;   //将P1口高4和低位的第4位位置高电平"1"
  if(S5=1)
  {
  time();
  }
  if(S5=0)
  {
  jishu();
  }
  /* if((P1&0xf0)!=0xf8)         //有键按下
    {
       delay60ms();         //延时60ms再检测
        if((P1&0xf0)!=0xf0)         //确实有键按下
     {
             if(S1==0)      //如果是S1键按下
                second++;   //秒加1
        if(S2==0)      //如果是S2键按下
              minute++;    //分钟加1
       if(S3==0)     //如果是S3键按下
              hour++;      //小时加1
       if(S4==0)     //如果是S4键按下
              {
          second=0;   //秒清0
          minute=0;   //分钟清0
          hour=0;     //小时清0
        }
      
              } 
    }  */
}/******************************************************************
函数功能:主函数
********************************************************************/ void main(void)
   {
      
   TMOD=0x01;             //使用定时器T0  
   EA=1;                  //开中断总允许
   ET0=1;                 //允许T0中断
   TH0=(65536-46083)/256;  //定时器高八位赋初值
   TL0=(65536-46083)%256;  //定时器低八位赋初值
   TR0=1;                 //启动定时器T0
   int_time=0;    //中断计数变量初始化
   second=0;      //秒计数变量初始化
   minute=0;     //分钟计数变量初始化
   hour=0;       //小时计数变量初始化
         Count=0;   //车位计数变量初始化
         while(1)
   {      
       DisplaySecond(second);    //调用秒显示子程序
         DisplayMinute(minute);   //调用分钟显示子程序
      DisplayHour(hour);       //调用小时显示子程序
         void DisplayCount(void); //调用车位显示子程序        
     }
  }/******************************************************************
函数功能:定时器T0的中断服务子程序
********************************************************************/
  void interserve(void ) interrupt 1 using 1  //using Time0
  {
     TR0=0;                 //关闭定时器T0
     int_time++;           //中断次数加1
   if(int_time==20)    //如果中断次数满20
     {
              int_time=0;    //中断计数变量清0
          second++;      //秒计数变量加1
   }
   if(second==60)      //如果秒计满60
      {
     second=0;    //如果秒计满60,将秒计数变量清0
     minute++;    //分钟计数变量加1
    }
   if(minute==60)    //如果分钟计满60
     {
      minute=0;    //如果分钟计满60,将分钟计数变量清0
      hour++;      //小时计数变量加1
     }
   if(hour==24)     //如果小时计满24
     {
   hour=0;              //如果小时计满24,将小时计数变量清0
        }
   if(Count==85)     //如果车位计满85个,将重置为0
     {
     Count==0
     }
      key_scan();               //执行键盘扫描
      TH0=(65536-46083)/256;    //定时器T0高四位赋值
   TL0=(65536-46083)%256;    //定时器T0低四位赋值
      TR0=1;                   //启动定时器T0
  
  }
/*****************************************************
显示计数功能
   P2=0x10;   // P2.3引脚输出低电平, DS3点亮
      P0=Tab[m/10];//显示个位
   delay();
   P2=0x08;   // P2.4引脚输出低电平, DS4点亮
   P0=Tab[m%10];
   delay();
*****************************************************/
void DisplayCount(unsigned char Count)

  P2=0x10;            // P2.3引脚输出低电平, DS3点亮      
  P0=Tab[Count/10];   //显示个位
  delay();
  p2=0x08;      // P2.4引脚输出低电平, DS4点亮
  P0=Tab[Count%10];   //显示十位
  delay();
  P2=0x00;            //关闭所有数码管
}
 /************************************************
 车位按键函数
 **********************************************/
 void jishu()
 {
      if(S2==0)             //读取P3.7口按钮状态
        {
          delay60ms();           //调用延时,防抖动
          if(S2==0)         //确定按钮按下
            {
              Count++;        //计数累加
              if(Count==86)   //检查溢出
                {
   
                  Count=0;       //计数归零
                }
             // P0=Tab[Count/10];   //数码管显示十位数字
             // P1=Tab[Count%10];  //数码管显示个位数字
             // while(P3_7==0);
            }
        }
  if(S3==0)             //读取P3.6口按钮状态
        {
          delay60ms();           //调用延时,防抖动
          if(S3==0)         //确定按钮按下
            {
   
              Count--;        //计数累加
              if(Count==0)   //检查溢出
                {
   
                  Count=85;       //计数倒退到99
                }
              //P0=Tab[Count/10];   //数码管显示十位数字
              //P1=Tab[Count%10];  //数码管显示个位数字
              //while(P3_6==0);
            }
        }
  if(S4==0)             //读取P3.5口按钮状态
        {
          delay60ms();           //调用延时,防抖动
          if(S4==0)         //确定按钮按下
            {
   
              Count=0;        //清零复位
              //P0=Tab[Count/10];   //数码管显示十位数字
              //P1=Tab[Count%10];  //数码管显示个位数字
              //while(P3_7==0);
            }
        }  
    
//}
}
/********************************************
时间检测函数
*******************************************/
void time()
{
if((P1&0xf0)!=0xf8)         //有键按下
    {
       delay60ms();         //延时60ms再检测
        if((P1&0xf0)!=0xf0)         //确实有键按下
     {
             if(S1==0)      //如果是S1键按下
                second++;   //秒加1
        if(S2==0)      //如果是S2键按下
              minute++;    //分钟加1
       if(S3==0)     //如果是S3键按下
              hour++;      //小时加1
       if(S4==0)     //如果是S4键按下
              {
          second=0;   //秒清0
          minute=0;   //分钟清0
          hour=0;     //小时清0
        }
      
              } 
    }
} 些程序是我自己改的,目的是实现计数跟计时的功能。
但用proteus仿真的时候老是出错
TEST.C(23): error C141: syntax error near 'void', expected ';' 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
ylf175300
1楼-- · 2019-03-25 04:47
sbit S5=P1^3     //将S5位定义为P1.3,我看了一下还有好多错的啊

一周热门 更多>