選擇P1.0輸入模擬量,10位轉換結果最大值1023。8位數碼管實際只用了4位。
- #include <STC15F2K60S2.H>
- #include<intrins.h>
- //#include<math.h>
- #define uchar unsigned char
- #define uint unsigned int
- //宏定義ADC的操作命令
- #define ADC_POWER 0x80 //ADC power control dit (宏定義ADC電源控制位)1000 0000
- #define ADC_START 0x08 //ADC start control dit (宏定義ADC啟動控制位)0000 1000
- #define ADC_FLAG 0x10 //ADC complete flag (宏定義ADC完成標志位) 0001 0000
- #define ADC_SPEEDLL 0x00 //420 clocks (宏定義420時鐘)速度控制 0000 0000
- //sfr ADC_LOW2=0xBE;//STC15系列
- sbit SRCLK= P4^3;
- sbit SER = P4^0;
- sbit RCLK = P3^4;
- void InitADC();
- uint adc_run(uchar CHA);
- void display595();
- void display();
- //void time0_init();
- void delay();
- void led595(uchar h,uchar l);
- void time_ris();
- //uint adc_data=10;
- //uint adc_r=0;
- uchar code led[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
- uchar code wex[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
- uchar ledbuf[]={10,10,10,10,0,0,0,0};
- //int Data[6];
- //int j;
- uchar id=0;
- void main()
- {
- // time0_init();
- // SRCLK=0;
- // SER=0;
- // RCLK=0;
- InitADC();
- while(1)
- {
- display();
- display595();
- }
- }
- void InitADC()
- {
- P1M1 = 0x01; //設置P1.0高阻
- P1M0 = 0x00; //設置P1.0高阻
- P1ASF = 0x01; //設置P1.0模擬輸入
- ADC_RES = 0;
- ADC_RESL= 0;
- ADC_CONTR =0x80; //開啟ADC電源
- delay();
- }
- uint adc_run(uchar CHA)
- {
- ADC_CONTR=ADC_POWER|ADC_SPEEDLL|CHA|ADC_START;//啟動轉換1000 1000
- _nop_(); //延時確保正確讀到ADC_CONTR寄存器的值
- _nop_();
- _nop_();
- _nop_();
- while(!(ADC_CONTR & ADC_FLAG)); //等待ADC轉換完成標志置位 1001 1000
- ADC_CONTR &=~ADC_FLAG; //關閉ADC
- return ADC_RES<<2|ADC_RESL ; //返回十位ADC結果,0~1023
- }
- /*
- void time0_init()
- {
- TMOD=0x00;
- TH1=0x6c;
- TL1=0x76;
- ET1=1;
- TR1=1;
- EA=1;
- }*/
- void display()
- {
- uint a;
- a=adc_run(0);
- ledbuf[4]=a/1000%10;
- ledbuf[5]=a/100%10;
- ledbuf[6]=a/10%10;
- ledbuf[7]=a%10;
- }
- /*
- void time_ris()interrupt 3
- {
- TR1=0;
- display595();
- TR1=1;
- }*/
- void display595()
- {
- uchar temp;
- switch(id)
- {
- case 0:
- led595(0xff,0xff);
- temp=led[ledbuf[0]];
- led595(wex[0],temp);
- delay();id++;break;
- case 1:
- led595(0xff,0xff);
- temp=led[ledbuf[1]];
- led595(wex[1],temp);
- delay();id++;break;
- case 2:
- led595(0xff,0xff);
- temp=led[ledbuf[2]];
- led595(wex[2],temp);
- delay();id++;break;
- case 3:
- led595(0xff,0xff);
- temp=led[ledbuf[3]];
- led595(wex[3],temp);
- delay();id++;break;
- case 4:
- led595(0xff,0xff);
- temp=led[ledbuf[4]];
- led595(wex[4],temp);
- delay();id++;break;
- case 5:
- led595(0xff,0xff);
- temp=led[ledbuf[5]];
- led595(wex[5],temp);
- delay();id++;break;
- case 6:
- led595(0xff,0xff);
- temp=led[ledbuf[6]];
- led595(wex[6],temp);
- delay();id++;break;
- case 7:
- led595(0xff,0xff);
- temp=led[ledbuf[7]];
- led595(wex[7],temp);
- delay();id=0;break;
- default:break;
- }
- }
- void led595(uchar h,uchar l)
- {
- uchar i,temp;
- temp=h;
- for(i=0;i<8;i++)
- {
- if(temp&0x80)
- SER=1;
- else
- SER=0;
- temp<<=1;
- SRCLK=0;
- _nop_();
- _nop_();
- SRCLK=1;
- }
- temp=l;
- for(i=0;i<8;i++)
- {
- if(temp&0x80)
- SER=1;
- else
- SER=0;
- temp<<=1;
- SRCLK=0;
- _nop_();
- _nop_();
- SRCLK=1;
- }
- RCLK=0;
- RCLK=1;
- }
- void delay() //1ms@11.0592MHz
- {
- unsigned char i, j;
- _nop_();
- _nop_();
- _nop_();
- i = 11;
- j = 190;
- do
- {
- while (--j);
- } while (--i);
- }
復制代碼 |