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

📄 dianji.c

📁 基于S51单片机的C源码 对学习S51单片机的同学很有帮助 包含了实验室的和多模块程序
💻 C
📖 第 1 页 / 共 3 页
字号:
        f_exit1=T_inti1();       /*初始化*/
        if(f_exit1){ T_err1=0;T_ptr1=3;  second2=0;  Wroutds1(); }  //省去ROM操作,启动温度转换
        else{ T_err1=1; T_ptr1=0;}
        break;
    case 3:
        if(second2>2){
             T_ptr1++;
             Rdoutds1();
             if((0x7f|tt.tp[2])==0xff)flag_sign2=1;
             }
        break;
    case 4:
        T_ptr1=0xff;
        break;
    default:
        T_ptr1=0;
        break;
    }
}
/*-----------------------------------------------------------------*/
void Get_int_temp2(void)
{
//uchar ch,m,n;
switch(T_ptr2){
    case 0:
        f_exit2=T_inti2();       /*初始化*/
        if(f_exit2){ T_err2=0;T_ptr2=3; second3=0;   Wroutds2(); }  //省去ROM操作,启动温度转换
        else T_ptr2++;
        break;
    case 1:
        f_exit2=T_inti2();       /*初始化*/
        if(f_exit2){ T_err2=0;T_ptr2=3; second3=0;  Wroutds2(); }  //省去ROM操作,启动温度转换
        else T_ptr2++;
        break;
    case 2:
        f_exit2=T_inti2();       /*初始化*/
        if(f_exit2){ T_err2=0;T_ptr2=3;  second3=0;  Wroutds2(); }  //省去ROM操作,启动温度转换
        else{ T_err2=1; T_ptr2=0;}
        break;
    case 3:
        if(second3>2){
             T_ptr2++;
             Rdoutds2();
             if((0x7f|tt.tp[2])==0xff)flag_sign3=1;
             }
        break;
    case 4:
        T_ptr2=0xff;
        break;
    default:
        T_ptr2=0;
        break;
    }
}
/*-----------------------------------------------------------------*/
void Get_int_temp3(void)
{
//uchar ch,m,n;
switch(T_ptr3){
    case 0:
        f_exit3=T_inti3();       /*初始化*/
        if(f_exit3){ T_err3=0;T_ptr3=3; second4=0;   Wroutds3(); }  //省去ROM操作,启动温度转换
        else T_ptr3++;
        break;
    case 1:
        f_exit3=T_inti3();       /*初始化*/
        if(f_exit3){T_err3=0; T_ptr3=3; second4=0;  Wroutds3(); }  //省去ROM操作,启动温度转换
        else T_ptr3++;
        break;
    case 2:
        f_exit3=T_inti3();       /*初始化*/
        if(f_exit3){ T_err3=0;T_ptr3=3;  second4=0;  Wroutds3(); }  //省去ROM操作,启动温度转换
        else{ T_err3=1; T_ptr3=0;}
        break;
    case 3:
        if(second4>2){
             T_ptr3++;
             Rdoutds3();
             if((0x7f|tt.tp[2])==0xff)flag_sign4=1;
             }
        break;
    case 4:
        T_ptr3=0xff;
        break;
    default:
        T_ptr3=0;
        break;
    }
}
/*-----------------------------------------------------------------*/
void Get_int_temp4(void)
{
switch(T_ptr4){
    case 0:
        f_exit4=T_inti4();       /*初始化*/
        if(f_exit4){ T_err4=0;T_ptr4=3; second5=0;   Wroutds4(); }  //省去ROM操作,启动温度转换
        else T_ptr4++;
        break;
    case 1:
        f_exit4=T_inti4();       /*初始化*/
        if(f_exit4){T_err4=0; T_ptr4=3; second5=0;  Wroutds4(); }  //省去ROM操作,启动温度转换
        else T_ptr4++;
        break;
    case 2:
        f_exit4=T_inti4();       /*初始化*/
        if(f_exit4){ T_err4=0;T_ptr4=3;  second5=0;  Wroutds4(); }  //省去ROM操作,启动温度转换
        else{ T_err4=1; T_ptr4=0;}
        break;
    case 3:
        if(second5>2){
             T_ptr4++;
             Rdoutds4();
             if((0x7f|tt.tp[2])==0xff)flag_sign5=1;
             }
        break;
    case 4:
        T_ptr4=0xff;
        break;
    default:
        T_ptr4=0;
        break;
    }
}
/*-----------------------------------------------------------------*/
//采集所有路温度数据,分别放在tp[]中
void get_all_temp(void)
{
uint x;
   Get_int_temp0();  //temp 1
   if(T_ptr==0xff){
            T_ptr=0;
            x=(uint)(tt.tp[0]<<8)+tt.tp[1];
            if(flag_sign1==1){x=~x+1;x=-x;}
            if(x<=1600)SYS.ttt[0]=(x*5)>>3;
            }
   Get_int_temp1();  //temp 2
   if(T_ptr1==0xff){
            T_ptr1=0;
            x=(uint)(tt.tp[2]<<8)+tt.tp[3];
            if(flag_sign2==1){x=~x+1;x=-x;}
            if(x<=1600)SYS.ttt[1]=(x*5)>>3;
            }
   Get_int_temp2();  //temp 3
   if(T_ptr2==0xff){
            T_ptr2=0;
            x=(uint)(tt.tp[4]<<8)+tt.tp[5];
            if(flag_sign3==1){x=~x+1;x=-x;}
            if(x<=1600)SYS.ttt[2]=(x*5)>>3;
            }
   Get_int_temp3();  //temp 4
   if(T_ptr3==0xff){
            T_ptr3=0;
            x=(uint)(tt.tp[6]<<8)+tt.tp[7];
            if(flag_sign4==1){x=~x+1;x=-x;}
            if(x<=1600)SYS.ttt[3]=(x*5)>>3;
            }
   Get_int_temp4();  //temp 5
   if(T_ptr4==0xff){
            T_ptr4=0;
            x=(uint)(tt.tp[8]<<8)+tt.tp[9];
            if(flag_sign5==1){x=~x+1;x=-x;}
            if(x<=1600)SYS.ttt[4]=(x*5)>>3;
            }
}
/*-----------------------------------------------------*/
/*系统初始化和中断处理*/
/*-----------------------------------------------------*/
void init(void)
{
TMOD=0X21;
TH0=0X3C; TL0=0Xa6;
PT1=1;
ET0=TR0=1;
TH1=0xf3;
TL1=0xf3;          //4800
TR1=1;           /*启动T1*/
PCON=0x80;       /*波特率=9600*/
SCON=0x50;       /*串行口设置为方式1,REN=1*/
ES=1;
EA=1;            /*开总中断*/
RI=0;
PT0=1;
flag_232C=0;
}
/***************************************************
// 脉冲从P1.0(T2)引脚输入
void init_t2(void)
{
T2CON=0x06;    //16位计数方式 从P1.0输入计数脉冲
TH2=0; TL2=0;
TR2=1;
}
/*---------------定时器0中断----------------*/
void t0int(void) interrupt 1 using 3
{
/*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++;
   ms_timing++;
   if((ms_timing&0x10)!=0){
	ms_timing=0;second++;
       second1++;second2++;second3++;second4++;second5++;second6++;second7++;//990MS,4路温度标志
	if(second>=60){
		second=0;minute++;minuter++;//一分钟定时很准
		}
	}
}
/*-----------DA部分程序---------------*/
void dac5618(uint vcon)//TLC5618DAC子程序,三线串行方式
{
uchar i,j;
uint svcon;
svcon=vcon|0x8000;//vcon最高位置1,选择//TLC5618的A通道
CS=0;//置5618的CS=0,允许片选
for(i=0;i<16;i++)
{
DIN=svcon&0x8000;//串行方式送16位数据
svcon<<=1;
CLK=1;
for(j=0;j<200;j++);
CLK=0;
for(j=0;j<200;j++);
}
CS=1;//禁止片选
return;
}
/*----------------------按键部分(经典)----------------------*/
void get_key(void)
{
data uchar value;
data uint i;
P2|=0x78;
value=P2;
value&=0x78;
if(value!=0x78){
    for(i=0;i<3000;i++);//去抖
    value=P2;
    value&=0x78;
    if(value!=0x78){//的确有键按下
        switch(value){
            case 0: break;
            case 0x70: tune=1; BELL(); break;     //set
            case 0x68: tune=2; BELL(); break;     //右移
            case 0x58: tune=3; BELL(); break;     //增
            case 0x38: tune=4; BELL(); break;     //ok
            default:break;
            }
        }
    }
while(value!=0x78){//判断键是否松开
    P2|=0x78;
    watch_dog();
    minuter=0;
    value=P2;
    value&=0x78;
    }
return;
}
/*-----------------位闪烁--------------------*/
void   disp_chk1(char *p,uchar n1)
{
static data uchar csor;
data uchar *p1;
data char *p2,n;
p2=p; n=n1;
csor=*(p2+n);
if(flag_cursor){
      flag_cursor=0;
      *(p2+n)=csor;
      /*if(*p2&0x80){
             *p2&=0x7f; *p2='-'; //为err=-2--+2而设计
             } */

      dis_str(3,1,p2);
      dis_str(4,16," ");
      }else{
      flag_cursor=1;
      p1=p2;
      *(p1+n)=' ';
      /*if(*p1&0x80){
             *p1&=0x7f; *p1='-';  //为err=-2--+2而设计
             }    */
      dis_str(3,1,p1);
      dis_str(4,16," ");
      }
*(p2+n)=csor;  //恢复闪烁位数据
}
/*------------------------------------------*/
void disp_set_static_panel(uchar n)
{
code uchar hz_tbl[6][15]={
                         " ",
                         "方式设置\0",
                         "设置温度\0",
                         "设置参1\0",
                         "设置参2\0",
                         "设置参3\0",
                          };
  dis_hz_str(1,2,"设置\0");
  dis_hz_str(2,1,hz_tbl[n]);
}
/*---------------键盘设置(非常经典)--------------------*/
void  sub_set(uchar n)   //n=1---5
{
bit exit;
data uint count;
data char edit_buff[14];
data	uchar i;
bit bt=0;
code uchar trap[10][9]={0,1,9,9,9,9,9,9,9,
                        0,1,9,9,9,9,9,9,9,    //1
                        0,1,'.',1,9,9,9,9,9,  //2
                        0,1,'.',3,9,9,9,9,9,  //3
                        0,1,'.',3,9,9,9,9,9,  //4
                        0,1,'.',3,9,9,9,9,9,  //5
                       };//控制哪位打小数点
code uchar lth[6]={1,1,4,4,4,4};//控制修改参数的位数
data unsigned char trap_set=0,trap_set1=0;//
data uchar n1;
        n1=n;//n1控制是第几屏
        get_buff(edit_buff,n1);//edit_buff里是60到69里的数
	for(i=lth[n];i<14;i++)edit_buff[i]=0;
        if(trap_set1>lth[n1])trap_set1=0;
       // disp_chk1(edit_buff,trap_set);
        exit=1;
while(exit){
if(minuter>1)return ;//2分钟自动逃脱
    disp_set_static_panel(n1); //显示各屏的汉字
    watch_dog();
    get_key();
if((trap[n][trap_set]!=9)||(trap[n][trap_set]!='.'))
{
if(trap_set>8)trap_set=0;
while(trap[n][trap_set]==9){
edit_buff[trap_set]=' ';  //不用的数位填空格
trap_set++;
if(trap_set>8)trap_set=0;
}
while(trap[n][trap_set]=='.'){
edit_buff[trap_set]='.';  //小数点的数位
trap_set++;
if(trap_set>8)trap_set=0;
}
}
    if(tune==1){
        tune=0;
        exit=0;
        }
    if(tune==2){//移位
                tune=0;
		trap_set1++;
		//if(trap_set1==0xff)trap_set1=lth[n];
		if(trap_set1>=lth[n])trap_set1=0;
		trap_set=trap_set1;
                if(n1==5){
                    tune=0;
                     }
                }
    if(tune==3){//加一
                tune=0;
    	 	bt=1;  //设定完标志
                *(edit_buff+trap_set)+=1;//数+1;
		if((edit_buff[trap_set]&0x7f)>'9')edit_buff[trap_set]='0';//9是0x3f
		if(edit_buff[trap_set]<'0')edit_buff[trap_set]='9';
                }
    if(tune==4){//确定
               tune=0;
               if(bt)save_buff(edit_buff,n);   //存储
               exit=0;
               }
     count++; if(count>10)count=0;//延时
     if(count==0){
          disp_chk1(edit_buff,trap_set);
          }
    }
return;
}
/*-----------------------------------------------*/
/*主程序*/
/*-----------------------------------------------*/
void main(void)
{
uchar i,j,crct,n_ptr;//n-ptr是存储温度的指针
P1=0xff; P3=0xff; P0=0xff;
SP=0xef;
/*r=0;
r=1;//继电器*/
initial();//液晶屏初始化
init();
//init_t2();
second=0;
dis_hz_str(1,2,"温度控制系统\0");
instruct(0x0c);
delay10(250);
delay10(250);
delay10(250);
delay10(250);
delay10(250);
delay10(250);
delay10(250);
delay10(250);
while(second!=3){
      watch_dog();
      }
      second=0;
BELL();
instruct(clear);
instruct(0x0c);
for(j=0;j<10;j++){
	watch_dog();
	}
sub_get_parameter();
for(;;){
          dac5618(0xfff); //DA转换部分
           get_all_temp();
           initial_xs();
            display_run_data(2,3,SYS.ttt[0]);
            display_run_data(3,3,SYS.ttt[1]);
            display_run_data(4,3,SYS.ttt[2]);
            display_run_data(2,11,SYS.ttt[3]);
            display_run_data(3,11,SYS.ttt[4]);
            instruct(0x0c);
            watch_dog();
            if(minute>=1){
                    minute=0;
                    instruct(0x0c);
                    initial();
                    instruct(clear);
                    initial_xs();//固定汉字显示
                    }
   //下面是键盘输入设定
        get_key();
        if(tune==1){//设置键键值为1
               tune=0;
               instruct(clear);//清屏
               for(i=1;i<6;i++){//控制5层屏
                  sub_set(i);//主要部分
                  watch_dog();
                  if(minuter>1)break;//延时逃脱
                  instruct(clear);
                  sub_get_parameter(); //取系统用参数
                  }
               }
    ////////////////////////
         if(second7>=10){
         second7=0;
            wendu[n_ptr++]=SYS.ttt[0];  //每10秒存储一个温度数据
          if(n_ptr>=12)n_ptr=0;
                      }
        if(second6>=5){  //每5秒向上位机发送温度数据
              second6=0;
               crct=0;
               SBUF='A';
               while(TI==0);TI=0;
              for(i=0;i<10;i++){
                   TI=0;
                   SBUF=SYS.T[i];
                   crct+=SYS.T[i];
                   watch_dog();
                     while(TI==0);TI=0;
                  }
              SBUF=crct;
              while(!TI);TI=0;
              }
       }
}

⌨️ 快捷键说明

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