姓名: 学号: 专业:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // myfuncs.h
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #ifndef _MYFUNCS_H_ // 防止重复编译本头文件 #define _MYFUNCS_H_
#define DLY_MS 67 //设置延时时间常数。不同主频时需要修改 void delayms(int ms); //声明延时函数 #endif // _MYFUNCS_H_
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // seg74.c
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #include \
#include \#include \
const char Seg7TableN[]={0b11000000,0b11111001,0b10100100, 0b10110000,0b10011001,0b10010010, 0b10000010,0b11111000,0b10000000,0b10010000}; //字形码数组 void DisplayData(unsigned int iData) { char i=0,j=0,k=0,NumStr[5]={0,0,0,0,0}; //NumbStr[0]未用 NumStr[1]=iData/1000; // 千位 NumStr[2]=(iData00)/100; // 百位 NumStr[3]=iData0/10; // 十位 NumStr[4]=iData; // 个位
//用NumStr[1]到NumStr[4]的目的是与电路图上的序号匹配,这样不易弄错 for(i=0;i<10;i++) { SEG_BITSEL_PORT=k=0x01; // 每次循环不要忘记k赋初始值 for(j=1;j<=4;j++) // 共需要刷新四个数码管位置 { SEG_BITSEL_PORT=k; //设置要点亮的位置 if(j==1) {
SEG_FONT_PORT=Seg7TableN[NumStr[j]] &0b01111111; //设置千位显示小数点的字形 } } else { SEG_FONT_PORT=Seg7TableN[NumStr[j]]; //设置其它位字形 } delayms(5); // 延时显示字形,造成视觉暂留现象 k=k<<1; // 左移为显示下一位置做准备 } } }
电压检测系统设计
第6页 共9页
姓名: 学号: 专业:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // seg74.h
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #ifndef _SEGMENT74_H_ // 防止重复编译本头文件 #define _SEGMENT74_H_
#define SEG_BITSEL_PORT PORTD // 位选端口
#define SEG_BITSEL_PORT_DIR TRISD // 位选端口的方向寄存器 #define SEG_FONT_PORT PORTC // 字形输出端口
#define SEG_FONT_PORT_DIR TRISC // 字形端口的方向寄存器 void DisplayData(unsigned int iData); #endif // _SEGMENT74_H_
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // main.c
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 采用中断方式+软件滤波测量电位器RV2对地阻电压值并显示在四位数码管上。 #include \#include \#include \#include \
__CONFIG(XT & WDTDIS & LVPDIS); // ICD2 调试配置字 unsigned int g_ADRTable[12]={0}; //保存12次转换结果 unsigned char g_Count=0; // 记录当前采集数据的存放位置
bit OverFlag=0; // 12次转换完成标志位,初学者注意标志位的使用方法 interrupt ISR(void) {
if(ADIE && ADIF) {
ADIF=0; // A/D标志位清零
g_ADRTable[g_Count]=( ((unsigned int)ADRESH) << 8)+ADRESL; //获得10位结果 g_Count++; if(g_Count==12) {
g_Count=0; OverFlag=1; } else
{ ADGO=1; // 启动下一次A/D转换 } } else {
while(1); // 调试程序用,若有其它意外中断产生才会走的此处。 } }
void main(void)
电压检测系统设计
第7页 共9页
姓名: 学号: 专业:
{
char i=0,j=0; // i用来计数超过25us的变量,i,j用来做排序算法循环变量 int tmp=0; // 存放数组元素或数组元素和的临时变量 int adc_v=0; // 存放多次A/D转换10位结果的平均值 TRISA0=1; // AN0是RA0,所以要把A口置为输入 SEG_BITSEL_PORT_DIR=0x00; //位选端口置为输出 SEG_FONT_PORT_DIR=0x00; // 字形端口置为输出 ADFM=1; //右对齐,ADRESL保存低八位 PCFG3=0; PCFG2=0; PCFG1=0;
PCFG0=0; // PCFG3:PCFG0=0000,全为模拟引脚,参考电压为VDD和VSS
// 以上5条语句可以用一条语句表达:ADCON1=0b00000000; 分开写的目的是易于理解 ADCS1=1;
ADCS0=1; // 使用A/D转换模块内部RC振荡器作为时钟 CHS2=0; CHS1=0;
CHS0=0; // CHS2:CHS0=000, 选择通道0进行A/D转换 ADON=1; // 开启A/D转换模块
// 以上6条语句可以用一条语句表达:ADCON0=0b11000001; ADIE=1; // 允许A/D转换产生中断 ADIF=0; // A/D标志位清零 PEIE=1; // 允许外设中断
GIE=1; // 打开总中断使能位
for(i=0;i<25;i++) ; // 为了采样保持电路充电的延时,超过25us即可 ADGO=1; // 启动一次A/D转换 while(1) {
if(OverFlag==1) // 12次转换完成 { // 简单的冒泡排序算法 for(i=0;i<12;i++) {
for(j=i+1;j<12;j++) {
if(g_ADRTable[i]>g_ADRTable[j]) {
tmp=g_ADRTable[i];
g_ADRTable[i]=g_ADRTable[j]; g_ADRTable[j]=tmp; } } }
// 计算g_ADRTable[2]到g_ADRTable[10]之间的平均值 tmp=0;
电压检测系统设计
第8页 共9页
姓名: 学号: 专业:
for(i=2;i<10;i++) //求排序后中间八个数的和 { // 最高的两个值和最低的两个值除外 tmp=tmp+g_ADRTable[i]; }
tmp=tmp>>3; //整数右移三位等价于除以八 adc_v=tmp; // 保存平均值
adc_v=((long)adc_v*5000/1023); //获得电阻值 OverFlag=0; // 清空标志位
ADGO=1; // 启动下一次A/D转换 }
DisplayData(adc_v); //显示平均值 } }
电压检测系统设计
第9页 共9页