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

📄 aa.c

📁 ocmj4x8c显示的 c8051f021做为cpu的波形绘图功能
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "c8051f020.h"
#include <math.h>


sfr16 ADC0 = 0xBE;
sfr16 DAC0 = 0xD2;
sfr16 DAC1 = 0xD5;
sfr16 RCAP2 = 0xCA;
sfr16 T2   = 0xCC;
sfr16 T0 = 0x8A;

sbit LEDA = P1^2;
sbit LCDRST = P1^1;
sbit RW = P0^7;
sbit LCDEN = P1^3;
sbit LCDRS = P1^0;
sbit DB0 = P3^0;
sbit DB1 = P3^1;
sbit DB2 = P3^2;
sbit DB3 = P3^3;
sbit DB4 = P3^4;
sbit DB5 = P3^5;
sbit DB6 = P3^6;
sbit DB7 = P3^7;

#define uchar unsigned char 
#define uint  unsigned int
#define x1    0x80
#define x2    0x88
#define y     0x80
#define comm  0
#define dat   1
#define AD_VALUE_MAX  5035 // 5V
#define AD_COUNT_MAX  20 // 20*4.9ms =1s
#define DA_VALUE_MAX1 9990 // 10.02V
#define DA_VALUE_MAX2 9940 // 9.97V
#define DA_VALUE_ONE 4096/1000 //   DA_VALUE_MAX/10 
#define PWM_VALUE_MAX1 10000 // 100%
#define PWM_VALUE_MAX2 5000 // 5V
#define LCD_COUNT_LEVEL1 1000   //
#define LCD_COUNT_LEVEL2 1000   //
#define N_Hz  128 //画图采样个数


void config (void);
void global_var(void);
void show_init (void);
void chk_busy (void);
void init_lcd (void);
void wr_lcd (uchar dat_comm,uchar content);
void fys(uchar code *tab) ;
void delay1 (uint ms);
void delay (uint ms);
void t0_init(void);
void img_disp1 (uchar  *img);
void ad_convert1(void);

void clrram (void);
void lat_disp (uchar data1,uchar data2);
void chn_disp1 (uchar code *chn);
void DispConvert(void);
void comparation(void);
void t0_inter_handle(void);
void cp0(void);

uchar  xdata lcd_count;
uchar  xdata key_num;
uchar  xdata num;
uint   xdata key_count;
uchar  xdata key_flag;
uchar  xdata states_flag;
float  xdata ad_add;
uchar  xdata ad_count;
float xdata ad_until;
uchar xdata ad_flag;
float xdata  da_value1;
float xdata da_value2;
float  xdata da_count;
int xdata pwm_count;
uint xdata pwm1_save;
uint xdata pwm2_save;
uint xdata pwm_level; // 0x7FFF表示占空比为50%
int xdata pwm_count_save1;
int xdata pwm_count_save2;
unsigned long xdata cp0_count;
uchar xdata t0_count;
int drawing_flag ;
int low_freq;
int xdata ad_init_flag;


uint xdata N_Hz_Count = 0;


uchar code tab0[]=
{
"吴耘要灭了风雨声"
"                "
"祁高瞻是煞笔    "
"                "
};

uchar code tab2[]=
{
"周期为          "
"电压有效值为    "
};


uchar xdata tab3[128];



uchar xdata tab1[]=
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

 };


float n = 0.00;
int x = 0x00;
int yy = 0x00;

/*void t0_inter(void) interrupt 1
{
  
 
 {
  
  EA = 0;
 
  TH0 = 0xfc;
  TL0 = 0x17;


  
   
  
   }
   n++;
  EA = 1;
 
  TF0 = 0;
  }
  yy = 3;
}
*/

void cp0_up_inter (void) interrupt 11
{
   cp0_count ++ ;
   CPT0CN &=0xDF;  //清上升中断标志位CP0RIF
 
}

void ad_inter (void) interrupt 15
{
// float xdata m;
 uint xdata i;
uint xdata b;
 float xdata m;
// uchar xdata gew,shi,bai,qian;

 if(n == 128)          //////数据处理时关中断不会影响采样
    {n = 0;
	 x = 0;
	 }

 i = ADC0;
 m = i;
 m = m/4096.0;
 m *= 100;
//////////////////////////////////

 if(N_Hz_Count <= 128)
  {
   b = (int)m;
   tab3[N_Hz_Count] = (int)m;
   N_Hz_Count++;
  }





/////////////////////////////////
/*
 m = (float)i;
 if (ad_flag==0)
 {
  ad_add = ad_add + m;
  if (ad_count==AD_COUNT_MAX) 
  {m=ad_add/AD_COUNT_MAX;
   ad_count= 0;
   ad_add= 0;
   ad_until=m;
   }
  else m=ad_until;
 }
 if (ad_flag==1)
 {
  ad_flag=0;
  ad_until=m;
 }
 m = m/4096.0;
 m *= AD_VALUE_MAX;
 i = (int)m;
 ad_count++;
  
 
 qian = i/1000;
 bai = (i-qian*1000)/100;
 shi = (i-qian*1000-bai*100)/10;
 gew = i-qian*1000-bai*100-shi*10;
  if(x < 16)
  { int f;
   yy = 16-((float)(qian*10+bai))/50*16;
   f = (int)n%8;
   switch (f)
  {case 0: tab1[16*yy+x] += 0x80;break;
   case 1: tab1[16*yy+x] += 0x40;break;
   case 2: tab1[16*yy+x] += 0x20;break;
   case 3: tab1[16*yy+x] += 0x10;break;
   case 4: tab1[16*yy+x] += 0x08;break;
   case 5: tab1[16*yy+x] += 0x04;break;
   case 6: tab1[16*yy+x] += 0x02;break;
   case 7: tab1[16*yy+x] += 0x01;x++;break;
   }
  }
  n++;
  */
 /*if (gew >= 4 && gew <=9) 
 {
  gew=0;
  shi++;
  if shi=
  if (shi == 0) bai++;
  if (bai == 0) qian++;

 }*/
/*
 qian += 0xB0; 
 bai += 0xB0;
 shi += 0xB0;
 gew += 0xB0;

 wr_lcd (comm,0x30);
 wr_lcd (comm,0x0C);
 wr_lcd (comm,0x89);
 wr_lcd (dat,0xA3);
 wr_lcd (dat,qian);

 wr_lcd (comm,0x8B);
 wr_lcd (dat,0xA3);
 wr_lcd (dat,bai);
 wr_lcd (dat,0xA3);
 wr_lcd (dat,shi);
 //wr_lcd (dat,gew);
*/
 AD0INT = 0;
 } 
  
 
  
  
  
  
  




void main(void)
{int a,b;
SP = 0x7f;
config();
init_lcd ();
show_init();
//t0_init();

comparation();////开了t0和cp0
drawing_flag = 0;   //画图或采样标志
ad_init_flag = 1;   //判断要不要初始化AD,也就是说要不要调整采样周期

while(1)
{ if(drawing_flag == 0)
   { cp0();                 ////////先采样,采样结束后关cp0和T0;注意此时TF0为1
    if(TF0 == 0)
       continue;
    if(TF0 == 1)
	    {drawing_flag = 1;
         TF0 = 0;              //////T0仍然未启动
		 }
    }

if(cp0_count > 300)
   low_freq = 0;
else
   low_freq = 1;

if(ad_init_flag == 1)
  {
   ad_convert1();         /////启动ad准备采样,并确定完采样周期,开始采样
  }  





 
  if(N_Hz_Count > 128)
  {
  
   DispConvert();
  if(x == 16 )
   {EA = 0;
   //init_lcd ();
   //clrram();
   lat_disp (0x00,0x00);
   
   
   chn_disp1 (tab2);       //////上半屏显示中文
   img_disp1 (tab1);       //////下半屏显示图形
   //delay1(200);

  for(a=0;a<16;a++)         ////////////清除记录图形的tab1
    for(b=0;b<32;b++)
	 tab1[a+b*16]=0x00;

   N_Hz_Count = 0;
   TR0 = 1; //开定时器T0
   EIE2 &= ~0x02 ;            //关AD中断
   CPT0CN |=0x80;//开比较器
   drawing_flag = 0;
   ad_init_flag = 1;
   EA = 1;
    }
   }
 



 }
} //main的括号


void cp0(void)
{
 if (TF0==1)
  {
  //t0_count --;
  //if (t0_count == 0)
  //{
   EA = 0;
   CPT0CN &=0x7F;   //关比较器
   TR0=0;           //关定时器T0 
   t0_inter_handle();
   t0_count = 25;
   cp0_count= 0;
   TL0 = 0xAB;
   TH0 = 0x2F; 
   //TR0 = 1;
   //CPT0CN |=0x80;   //开比较器
   //TF0 = 0;
   EA = 1;
  //}
  //TL0 =0xAB; // 1/16M*12*53333=40ms 即T0 40MS中断一次
  //TH0 =0x19;
  
 }
}

void t0_inter_handle(void)
{
  uint i,j;
  uchar qian,bai,shi,gew,dian_bai,dian_shi,dian_gew;
  cp0_count *= 25;    
  i = cp0_count/1000;
  j = cp0_count%1000;
  qian = i/1000;
  bai = (i-qian*1000)/100;
  shi = (i-qian*1000-bai*100)/10;
  gew = i%10;
  dian_bai = j/100;
  dian_shi = (j-dian_bai*100)/10;
  dian_gew = j%10;
  qian += 0xB0; 
  bai += 0xB0;
  shi += 0xB0;
  gew += 0xB0;
  dian_bai += 0xB0;
  dian_shi += 0xB0;
  dian_gew += 0xB0;
  wr_lcd (comm,0x30);
  wr_lcd (comm,0x0C);
  wr_lcd (comm,0x88);
  if (qian==0xB0) 
  {
   wr_lcd (dat,0x20);wr_lcd (dat,0x20);
   if (bai==0xB0) 
   {
    wr_lcd (dat,0x20);wr_lcd (dat,0x20);
    if (shi==0xB0){wr_lcd (dat,0x20);wr_lcd (dat,0x20);}  //隐藏数字
    else {wr_lcd (dat,0xA3);wr_lcd (dat,shi);}
   }
   else 

⌨️ 快捷键说明

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