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

📄 ps22c.c

📁 基于S51单片机的C源码 对学习S51单片机的同学很有帮助 包含了实验室的和多模块程序
💻 C
字号:

/*
*/
#pragma small  //LARGE
#include <absacc.h>
#include <reg52.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define clear   0x01  //清屏幕,约1.6ms
#define home    0x02   //光标回零(左上角)/
#define f_set   0x30  //并行、基本指令
#define dis_on  0x0f  //打开显示,光标,闪烁功能
#define in_mode 0x06  //输入方式,地址增1,光标右移
#define panel_num 10
//#include "LSP11.H"

#define C_ad 5
/*----------------------------------------------------------------------*/
//sbit P_RS=P0^0;   //P0^3; P1.5
//sbit P_RW=P0^1;   //P0^2;
//sbit P_E=P0^2;    // P0^0;

//sbit bee=P3^0;

/*********************************************************/
/*
	12Mhz   1us/time
	T1==100us
	T0==50ms interrupt
	*/
sbit load=P0^6; /*0;*/
//sbit ad43_cs=P1^3;
sbit x25_cs=P1^2;  //0xb0^4;
sbit x25_WP=0xb0^5;
sbit clk=P0^5;  /*1;*/
sbit din=P0^7;
sbit dout25=P3^3;
//sbit dout43=P1^7;
//sbit load2=P3^2;
//sbit heating=P1^0;
sbit flag1=P0^3;  //1^1;
sbit flag2=P0^4;  //1^2;
bdata uchar ab;
sbit abit0=ab^0;sbit abit1=ab^1;sbit abit2=ab^2;sbit abit3=ab^3;
sbit abit4=ab^4;sbit abit5=ab^5;sbit abit6=ab^6;sbit abit7=ab^7;
data unsigned char T_50ms,T_key,ms_timing,second,second1,second_k,minute,minuter,hour,vent_hour,old_hour,s_hour,old_s_hour;
idata uchar chint,str[15],count_232;
idata uchar dis_buff[10];

/*********************************************************/
bdata uchar iab;
sbit iabit0=iab^0;sbit iabit1=iab^1;sbit iabit2=iab^2;sbit iabit3=iab^3;
sbit iabit4=iab^4;sbit iabit5=iab^5;sbit iabit6=iab^6;sbit iabit7=iab^7;

data uchar second_COM;

sbit din_ps2=P0^0;  //1^0;
sbit clk_ps2=P3^2;
bit    flag_COM,busy,flag_start;  //flag_unit2;
uchar COM_buff[10],COM_ptr,bit_count;
int xx,yy;
/*----------------------------------------------------*/
uchar *ptr;
idata struct  v_data{
   uchar status;
   uint  xx,yy;
   uchar end;
   };
idata struct v_data DA;
/*----------------------------------------------------*/

/*********************************************************/


data  uchar key_sfr;
bdata  uchar key_sfr0;
       sbit key_chk             =key_sfr0^0;
       sbit key_stage           =key_sfr0^1;
       sbit key_ok              =key_sfr0^2;
       sbit key_left            =key_sfr0^3;
       sbit key_up              =key_sfr0^4;
       sbit key_right           =key_sfr0^5;
       sbit key_set             =key_sfr0^6;
       sbit key_down            =key_sfr0^7;
bit    key_run,flag_key,flag_232C;
/*---------------------------------------------------------*/
/*----------------------------------------------------*/
void rst_wdog(void)
{
x25_cs=0;
x25_cs=1;
}
/*----------------------------------------------------------------------*/
void init(void);
/*----------------------------------------------------------------------*/
void initial(void)
{
TMOD=0X21;          //定时器1 置初值 方式0
TH0=0X3C; TL0=0Xa6;
//PT1=1;
ET0=TR0=1;   //开定时器1中断
EA=1;
//P1=0xf8;
init();
}
/*---------------------------------------------------------*/
void init(void)
{
TH1=TL1=0;   //定时器1开中断 一次定时     方式1  256us
ET1=TR1=1;

}
/*----------------------------------------------------*/
void T2_init(void)  //定时方式2
{
T2CON=0x34;
TR2=1;
RCAP2H=0xff; RCAP2L=0xb2; //4800
//RCAP2H=0xff; RCAP2L=0xd9; //9600
TH2=0xff;TL2=0;
//ET2=1;
SCON=0xf0;
TB8=1;
SM2=1;
SBUF=0;   //定时中断2将SBUF清零
REN=1;
RI=0;
ES=0;
EA=1;

}
/*---------------------------------------------------------*/
void itoa(int x,unsigned char *str)     //16进制转ASCII 显示字符

{                                       //液晶显示用
unsigned int n;
unsigned char chn,*p,str1[5];
data unsigned char i,j;
if(x<0){
	*str++='-';
	x=-x;
	}
n=x;
p=str1;
j=0;
while(n!=0){
	chn=n%10;
	n=n/10;
	*p++=chn+'0';
	j++;
	}
if(j!=0){
	p--;
	for(i=0;i<j;i++)*str++=*p--;
	}
else    *str++='0';
*str=0;
return;
}
/*---------------------------------------------------------*/
/*---------------------------------------------------------*/
void delay(uchar n)//延时程序
{
data uchar i,j,k;
for(i=0;i<n;i++){
	for(j=0;j<250;j++){
		for(k=0;k<25;k++){
			rst_wdog();
			}
		}
	}
}
/*---------------------------------------------------------*/
/*********************************************************/
void ex_int0(void) interrupt 0 using 2
{

if(flag_COM)return;//当flag_COM=0 向下执行
TL1=0; //TH1=0xdf;  //从新
if(flag_start){
      busy=1;
      flag_start=0; din_ps2=1; //sbit din_ps2=P0^0  sbit clk_ps2=P3^2;
      COM_ptr=0; bit_count=0;
      //busy=1; second_COM=0;
      }else{
      if(!busy)return;
      bit_count++;
      //if(bit_count>10){bit_count=11; flag1=!flag1; }
      switch(bit_count){
         case 0:
             break;
         case 1:
         case 2:
         case 3:
         case 4:
         case 5:
         case 6:
         case 7:
         case 8:
             //iab=COM_buff[COM_ptr];
             iab>>=1;
             iabit7=din_ps2;
             //COM_buff[COM_ptr]=iab;
             break;
         case 9:
             //COM_ptr++;
             //iab=COM_buff[COM_ptr];
             //dout=iabit0;
             COM_buff[COM_ptr]=iab; //将第一次收到的值给 COM_buff[0]
             COM_ptr++;
             break;
         case 10:
             flag2=!flag2; bit_count=-1;
             if(COM_ptr>=3){
                     iab=COM_buff[0];
                     if(!iabit4) xx+=COM_buff[1]; else xx+=(COM_buff[1]|0xff00);
                     if(!iabit5) yy+=COM_buff[2]; else yy+=(COM_buff[2]|0xff00);
                     if(iabit0)xx=yy=0;
                     COM_ptr=0; busy=0; flag_COM=1;}    //COM_ptr>3
             break;
         default:
             //bit_count=0;
             break;
         }
       }

IE0=0; IE1=0;
}
/*********************************************************/
void ex_int1(void) interrupt 2 using 3
{
}

/*********************************************************/

/*********************************************************/
void t0int(void) interrupt 1 using 1
{
/*TH0=0X3C; TL0=0XB6; 50ms */
/*TH0=0xfc; TL0=0x1e;*/ /*1ms*/
/*TH0=0x3c; TL0=0xa6;*/
/*每次62.5MS=62500=F424H=(0BDCH)补码
        每16次中断为1秒
        */
TH0=0x0b; TL0=0xe0;  /*DC+4=E0H*/

/***********/
   T_50ms++;T_key++;  //公共时钟
   ms_timing++;
   if((ms_timing&0x10)!=0){
	ms_timing=0;second++;
	second1++; second_k++,second_COM++;
	if(second>=60){
		second=0;minute++;minuter++;
		if(minute>=60){
			minute=0;hour++;
			}
		}
	}
}
/*********************************************************/
void t1int(void) interrupt 3 using 3
{
flag_start=1;              //定时中断1 传10位的时间
}
/*********************************************************/
/*----------------------------------------------------*/

/*interrupt [0x23] void SCON_int (void);     Serial Port */
    /* Serial Port */
void SCON_int(void) interrupt 4 using 1
{
}
/*----------------------------------------------------*/
void t2int(void) interrupt 5 using 3
{
//flag_start=1;
}
/*********************************************************/

int i2hex(uchar x)
{
uchar cl,ch;
cl=x&0x0f; ch=x>>4;
if(cl<=9)cl+='0'; else cl+='A'-10;
if(ch<=9)ch+='0'; else ch+='A'-10;
return (ch<<8)+cl;
}
/*-----------------------------------------------------------------*/
void host_write(uchar x)
{
uchar i,ch;
bit flag;
EX0=0; //禁止外中断
ACC=x; flag=!P;
clk_ps2=0;
for(i=0;i<100;i++)ch=0;
din_ps2=0;
for(i=0;i<20;i++)ch=0;
clk_ps2=1; second1=0;
while(clk_ps2){rst_wdog(); if(second1>20)break;}
ab=x;
second=0;
//din_ps2=1;
for(i=0;i<8;i++){
   din_ps2=abit0;
   ab>>=1;
   while(!clk_ps2){if(second>10) break;}
   while(clk_ps2){if(second>10) break;}
   }
din_ps2=flag;         //校验位
   while(!clk_ps2){if(second>10) break;}
   while(clk_ps2){if(second>10) break;}
din_ps2=1;         //停止位
   while(!clk_ps2){if(second>10) break;}
   while(din_ps2){if(second>10) break;}
   while(!din_ps2){if(second>10) break;}
   if(second>10)DA.status=0xff; else DA.status=0;
  }
/*-----------------------------------------------------------------*/
/*---------------------------------------------------------*/
void dis_7219(uchar iw,uchar ix)  //,uchar chl)
{
uchar i,j,nc;
clk=0;
//if(chl==0)load=0;else load2=0;
load=0;
for(j=0;j<25;j++)nc=0;
ab=iw;
for(i=0;i<8;i++){
	din=abit7;
	ab<<=1;
		/*abit0=dout;    dout;*/
	clk=1;
	for(j=0;j<5;j++)nc=0;
	clk=0; for(j=0;j<5;j++)nc=0;
	}
ab=ix;
for(i=0;i<8;i++){
	din=abit7;
	ab<<=1;
	         /*abit0=dout;*/
	clk=1;
	for(j=0;j<5;j++)nc=0;
	clk=0; for(j=0;j<5;j++)nc=0;
	}
//if(chl==0)load=1; else load2=1;
load=1;
for(j=0;j<25;j++)nc=0;
}
/*---------------------------------------------------------*/

void main(void)
{
data uchar work,i;  //,count,t_count,m_status,run_status;
data uchar  ch,crect,count;
int xch;
begin:
for(;;){
   dis_7219(1,0x0);     /*送显示数据的内容*/
   dis_7219(2,0x1);
   dis_7219(3,0x2);
   dis_7219(4,0x3);
   dis_7219(5,0x4);
   dis_7219(6,0x5);
   dis_7219(7,0x6);
   dis_7219(8,0x7);
   }
P1=P1&0xff;/*turn off output*/
SP=0xef;
P3=0xff;
delay(10);
SP=0xef;
//ACC=0x57;
//if(!P) ch=1; else ch=0;
initial();//定时器0,1
T2_init();
IT0=IT1=1;
PX0=1; PX1=0; IE0=IE1=0; EX0=1;  EX1=0; //PS2接口利用int0作为CLK
COM_ptr=0; busy=0; flag_COM=0;
xx=yy=0;
dis_7219(2,2);
 for(i=0;i<12;i++)dis_7219(i,i);
din_ps2=1;
host_write(0xf4);
host_write(0x60);
host_write(0xfd);
host_write(0x7a);
count=0;
while(1){
	while(work==second){

                if(flag_COM) break;
		rst_wdog();
		}
	work=second;
        flag1=!flag1;
        EA=ET0=1;
        IT0=1;
        PX0=1;  EX0=1;

   if(flag_COM){
       flag_COM=0;
       //clk_ps2=0;
       TL1=0; //TH1=0xdf;
       flag_start=0;
       for(i=0;i<3;i++)dis_buff[i]=COM_buff[i];
       }
   count++; count&=0x0f;


   for(i=0;i<3;i++){
        //xch=i2hex(dis_buff[i]);
        ch=dis_buff[i];
        //str[2*i]=xch>>8;
        //str[2*i+1]=xch;
        str[2*i]=ch>>4;
        str[2*i+1]=ch&0x0f;

        }
   for(i=0;i<6;i++)dis_7219(i,str[i]);  //i+count);
   if(T_50ms>=4){
   //if(second1>=1){    //通信
         T_50ms=0;
          //second1=0;
          DA.status=dis_buff[0];
          DA.xx=xx; DA.yy=yy;
          DA.end=0x55;
          TI=1; ch=0; crect=0;
          ptr=&DA;
          for(i=0;i<6;i++){
               while(!TI);
               ch=*ptr++; SBUF=ch; crect+=ch;
               TI=0;
               rst_wdog();
               }
           while(!TI);
           SBUF=crect;  //send correct code
           TI=0;
          }
	}
}
/*********************************************************/

⌨️ 快捷键说明

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