基于stc15系列单片机 AD转换设计并进行串口通信源程序
单片机源程序如下:
- #include<STC15.h>
- #include<intrins.h>
- #define BYTE unsigned char
- #define WORD unsigned int
- #define ADC_POWER 0x80 //ADC电源控制位
- #define ADC_FLAG 0x10 //ADC完成标志
- #define ADC_START 0x08 //ADC起始控制位
- #define ADC_SPEEDLL 0x00 //540个时钟
- #define ADC_SPEEDL 0x20 //360个时钟
- #define ADC_SPEEDH 0x40 //180个时钟
- #define ADC_SPEEDHH 0x60 //90个时钟
- void delay(WORD i); //数码管延时函数
- void lintADC(); //ADC特殊功能寄存器初始化
- BYTE GetADCResult(BYTE ch) ; //ADC结果返回函数
- void InitUart(); //串口初始化
- void SendData(BYTE dat); //串口发送
- void Time(); //定时器初始化
- float num;
- bit p=1,p1=1;
- WORD a0,a1,a2,a3,a4,a5,a6,a7,j=0,i,k=0,sum=0,n=0,RESULT,RESULT1;
- BYTE code AA[]={0x80,0xE5,0x28,0x24,0x45,0x82}; //0.~4.字形码
- BYTE code BB[]={0x82,0xE7,0x2A,0x26,0x47,0x16,0x12,0xA7,0x02,0x06}; //0~9字形码
- BYTE code CC[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; //0~9 ASCII码
- /*~~~~~~~~~~~~~~~主函数~~~~~~~~~~~~~~~*/
- void main()
- {
-
- lintADC(); //ADC特殊功能寄存器初始化
- InitUart(); //串口初始化
- //P3=0xff;
- Time(); //定时器初始化
- while(1)
- {
- if(n==100)
- {
- GetADCResult(7);}
- switch(j)
- {
- case 1: // 判断j是否为1
- {
- P37=0;
- P2=AA[a0];
- }break;
- case 2: // 判断j是否为2
- {
- P2=0xff;
- P37=1;
- } break;
- case 3: // 判断j是否为3
- {
- P36=0;
- P2=BB[a1];
- } break;
- case 4: // 判断j是否为4
- { P2=0xff;
- P36=1;
- } break;
- case 5: // 判断j是否为5
- {
- P35=0;
- P2=BB[a2];
- /* if(SBUF==2)
- { if(0<i&&i<1000)
- {
- GetADCResult(7);
- if(SBUF==1|SBUF==2)
- {
- a4=CC[a0];
- a5=CC[a1];
- a6=CC[a2];
- a7=CC[a3];
- SendData(a4);
- SendData(0x2e);
- SendData(a5);
- SendData(a6);
- SendData(a7);
- SendData(0x20);
-
- }
- }
- } */
-
- } break;
- case 6: // 判断j是否为6
- { P2=0xff;
- P35=1;
- } break;
- case 7: // 判断j是否为7
- {
- P34=0;
- P2=BB[a3];
- } break;
- case 8: // 判断j是否为8
- { P2=0xff;
- P34=1;
- } break;
- case 10: // 判断j是否为10
- {/* if(0<i&&i<1000)
- {
- // GetADCResult(7); //返回通道1 ADC结果
- if(SBUF==1|SBUF==2)
- {
- a4=CC[a0]; //发送电压值
- a5=CC[a1];
- a6=CC[a2];
- a7=CC[a3];
- SendData(a4);
- SendData(0x2e);
- SendData(a5);
- SendData(a6);
- SendData(a7);
- SendData(0x20);
-
- }
- } */
- } break;
-
- }
- }
- }
- void lintADC()
- {
- P1ASF=0xff; //选择P1口作为AD转换口
- ADC_RES=0;
- ADC_RESL=0;
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
- delay(10);
- }
- BYTE GetADCResult(BYTE ch)
- {
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
- _nop_(); //等待4个NOP
- _nop_();
- _nop_();
- _nop_();
- while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成
- ADC_CONTR &= ~ADC_FLAG; //Close ADC
- RESULT=ADC_RES;
- RESULT=RESULT<<2;
- RESULT1=ADC_RESL;
- RESULT=(RESULT|RESULT1);
- return RESULT; //返回ADC结果
- }
- void delay(unsigned int i)
- {
- unsigned int m,n;
- for(m=i;m>0;m--)
- for(n=90;n>0;n--);
- }
- void SendData(BYTE dat)
- { SBUF = dat; //发送当前数据
- while (!TI); //等待前一个数据发送完成
- TI = 0; //清除发送标志
-
- }
- void InitUart()
- {
- AUXR=(AUXR|0x11); //定时器2作为串口波特率发生器
- T2H=0xFF; //波特率为115200
- T2L=0xFE;
- SCON = 0x50;
- }
- void Time()
- {
- AUXR=AUXR&0x3f;
- TMOD=0x00; //定时器T0,T1选择方式0
- TH0=0xFC; //定时器T0定时1ms
- TL0=0x66;
- EA=1;
- ET0=1;
- TR0=1;
- }
- timer2()interrupt 1
- { n++;
- j++;
- i++;
- if(i==2000)
- i=0;
- if(j==11)
- j=0;
- if(n==101)
- n=0;
- num=RESULT/1024.0*5; //计算电压值
- a0=(int)num;
- a1=(int)(num*10);
- a1=a1%10;
- a2=(int)(num*100);
- a2=a2%10;
- a3=(int)(num*1000);
- a3=a3%10;
- }
复制代码
所有资料51hei提供下载:
AD转换.zip
(8.72 KB, 下载次数: 42)
|