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

📄 jiaotong2.c

📁 交通灯控制源程序
💻 C
📖 第 1 页 / 共 4 页
字号:

 #include   <reg52.h>
 #include   <math.h>
 
 typedef  unsigned  char byte;
 typedef  unsigned  int  word;
 
 #define  XTALL       11.0592
 #define  DLY_1MS    (word) ( 1300*XTALL/12)
 
 #define  REC_BUF     ((byte idata*) 0x80)
 #define  DISP_BUF    ((byte idata*) 0xc0)
 #define  CON_BUF     ((byte idata*) 0xd0)
 #define  disp_buffer ((byte  idata (0xc8))
 #define  QIANG        ((byte idata*)(0xe0)) 
 #define  line_addr   ((byte  xdata*)0xC000)

 #define  step_time   (*(byte idata*) (0xdf))
 #define  addr_num1   (*(byte idata*) (0xf0))
 #define  addr_num2   (*(byte idata*) (0xf1))

 #define CLK_ADR      ((byte xdata*)0x8000)
 #define CLK_SEC      (*(byte xdata*)(CLK_ADR+0x00))
 #define CLK_MIN      (*(byte xdata *)(CLK_ADR+0x02))
 #define CLK_HR       (*(byte xdata *)(CLK_ADR+0x04))
 #define CLK_WK       (*(byte xdata *)(CLK_ADR+0x06))
 #define CLK_DD       (*(byte xdata *)(CLK_ADR+0x07))
 #define CLK_MON      (*(byte xdata *)(CLK_ADR+0x08))
 #define CLK_YY       (*(byte xdata *)(CLK_ADR+0x09))
 #define CLK_REGA     (*(byte xdata *)(CLK_ADR+0x0a))
 #define CLK_REGB     (*(byte xdata *)(CLK_ADR+0x0b))
 #define CLK_REGC     (*(byte xdata *)(CLK_ADR+0x0c))
 #define CLK_REGD     (*(byte xdata *)(CLK_ADR+0x0d))
  
 #define  key_0           0                     /* remoter key  code     */
 #define  key_1           1 
 #define  key_2           2
 #define  key_3           3       
 #define  key_4           4
 #define  key_5           5
 #define  key_6           6
 #define  key_7           7
 #define  key_8           8
 #define  key_9           9
 #define  key_rc          0x0a
 #define  key_rs          0x0b
 #define  key_tc          0x0c
 #define  key_ps          0x0d
 #define  key_hand_outo   0x0e
 #define  key_light_off   0x0f
 #define  key_step        0x13
 #define  key_sch         0x12
 #define  key_hour        0x11
 #define  key_min         0x10

 
 
 struct special_date {
  	byte mon;
  	byte date;
  	byte week;
  	byte project;
  };

 struct project_d {
	byte start_hour;
	byte start_min;	
	byte scheme;
	byte step_num;
 };
  
 struct scheme_d {
	byte out1,out2,out3,out4,out5,out6,out7,out8;
	byte out9,out10,out11,out12,out13,out14,out15;
	byte stop_time;
 };
 #define sp_date 		 (xdata struct special_date *)(0x0000)
 #define sp_project	 (xdata struct project_d *)(0x0100)
 #define sp_scheme	 (xdata struct scheme_d *)(0x1000)
 #define sp_address   ((xdata byte*)0x0000)
 
  idata byte num_plan,num_control,num_step,cur_step,num_1s,num1,y,mon,d,w,h,m,s;
  idata byte sp_state,sp_time,scan_num,numa,numb,numc,num_100,num_80,num2; 
  idata byte cur_year=0x00,cur_mon=0x00,cur_date=0x00,cur_min=0x00,cur_hour=0x00,cur_week=0x00;
  byte  key_set, key_system_set;
  byte  return_state,flag_writ;
  byte  cur_project,key_check;
 
  byte  code  tab_num[12]={0x81,0xf5,0x49,0x61,0x35,0x23,0x02,0xf1,0x01,0x21,0xff,0x7f}; 
  byte code  tab_key[4][5] = {
      0x0A,0x07,0x08,0x09,0x10, /*RA,7,8,9,set_min */
      0x0B,0x04,0x05,0x06,0x11, //RS,4,5,6,set_hour
      0x0C,0x01,0x02,0x03,0x12, //TC,1,2,3,set_sch
      0x0D,0x00,0x0E,0x0F,0x13, //PS,0,hand,light
      };
  word address,sum,gao,di,time_10ms;

  bit  rec_flag,half_flag=0,flag_10ms,flag_3s,light_on,flag_write,first_flag;
  bit  hand_on,flag_20ms,err_flag,gao_err,control_flag,force_flag,selet_hand,change_date_flag;
  bit  key_pass, run_state,no1,key_state,hand,scan_flag,str_flag;

  sbit  TXD1   =0x94;
  sbit  RXD1   =0x97;
  sbit  LAT1   =0x96;
  sbit  KEY1   =0x90;
  sbit  KEY2   =0x91;
  sbit  KEY3   =0x92;
  sbit  KEY4   =0x93;
  sbit  LAT2   =0x95;
  sbit  G=0xb5;
 ////////////////////////////
 void  int_ex0()  interrupt  0  using 1{
   key_state=1;
   time_10ms=0x0000;
   flag_10ms=0;
   EX0=0;
 } 
 void  timer0_isr()  interrupt  1  using 1{
       TR0=0;
       TH0=-(DLY_1MS/256);
       TL0=-(DLY_1MS%256);
       TR0=1;
       G=1;
       num1++;
       num2++;
       if(num2==80)
          {num_80++;num2=0;}
       if(num_80==10)
         {half_flag=~half_flag;num_80=0;}    
       if (num1%10==0)
         flag_10ms=1;
       if(num1%20==0)
         {G=0;
          flag_20ms=(~flag_20ms);}
             if(num1==100)
          {num_100++;num1=0;} 
       /*if(num_100%5==0)half_flag=~half_flag;*/                
       if (num_100==10) {num_1s++;num_100=0;/* half_flag=~half_flag;*/ } 
       if (num_1s==3) flag_3s=1;
       if(hand&&(return_state==4))
         num_1s=0;           
      } 
 void  serial() interrupt 4 using 1{  
       static idata byte sp_offset; 
       byte receive_num;   
       RI=0;
       receive_num=SBUF;
       switch (sp_state){
        case  0x00:  if (receive_num==0x55) sp_state=0x01; break;      /*check  first checkout number*/
        case  0x01:  if (receive_num==0xaa) sp_state=0x02;
                         else sp_state=0x00;  break;
        case  0x02:  if (receive_num==0xfc) sp_state=0x03;
                         else sp_state=0x00;  break;
        case  0x03:  if (receive_num==0x01)                             /*0x04 is rework the date,0x05 is rework eeprom*/
                         {
                           sp_state=0x04;sum=0;break; 
                                         }   
                     if (receive_num==0x02)
                          {
                            sp_state=0x09;break;               
                                           }              
                                                
                     if (receive_num==0x03)
                          {
                           sp_offset=0;sp_state=0x05;sum=0;break;
                                               } 
                     else  sp_state=0x00; break; 
                     break;
        case  0x04:  switch(sp_time){
                           case  0x00:   sum+=(word)receive_num;  y=receive_num;   sp_time=0x01; break;
                           case  0x01:   sum+=(word)receive_num; mon=receive_num;sp_time=0x02; 
                                         if ((receive_num>0x12)||(receive_num==0)) err_flag=1;break;                                               
                           case  0x02:   sum+=(word)receive_num;  d=receive_num;sp_time=0x03; 
                                         if (((((((mon==1)||(mon==3))||(mon==5))||(mon==7))||(mon==8))||(mon==10))||(mon==12)){
                                            if ((receive_num>0x31)||(receive_num==0)) err_flag=1; 
                                                  break;}
                                         if((((mon==4)||(mon==6))||(mon==9))||(mon==11)){
                                             if ((receive_num>0x30)||(receive_num==0)) err_flag=1;break;}                                                                                                        
                                         if(mon==2){
                                             if((receive_num>0x29)||(receive_num==0))err_flag=1;break;
                                              }
                                         break;                           
                           case  0x03:   sum+=(word)receive_num; w=receive_num;   sp_time=0x04;  
                                         if (receive_num>6)  err_flag=1;  break;   
                           case  0x04:   sum+=(word)receive_num; h=receive_num;   sp_time=0x05;
                                         if (receive_num>0x23) err_flag=1;  break;    
                           case  0x05:   sum+=(word)receive_num; m=receive_num;   sp_time=0x06;
                                         if (receive_num>0x59) err_flag=1;  break;   
                           case  0x06:   sum+=(word)receive_num; s=receive_num;   sp_time=0x07;
                                         if (receive_num>0x59) err_flag=1;  break;
                           case  0x07:   gao=(sum>>8);
                                         if(((word)receive_num^gao)!=0)  err_flag=1;
                                         sp_time=0x08;
                                         break;
                           case  0x08:   di=(sum&0x00ff); 
                                         if(((word)receive_num^di)!=0) err_flag=1;            
                                         sum=0;/*gao=0;di=0;*/
                                         sp_state=0x00;sp_time=0x00;         
                                         if (err_flag){SBUF=0xff;while(TI==0);TI=0;}
                                         if (!err_flag){while((CLK_REGA&0x80)&&(flag_write));change_date_flag=1;
                                                               CLK_YY=y;CLK_MON=mon;CLK_DD=d;CLK_WK=w;
                                                               CLK_HR=h;CLK_MIN=m;CLK_SEC=s;
                                                               SBUF=0x00;while(TI==0);TI=0;}
                                         err_flag=0;
                                         break;       
                           default:      sp_time=0x00;sp_state=0x00;    break;
                                       }                                         
							 break;               
        case  0x05:  addr_num1=receive_num;sp_state=0x06; break;
        case  0x06:  addr_num2=receive_num;sp_state=0x07; sp_offset=0;break;                                 
        
        case  0x07:  if(sp_offset<64){
                        sum+=(word)receive_num;
                        *(REC_BUF+sp_offset)=receive_num;sp_state=0x07;  SBUF=receive_num; while(TI==0); TI=0;
                         sp_offset++;break;     } 
                     if(sp_offset==64){ 
                        sp_state=0x08; sp_offset=0;  gao=(sum>>8);
                        if(((word)receive_num^gao)!=0) err_flag=1;
                        break; } 
                     break;                 
       case   0x08:  di=(sum&0x00ff); 
                     if((((word)receive_num^di)!=0)||(err_flag)) {err_flag=1;SBUF=0xff;while(TI==0);TI=0;}
                     if(!err_flag) {rec_flag=1; SBUF=0x00;while(TI==0);TI=0;}
                     err_flag=0;
                     sp_state=0x00;
                     sum=0;/* gao=0;di=0;*/
                     break; 
       case  0x09:   if (receive_num==0x01) {sp_offset=0;sum=0;sp_state=0x0a;break;}   
                     if (receive_num==0x02) {
                         if (cur_step<num_step) {cur_step++; num_1s=0;}
                         if (cur_step==num_step)cur_step=0;
                         hand_on=1;sp_state=0x00;break;} 
                     if(receive_num==0x03)  sp_state=0x0c;                                 
                     break;
       case 0x0a:    if(sp_offset<16){
                        sum+=(word)receive_num; 
                        if ((sp_offset==15)&&(receive_num>99)) err_flag=1;
                        *(QIANG+sp_offset)=receive_num; sp_state=0x0a; sp_offset++;
                        SBUF=receive_num; while(TI==0); TI=0;
                         break;     } 
                     if(sp_offset==16){
                        sp_state=0x0b;sp_offset=0;gao=(sum>>8);
                        if(((word)receive_num^gao)!=0) err_flag=1;
                        break; } 
                     break;
      case 0x0b:    di=(sum&0x00ff); 
                    if((((word)receive_num^di)!=0)||(err_flag))  {SBUF=0xff;while(TI==0);TI=0;}
                    else {control_flag=1;SBUF=0x00;while(TI==0);TI=0;}
                    err_flag=0; sum=0; /*gao=0;di=0;*/
                    sp_state=0x00;
                    break;
       case 0x0c:   numa=receive_num;sp_state=0x0d;break;
       case 0x0d:   numb=receive_num;sp_state=0x0e;break;
       case 0x0e:   numc=receive_num;sp_state=0x00;first_flag=1;break;                                                                                              
       default:     break;
                                }  
                }
   void qiang(){
            byte  i;
            for(i=0;i<16;i++) *(CON_BUF+i)=*(QIANG+i);
            }              
   void err_judge(){

⌨️ 快捷键说明

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