|
- /**********************************************************
- 功能 :STC12C5A60S2片内4路AD循环检测并数码管显示
- 大数码管实验板 约2秒循环显示一次。P1^0-P1^3口
- 模拟输入的值
- 单片机:STC12C5A60S2
- 晶振 :11.0592M
- 作者 :苏义江
- 时间 ;2015-11-16
-
- ********************************************************/
- #include<stc12c5a60s2.h>
- #include<intrins.h>
- #define uint8 unsigned char
- #define uint16 unsigned int
- //带小数点的共阳段码
- uint8 code tab_d[]={0x40,0x79,0x24,0x30,0x19,0x12,
- 0x02,0x78,0x00,0x10}; //带点共阳段驱动
- //不带小数点的共阳段码
- uint8 code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
- 0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
- //sfr P1ASF=0x9d;
- //sfr ADC_CONTR=0xbc;
- //sfr ADC_RES =0xbd;
- //sfr ADC_RESL =0xbe;
- sbit wei=P0^6;
- sbit duan=P0^7;
- uint8 datah0=0;
- uint8 datah1=0;
- uint8 datah2=0;
- uint8 datah3=0;
- uint8 tab[4];
- void delayms(uint16 z)
- {
- uint16 x,y;
- for(x=z;x>0;x--)
- for(y=620;y>0;y--);
- }
- void ADC_Init0(void)
- {
- P1ASF=0x0F;//P1.0,P1.1,P1.2,P1.3口作为模拟功能AD使用。
- ADC_CONTR=0X80;//打开ADC转换电源,540个周期转换一次,初始化ADC标志位为0,AD转换控制位初始化为0,选择P1.0作为AD输入来用。
- ADC_RES =0;
- ADC_RESL =0;
- }
- void ADC_Init1(void)
- {
- ADC_CONTR=0X81;//打开ADC转换电源,540个周期转换一次,初始化ADC标志位为0,AD转换控制位初始化为0,选择P1.1作为AD输入来用。
- }
- void ADC_Init2(void)
- {
- ADC_CONTR=0X82;
- }
- void ADC_Init3(void)
- {
- ADC_CONTR=0X83;
- }
- void display(uint8 num)
- {
- uint8 hundred,ten,one;
- float a;
- int b;
- a=ADC_RES;
- a=(ADC_RES+0.05)/55; //调节/后面的数值调节精度
- // a=(num+0.005)/51;
- a=a*100;
- b=a;
- hundred=b/100;
- ten=b%100/10;
- one=b%10;
- wei=1;
- P2=0XFE;
- wei=0;
- duan=1;
- P2=tab_d[hundred];
- duan=0;
- delayms(10);
- P2=0xff;
- wei=1;
- P2=0XFd;
- wei=0;
- duan=1;
- P2=table[ten];
- duan=0;
- delayms(10);
- P2=0xff;
- wei=1;
- P2=0XFb;
- wei=0;
- duan=1;
- P2=table[one];
- duan=0;
- delayms(10);
- P2=0xff;
-
- }
- void main()
- {
- uint8 i;
- ADC_Init0();
- ADC_Init1();
- ADC_Init2();
- ADC_Init3();
- while(1)
- {
- ADC_CONTR=0X80;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- datah0=ADC_RES;
-
- /***************************/
- ADC_CONTR=0X81;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- datah1=ADC_RES;
- ADC_CONTR=0X82;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- datah2=ADC_RES;
- ADC_CONTR=0X83;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- datah3=ADC_RES;
- ADC_CONTR=0X88;//打开ADC转换电源,540个周期转换一次,初始化ADC标志位为0,AD开始转换,选择P1.0作为AD输入来用。
- _nop_();
- _nop_();
- _nop_();
- _nop_();/*以上是四个时钟延时*/
- for(i=0;i<50;i++)
- {
- display(table[datah0]);
- delayms(5);
- }
- delayms(2000);
- // R_S_Byte(datah0);
- tab[0]=datah0;
- ADC_CONTR=0X89;//打开ADC转换电源,540个周期转换一次,初始化ADC标志位为0,AD开始转换,选择P1.1作为AD输入来用。
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- /*以上是四个时钟延时*/
- for(i=0;i<50;i++)
- {
- display(table[datah1]);
- delayms(5);
- }
- delayms(2000);
-
- // R_S_Byte(datah1);
- tab[1]=datah1;
- ADC_CONTR=0X8A;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- for(i=0;i<50;i++)
- {
- display(table[datah2]);
- delayms(5);
- }
- delayms(2000);
-
- // R_S_Byte(datah2);
- tab[2]=datah2;
- ADC_CONTR=0X8B;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- for(i=0;i<50;i++)
- {
- display(table[datah3]);
- delayms(5);
- }
- delayms(2000);
-
- // R_S_Byte(datah3);
- tab[3]=datah3;
- }
- }
复制代码
|
|