电压检测系统的设计与制作(2)

2019-03-22 18:22

姓名: 学号: 专业:

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 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页


电压检测系统的设计与制作(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:中华人民共和国各行业特殊工种名录大全

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: