⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 题1.c

📁 单片机C语言15个实验附有原理图和程序 是我的课程作业 以经过实践验证
💻 C
字号:

#include <stdio.h>
#include <reg52.h>
#include <intrins.h>
#define hi 0x3c                                             //50ms定时
#define lo 0xb0   
#define  hi0 0xF0                                                                                        
#define  lo0 0x00  
#define  uchar unsigned char
#define  uint  unsigned int
uchar code ledk[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar time[4]={0,0,0,0};                                    
uchar key,dled,keymark=0xef,ledmark1=0xfe;
uchar key_code=0,press=0,key_flag=0,count_t0=0,count_t1=1;
uchar leftright=0;                                          //对某一位设置标志
uint  count_sec=0;                                          //初始设定时间位分钟
unsigned char mark=0,mark1,mark2;
unsigned char mark3,mark4;
unsigned char startmark=0;
unsigned char startbell=0;
unsigned char bell=0,bellmark=0;
sbit  add=P2^4;     sbit sub=P2^5;
sbit  Left=P2^6;    sbit Right=P2^7; 
sbit   P37=P3^7;
sbit   signal=P0^6;
sbit   clk=P0^7;
sbit   P30=P3^0;
void delay(unsigned int n)                                    //延时函数
 {unsigned int i,j;
  for(i=0;i<n;i++)
     for(j=0;j<n;j++) ;
 }

void shift(uchar LED)                                         //数据输出函数
{static uchar DA;
   uchar j=0;
    DA=LED;
   	while(j<8)
	{if((DA&0x80)!=0) signal=1;
       else  signal=0;
	   clk=0;
       clk=1;
	   DA<<=1;
       j++;
	}  
}

void int0( void ) interrupt 0
{ TR1=0; ET1=0;
  TH0=hi;TL0=lo;
  TR0=1;
  mark=1;
}  
void t0( void ) interrupt 1                               
{  if(bellmark==0)
    { count_t0++;
      TH0=hi;TL0=lo;
      startmark=0;
	 }
   if(bellmark==1)
   {TH0=hi0; TL0=lo0;
     P30=!P30;
     bell++;
     if(bell==50)
      { TR0=0; bell=0;bellmark=0;P30=1;} 
   }
}
void int1( void ) interrupt 2
{ count_sec=0;
  count_sec=count_sec+time[0];
  count_sec=count_sec+time[1]*10;
  count_sec=count_sec+time[2]*60;
  count_sec=count_sec+time[3]*600;
  TH1=hi ;TL1=lo ;
  TR1=1; ET1=1;
  TR0=0;
  mark=0;
  startmark=1;
  startbell=1;
}  

void t1( void ) interrupt 3                               
{ 
       count_t1++;
       TH1=hi;TL1=lo;	  
     if(count_t1==20)
	 { count_t1=0;
	   if(startmark==1)
       { count_sec--;
	     time[3]=(count_sec/60)/10;                         //十分位
	     time[2]=(count_sec/60)%10;                         //分位
	     time[1]=(count_sec%60)/10;                         //十秒位
	     time[0]=(count_sec%60)%10;                         //秒位
		 if(count_sec==0) 
		  { startbell=0; startmark=0;}
		 if(count_sec%30==0&&startbell==1)
		  { TH0=hi0;TL0=lo0; TR0=1; bellmark=1; }
       }
	 }
}

/*uchar scankey(void)
 {unsigned char	key_code;
  static unsigned char column=1;
 
  if(P37==1 && key_flag==1){key_code=column;key_flag=0;press=1;}
      else key_code=0xff;
   P2=keymark|(ledmark1&0x0f);
   if(key_flag==0 && P37==0)
       key_flag=1; 
   keymark=_crol_(keymark,1);
   if(keymark==0x0e) keymark=0xe0;
   column++; 
   if(column>4)  column=1; 
   return(key_code);

 }*/
unsigned char scankey(void)
{   unsigned char	key_code=0xff;  
   add=0;
  if (P37==0)
     mark1=1;
  if(P37==1&&mark1==1)
     {key_code=1;mark1=0;press=1;}
	 add=1;
    sub=0;
    if (P37==0)
	   mark2=1;
     if(P37==1&&mark2==1)
       {key_code=2;mark2=0;press=1;}
	 sub=1;
	Left=0;
    if (P37==0)
         mark3=1;	   
     if(P37==1&&mark3==1)
	  { key_code=3;mark3=0;press=1;}
	 Left=1;
    Right=0;
     if (P37==0)
	      mark4=1;
    if(P37==1&&mark4==1)
	   {key_code=4;mark4=0;press=1;}
    Right=1; 			
     return(key_code);
  }
void key_func(key)
 {switch (key)
   {
    case 1:  time[leftright]--;
	         if(leftright==0||leftright==2) 
	           {if(time[leftright]==0xff) time[leftright]=9;}
		     if(leftright==1||leftright==3) 
			   {if(time[leftright]==0xff) time[leftright]=5;}
			 break;
    case 2:  time[leftright]++;
	         if(leftright==0||leftright==2) 
			    { if(time[leftright]==10) time[leftright]=0;}
              if(leftright==1||leftright==3) 
			    { if(time[leftright]==6) time[leftright]=0;}
	          break;
    case 3:  leftright++; if(leftright==4) leftright=0; break;
    case 4:  leftright--; if(leftright==-1) leftright=3; break;
    default: break;
	}
  }

main()
{  uchar i=0; 
   EA=1; ET0=1;ET1=1; EX0=1;EX1=1;IT0=1;IT1=1;
   TMOD=0X11;
   TH1=hi;TL1=lo; TR1=1;  
  while(1)
    {   
	     if(mark==1)
		     key=scankey();
		 if(P37==1&&press==1)
		    { key_func(key);press=0;}
        if(i==2&&count_t1<10)
           { dled=ledk[time[i]]|0x80 ;
		     if(i==leftright&&count_t0%2==0&&mark==1)dled=0x00 ;
			}
         else if(i==leftright&&count_t0%2==0&&mark==1)dled=0x00 ;
		      else dled=ledk[time[i]];
        shift(dled);
		if(count_sec<6&&startbell==1)
           { TH0=hi0;TL0=lo0; TR0=1; bellmark=1; 
		   }
        P2=ledmark1;
        delay(20); 
        ledmark1=_crol_(ledmark1,1);      
	    if(ledmark1==0xef)  ledmark1=0xfe;            
		i++;
        if(i>3) i=0;                                  
    } 
}




 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -