给你一个示例参考,根据你的硬件电路修改端口定义。
- //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;
- }
- }
复制代码
|