給你一個示例參考,根據你的硬件電路修改端口定義。
- //4位數碼管電壓表示例
- //適用STC8G1K08-20
- #include <STC8G.H>
- #include "intrins.h"
- #define uchar unsigned char
- #define uint unsigned int
- //宏定義ADC的操作命令
- #define ADCTIM (*(unsigned char volatile xdata *)0xfea8)
- #define ADC_POWER 0x80 //ADC power control dit (宏定義ADC電源控制位)1000 0000
- #define ADC_START 0x40 //ADC start control dit (宏定義ADC啟動控制位)0100 0000
- #define ADC_FLAG 0x20 //ADC complete flag (宏定義ADC完成標志位) 0010 0000
- #define ADC_EPWMT 0x10 //使能 PWM 實時觸發 ADC 0001 0000
- #define VCC_mV 5000 //VCC
- uchar code table[]={//共陰數碼管段碼"0~f-."
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71,0x40,0x80};
- uchar data dis_buf[4]; //緩存數組
- uchar num=0;
- uint ADC_mV; //測量結果
- uint ADC_data; //ADC轉換結果
- /*-------------------------------
- 1ms延時子程序(11.0592MHz 1T)
- -------------------------------*/
- void delayms(uint k)
- {
- uint i,j;
- for(i=k;i>0;i--)
- for(j=1110;j>0;j--);
- }
- /*-------------------------------------------------------
- InitADC 初始化ADC
- -------------------------------------------------------*/
- void Init_ADC()
- { //ADC 控制器 電源 啟動 完成 -- 15通道模擬選擇位
- //ADC_CONTR B7 B6 B5 B4 B3 B2 B1 B0
- P_SW2 |= 0x80; //打開
- ADCTIM = 0x3f; //設置 ADC 內部時序
- P_SW2 &= 0x7f; //關閉
- ADCCFG = 0x27; //設置ADC結果右對齊,速度為512系統時鐘
- ADC_RES=0; //清除ADC_RES存儲器以前的結果
- ADC_RESL=0;
- ADC_CONTR=ADC_POWER; //ADC 開啟電源
- delayms(1); //上電延時1ms
- }
- /*---------------------------------------------------
- 讀取ADC結果
- ----------------------------------------------------*/
- uint GetADCResult(uchar CH)
- {
- ADC_CONTR=ADC_POWER|ADC_START|CH;//啟動轉換1100 1000
- _nop_();_nop_(); //小延時
- while (!(ADC_CONTR & ADC_FLAG));//等待ADC轉換完成標志置位 1010 0000
- ADC_CONTR &=~ADC_FLAG; //清完成標志
- return ADC_RES<<8|ADC_RESL; //返回十位ADC結果
- }
- /*----------------------
- main主程序
- ----------------------*/
- void main()
- {
- P1M1 = 0x01; //設置P1.0高阻其余雙向
- P1M0 = 0x00; //設置P1.0高阻其余雙向
- P3M1 = 0x00; //設置P3雙向
- P3M0 = 0x00; //設置P3雙向
- P5M0 = 0x00; //設置P5雙向
- P5M1 = 0x00; //設置P5雙向
- Init_ADC();
- while(1)
- {
- ADC_data = GetADCResult(0);
- ADC_mV=VCC_mV*(long)ADC_data/1024;//強制轉換數據類型(32位)運算,得到結果mV
- dis_buf[0]=table[ADC_mV/1000%10];
- dis_buf[1]=table[ADC_mV/100%10];
- dis_buf[2]=table[ADC_mV/10%10];
- dis_buf[3]=table[ADC_mV%10];
- P3=0x00; //消隱
- P1&=0x0f; //清位碼
- P1|=~(0x10<<num); //送位碼
- if(num==0)P3=dis_buf[num]|0x80;//送段碼+小數點
- else P3=dis_buf[num]; //送段碼
- num=++num%4;
- }
- }
復制代碼
|