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

📄 课设控制平台测试程序.c

📁 嵌入式C的一个课程设计:电模拟系统的单片机PID控制。程序用C语言写。最小系统板与电模拟系统的原理图都有。把PID.C编译下载到目标板。运行接到示波器即可显示控制结果。
💻 C
字号:
/*******************/
/*  键盘显示程序   */
/*                 */
/*******************/
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
#define tim 65536-2000
sbit dis0 =P2^4;
sbit dis1 =P2^5;
sbit dis2 =P2^6;
sbit dis3 =P2^7;
sbit dis4 =P3^3;

sbit key3 =P2^0;
sbit key2 =P2^1;
sbit key1 =P2^2;
sbit key0 =P2^3;
uchar disp[8];
uchar key,keyx,ts;
int para[10],ptr;
uchar code ledtab[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar code distab[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
		               0x80,0x90,0xed,0x6b,0x0f,0xe3,0x4f,0x4d};

void time(uint t)
{
  uint i;
  for(i=0;i<t;i++);
}

void distran()
{
  disp[3]=distab[para[ptr]%10];
  disp[2]=distab[(para[ptr]/10)%10];
  disp[1]=distab[(para[ptr]/100)%10];
  disp[0]=distab[(para[ptr]/1000)%10];
  disp[4]=~ledtab[ptr];
}

void display()
{
  static dis=0;
  dis=(dis+1)%5;
  dis0=1;dis1=1;dis2=1;dis3=1;dis4=1;
  P0=disp[dis]; 
  switch(dis)
  {
    case 0: dis0=0; break;
	case 1: dis1=0; break;
	case 2: dis2=0; break;
	case 3: dis3=0; break;
	case 4: dis4=0; break;
  }
  if(!key0) keyx=dis+1;
  if(!key1) keyx=dis+5; 
  if(!key2) keyx=dis+9;
  if(!key3) keyx=dis+13; 
}

void modi(uchar p,uchar x)
{
  para[p]=(para[p]%1000)*10+x;
}

void keyproc()
{
  if(key>0)
  {
    switch(key)
	{
	  case 1: modi(ptr,0);break;
	  case 2: modi(ptr,1);break;
	  case 3: modi(ptr,2);break;
	  case 4: modi(ptr,3);break;
	  case 5: modi(ptr,4);break;
	  case 6: modi(ptr,5);break;
	  case 7: modi(ptr,6);break;
	  case 8: modi(ptr,7);break;
	  case 9: modi(ptr,8);break;
	  case 10:modi(ptr,9);break;

	  case 11:if(ptr<7) ptr++;break;
	  case 12:if(ptr>0) ptr--;break;

	  case 13:para[ptr]+=1;break;
	  case 14:para[ptr]-=1;break;
	  case 15:para[ptr]+=10;break;
	  case 16:para[ptr]-=10;break;
	}
  } 
  key=0;
}

////////////////////////////////////////////////////////

sbit DACS =P3^6;
sbit CLK  =P3^5;
sbit DAT1 =P3^4;

sbit DAT3 =P1^3;
sbit DAT2 =P1^4;
sbit ADCS =P3^7;

void TLC5620(uchar ch,uchar x)
{
   uchar i,p;
   p=ch<<6; //p=(ch*2+1)<<5;
   CLK=0;     
   for (i=0; i<3; i++) 
    {
     p=p<<1; DAT1=CY; 
     CLK=1;  CLK=0;
    }
   p=x;
   for (i=0; i<8; i++) 
    {
     p=p<<1; DAT1=CY; 
     CLK=1;  CLK=0;
    }
   DACS=0; DACS=1; CLK=1;
}

uint TLC1543(uchar p) 
{
  uint  res=0;
  uchar i; CLK=0;
  ADCS=0;  p=p<<4;
  for (i=0;i<10;i++) //把通道号打入1543
  {
    p=p<<1; DAT3=CY; 
    CLK=1; CLK=0;
  }
  ADCS=1;              //等待AD转换
  time(50);
  ADCS=0;       
  for (i=0;i<10;i++) //取D9--D5
  {
    CLK=1; res<<=1;
    DAT2=1; if(DAT2) res++;
    CLK=0;
  } 
  ADCS=1; CLK=1;
  return res;
}

///////////////////////////////////////////////////////

void timer0() interrupt 1
{
  static mt=0;
  TH0=tim>>8; TL0=tim; display(); 
  if(mt++>50)
  {
    mt=0;
    TLC5620(0,0x10);
    TLC5620(1,0x40);
    TLC5620(2,0x80);
    TLC5620(3,0xff);
	para[1]=TLC1543(0);
	para[2]=TLC1543(1);
	para[3]=TLC1543(2);
	para[4]=TLC1543(3);
  }
}

void main()
{ 
  TMOD=0x11;IE=0x82;
  TH0=tim>>8;  TL0=tim; TR0=1;
  ptr=0; 
  distran();  
  for(;;)
  {
   if(keyx>0)
   {
     key=keyx;   
     while(keyx!=0) 
	   {keyx=0; time(3000);}
     keyproc(); 
   }
   time(1000);
   distran();
  } 
}

⌨️ 快捷键说明

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