- /****************************************************************************************
- * KF8F系列单片机开发板演示程序
- * 标 题: ADC转换采样
- * 项目名: 02-ADC_TEST
- * 开发环境: ChipON IDE
- * 作 者:上海芯旺微电子技术有限公司
- * 功能简述: ADC转换采样,数码管显示采样得到的值(16进制显示) 按键key2可切换采样通道,同时P12指示通道
- * 亮灯时指示P20口的AN8,否则指示P21口的AN7,跳线处LED相关的还需要J12的P20、P21、P26口以及J21的控制D4指示灯
- ****************************************************************************************/
- #include<KF8F4156.h>
- /*********************宏定义******************************/
- #define uchar unsigned char
- #define uint unsigned int
- #define COM1 P0LR0
- #define COM2 P0LR1
- #define COM3 P0LR3
- #define COM4 P0LR4
- #define SMG_A P3LR0
- #define SMG_B P3LR1
- #define SMG_C P3LR2
- #define SMG_D P3LR3
- #define SMG_E P3LR4
- #define SMG_F P3LR5
- #define SMG_G P3LR6
- #define SMG_P P3LR7
- #define Key2 P26
- uint KeyCount;
- uchar KeyState;
- /*********************宏定义结束****************************/
- /**************定义全局变量(注:为节省内存空间,全局变量尽量不要赋初值)*********/
- uchar const Arr_num[] = {
- 0X3F, // 0
- 0X06, // 1
- 0X5B, // 2
- 0X4F, // 3
- 0X66, // 4
- 0X6D, // 5
- 0X7D, // 6
- 0X07, // 7
- 0X7F, // 8
- 0X6F, // 9
- 0X77, // a
- 0X7C, // b
- 0X58, // c
- 0X5E, // d
- 0X79, // E
- 0X71, // F
- 0X40, // -
- 0X00, // 空
- };//共阴接法
- uchar Unit, Decade, Hundred, Thousand; //定义数码管的个十百千位
- uchar com_temp; //查表结果
- /***********************全局变量定义结束**************************************/
- /*****************函数声明(注:中断和main函数不需声明)*************************/
- void Init_fun();
- void Delay_200us();
- uint Adc_fun(void);
- uint Adc_read(void);
- void input_smg();
- void Display();
- /********************函数声明结束************************************/
- /************************
- * 函数名 :main
- * 函数功能:程序入口主函数
- * 入口参数:无
- * 返回 :无
- ************************/
- void main()
- {
- uint Dis_adc = 0 ; //采样接收变量
- Unit = 0;
- Decade = 0;
- Hundred = 0;
- Thousand = 0;
- Init_fun(); //初始化
- P1LR2=1; // 默认指示采样通道AN8 亮灯
- while(1)
- {
- Dis_adc = Adc_read(); //将ADC采样返回值赋予Dis_adc
- Unit = Dis_adc&0x0f; //将Dis_adc的最低4位赋予数码管的个位
- Decade = Dis_adc&0xf0;
- Decade >>= 4; //将Dis_adc的第7-4位赋予数码管的十位
- Dis_adc >>= 8; //右移8位,取Dis_adc的高8位
- Hundred = Dis_adc&0x0f; //将此时的Dis_adc的最低4位赋予数码管的百位
- Thousand = Dis_adc&0xf0;
- Thousand >>= 4; //将此时的Dis_adc的第7-4位赋予数码管的千位
- Display(); //显示
- //按键判断,切换通道
- if(Key2)
- {
- KeyCount=0;
- }
- else
- {
- if(KeyCount<2)
- {
- KeyCount++;
- if(KeyCount==2 )
- {
- if(KeyState)
- {
- ADCCTL0 = 0xA1; // P20 AN8
- KeyState=0;
- P1LR2=1;
- }
- else
- {
- ADCCTL0 = 0x9D; // P21 AN7
- KeyState=1;
- P1LR2=0;
- }
- }
- }
- }
- }
- }
- /************************
- * 函数名 :Init_fun
- * 函数功能:初始化函数
- * 入口参数:无
- * 返回 :无
- ************************/
- void Init_fun()
- {
- OSCCTL = 0x50; //设置为4M
- /*********端口初始化***********/
- TR0 = 0x04; //P02仅输入 LED片选
- TR1 = 0x00; //设置P1端口为输出
- TR2 = 0x43; //P20 P21 AD输入 P26 key2输入
- TR3 = 0X00; //LED 输出
- P0 = 0;
- P1 = 0;
- P2 = 0;
- P3 = 0;
- P0LR=0;
- P1LR=0;
- P2LR=0;
- P3LR=0x00;
- /****初始化AD寄存器****/
- ANSEH = 0x01; //设置通道AN8 P20为模拟口
- ANSEL = 0x80; //设置通道AN7 P21为模拟口
- ADCCTL1 = 0x94; //ad校准使能,8分频,VDD作为参考电压
- ADCCTL0 = 0xA1; //右对齐,通道8, AD使能打开
- }
- /************************
- * 函数名 :Adc_fun
- * 函数功能:ADC函数,模数转换
- * 入口参数:无
- * 返回 :返回ADC采样值
- ************************/
- uint Adc_fun(void)
- {
- uint Adc_num = 0 ; //ADC转换缓冲变量
- START = 1; //启动ADC
- while(START); //等待转换结束
- Adc_num = ADCDATA0H; //将高位加进去
- Adc_num <<=8;
- Adc_num |= ADCDATA0L; //将低位加进去
- return Adc_num; //返回转换值
- }
- /************************
- * 函数名 :Adc_read
- * 函数功能:ADC求均值函数,adc读取函数
- * 入口参数:无
- * 返回 :返回ADC采样8次均值
- ************************/
- uint Adc_read(void)
- {
- uint Adc_sum = 0 ; //adc采样累加变量
- uchar i = 0;
- for(i = 0; i < 8; i++)
- {
- Adc_sum += Adc_fun(); //累加八次采样值
- }
- Adc_sum+=4; // 四舍五入
- Adc_sum >>= 3; //右移动3位 除8求均值
- return Adc_sum;
- }
- /************************
- * 函数名 :Display
- * 函数功能:数码管显示
- * 入口参数:显示数字
- * 返回 :无
- ************************/
- void Display()
- {
- uchar i;
- for(i = 0; i < 10; i++) // 控制显示的时长,计数速度控制
- {
- //打开数码管的 个位
- com_temp = Arr_num[Unit];
- input_smg();
- COM1 =0;
- COM2 =1;
- COM3 =1;
- COM4 =1;
- Delay_200us();
- COM1 =1; //消隐
- COM2 =1;
- COM3 =1;
- COM4 =1;
- //打开数码管的 十位
- com_temp = Arr_num[Decade];
- input_smg();
- COM1 =1;
- COM2 =0;
- COM3 =1;
- COM4 =1;
- Delay_200us();
- COM1 =1; //消隐
- COM2 =1;
- COM3 =1;
- COM4 =1;
- //打开数码管的 百位
- com_temp = Arr_num[Hundred];
- input_smg();
- COM1 =1;
- COM2 =1;
- COM3 =0;
- COM4 =1;
- Delay_200us();
- COM1 =1; //消隐
- COM2 =1;
- COM3 =1;
- COM4 =1;
- //打开数码管的 千位
- com_temp = Arr_num[Thousand];
- input_smg();
- COM1 =1;
- COM2 =1;
- COM3 =1;
- COM4 =0;
- Delay_200us();
- COM1 =1; //消隐
- COM2 =1;
- COM3 =1;
- COM4 =1;
- //结束当前,等待下次刷新
- Delay_200us();
- }
- }
- /************************
- * 函数名 :input_smg
- * 函数功能:将结果输出到对应IO口上
- * 入口参数:无
- * 返回 :无
- ************************/
- void input_smg() //数码管段显
- {
- #if 1
- P3=com_temp;
- #else
- if(com_temp&0x01)
- {
- SMG_A=1;
- }
- else
- {
- SMG_A=0;
- }
- if(com_temp&0x02)
- {
- SMG_B=1;
- }
- else
- {
- SMG_B=0;
- }
- if(com_temp&0x04)
- {
- SMG_C=1;
- }
- else
- {
- SMG_C=0;
- }
- if(com_temp&0x08)
- {
- SMG_D=1;
- }
- else
- {
- SMG_D=0;
- }
- if(com_temp&0x10)
- {
- SMG_E=1;
- }
- else
- {
- SMG_E=0;
- }
- if(com_temp&0x20)
- {
- SMG_F=1;
- }
- else
- {
- SMG_F=0;
- }
- if(com_temp&0x40)
- {
- SMG_G=1;
- }
- else
- {
- SMG_G=0;
- }
- if(com_temp&0x80)
- {
- SMG_P=1;
- }
- else
- {
- SMG_P=0;
- }
- #endif
- }
- /************************
- * 函数名 :Delay_200us
- * 函数功能:短时间延时
- * 入口参数:无
- * 返回 :无
- ************************/
- void Delay_200us()
- {
- // uchar i = 60;
- // while(--i);
- uchar i = 250;
- while(--i);
- i = 250;
- while(--i);
- }
|