|
电路原理图如下:
- #include "hader\\main.h"
- #include<math.h>
- #define uchar unsigned char//宏定义无符号字符型
- #define uint unsigned int //宏定义无符号整型
- #define FOSC 11059200L
- #define BAUD 9600
- #define ADC_POWER 0x80 //ADC 电源控制位
- #define ADC_FLAG 0x10 //ADC 转换结束标志位
- #define ADC_START 0x08 //ADC 开始转换控制位
- #define ADC_SPEEDHH 0x60 //270个时钟周期转换一次
- sfr ADC_DATA=0xc6; //70个时钟周期转换一次
- void display(void); //显示函数
- void t_to_dis(uint num);
- #define DUAN P2 //P0口控制段
- #define WEI P1 //P2口控制位
- /********************************************************************
- 初始定义
- *********************************************************************/
- //数码管显示段码
- code uchar seg7code[11]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0XBF};
- uchar numb[4]; //定义字符串用于数值转换
- uint cnt,times;
- uint ad,ad2;
- float ad1,ad3;
- bit flag,write; //定时标志位
- uint16 idata setcurent;
- uchar idata keystat[3];
- uint adcj[91];
- uint adcj2[65];
- bit bz=0;
- uint js=0;
- // 串行中断程序
- void initInt(void)
- {
- TMOD = 0x01;
- PCON = 0;
- TH0 =(655336-1000)/256;
- TL0 =(655336-1000)%256;
- TR0 = 1;
- ET0=1;
- EA=1;
- }
- //初始化
- void initProg(void)
- {
- P2M1=0;
- P2M0=0xff;
- P1M1=0x80;
- P1M0=0x0f;
- P3M1&=0x7f;
- P3M0|=0x80;
- initInt(); //初始化定时器
- }
- /********************************************************************
- 延时函数
- *********************************************************************/
- void delay(uint x)//延时程序 0.1秒
- {
- uint m,n,s;
- for(m=x;m>0;m--)
- for(n=20;n>0;n--)
- for(s=248;s>0;s--);
- }
- /********************************************************************
- AD转换初始化程序
- *********************************************************************/
- void InitADC()
- {
- P1=P1M0|=0xf0;
- P1M1=0x00;
- ADC_DATA=0; //AD数据寄存器清空
- ADC_CONTR=ADC_POWER|ADC_SPEEDHH|ADC_START;//打开AD电源,转换周期XX
- delay(10); //延时
- }
- /********************************************************************
- AD转换控制程序
- *********************************************************************/
- uint GetADCResult(uchar px) //转换输出的数据 (PX为通道口)
- {
- uint t;
- ADC_CONTR=ADC_POWER | ADC_SPEEDHH | px | ADC_START;//开始转换
- _nop_(); //延时一个机器周期
- _nop_(); //延时一个机器周期
- _nop_(); //延时一个机器周期
- _nop_(); //延时一个机器周期
- _nop_(); //延时一个机器周期
- while (!(ADC_CONTR & ADC_FLAG));//等待转换结束
- ADC_CONTR &= ~ADC_FLAG; //关闭AD转换
- t=(ADC_DATA<<2)|ADC_LOW2;
- return t;
- }
- /********************************************************************
- 按键扫描
- *********************************************************************/
- void key_scan(void)
- {
- if(key1==0) //功能按键,显示调整和实测值
- {
- if(++keystat[0]>=30)
- {
- keystat[0] = 1;
- }
- }
- else
- if((key1)&&(keystat[0]))
- {
- keystat[0] = 0;
- flag=!flag;
- }
- if(flag==1)
- {
- //增加设定电流值
- if(key2==0) //增加设定电流值
- {
- if(++keystat[1]>=80)
- {
- keystat[1]=1;
- setcurent=setcurent+1 ;
- if(setcurent>500)
- setcurent=500;
- write = 1;
- }
- }
- else if((key2)&&(keystat[1]))
- {
- keystat[1] = 0;
- }
- //减小设定电流值
- if(key3==0) //减小设定电流值
- {
- if(++keystat[2]>=80)
- {
- keystat[2] = 1;
- setcurent = setcurent-1;
- if(setcurent<1)
- setcurent=1;
- write = 1;
- }
- }
- else if((key3)&&(keystat[2]))
- {
- keystat[2] = 0;
- }
- }
- }
- void Selectsort(uint A[],uchar n)
- {
- uchar i,j,min;
- uint temp;
- for(i=0;i<n;i++)
- {
- min=i;
- for(j=i+1;j<=n;j++) /* 从j往前的数据都是排好的,所以从j开始往下找剩下的元素中最小的 */
- {
- if(A[min]>A[j]) /* 把剩下元素中最小的那个放到A[i]中 */
- {
- temp=A[i];
- A[i]=A[j];
- A[j]=temp;
- }
- }
- }
- }
- /********************************************************************
- 主函数
- *********************************************************************/
- void main()
- {
- uint i;
- uchar j,t;
- initProg();
- InitADC(); //AD初始化
- setcurent=IapReadByte(0);
- setcurent=setcurent*100+IapReadByte(1);
- while(1)
- {
- if(flag) //显示设定值
- t_to_dis(setcurent); //数值变换
- else //否则显示实测值
- t_to_dis(ad2); //数值变换
- //if(ad2>=setcurent){OUT=0;} else {OUT=1;}
- if(ad2>=setcurent){js++;}
- if(ad2<setcurent){OUT=1;js=0;}
- if(js>=1000){OUT=0;}else{OUT=1;}
- if(write==1)
- {
- write=0;
- IapEraseSector(0);
- IapProgramByte(0,setcurent/100);
- IapProgramByte(1,setcurent%100);
- }
- ad=GetADCResult(7);
- i=ad*10;
- if(i>=5120&&i<=7020)
- {
- adcj[j++]=i;
- }
- if(j>90)
- {
- j=0;
- Selectsort(adcj,90);
- adcj2[t++]=adcj[90];
- if(t>3)
- {
- t=0;
- Selectsort(adcj2,3);
- ad1 = 500.0*((adcj2[3]-5120)/10240.0)/0.185;
- ad1=ad1*0.708*1.35;
- ad2=abs(ad1);
- }
- }
- }
- }
- /********************************************************************
- 求值函数
- *********************************************************************/
- void t_to_dis(uint num)
- {
- numb[0]=num/1000; //显示千位
- numb[1]=num/100%10; //显示百位
- numb[2]=num/10%10; //显示十位
- numb[3]=num%10; //显示个位
- }
- /********************************************************************
- 定时器T0中断函数
- *********************************************************************/
- void timer0(void)interrupt 1
- {
- TH0=(65536-800)/256;
- TL0=(65536-800)%256;
- cnt++;
- switch(cnt)
- {
- case 1: WEI&=0XF0; DUAN=seg7code[numb[0]]; wei1=1; break; //分十位
- case 2: WEI&=0XF0; DUAN=seg7code[numb[1]]&0x7f; wei2=1; break;//分个位
- case 3: WEI&=0XF0; DUAN=seg7code[numb[2]]; wei3=1; break;//秒十位
- case 4: WEI&=0XF0; DUAN=seg7code[numb[3]]; wei4=1; break; //输出小
- default: cnt=0;break;
- }
- key_scan();//按键扫描
- }
- /********************************************************************
- 结束
- *********************************************************************/
复制代码 |
|