PIC单片机的交流电压测量C语言实例

上传人:汽*** 文档编号:457985580 上传时间:2023-01-19 格式:DOC 页数:4 大小:100.50KB
返回 下载 相关 举报
PIC单片机的交流电压测量C语言实例_第1页
第1页 / 共4页
PIC单片机的交流电压测量C语言实例_第2页
第2页 / 共4页
PIC单片机的交流电压测量C语言实例_第3页
第3页 / 共4页
PIC单片机的交流电压测量C语言实例_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《PIC单片机的交流电压测量C语言实例》由会员分享,可在线阅读,更多相关《PIC单片机的交流电压测量C语言实例(4页珍藏版)》请在金锄头文库上搜索。

1、第 11 章 交流电压测量11.3.2 程序清单 该程序已在模板上调试通过,可作读者的参考。有关显示部分请读者参考本书相关章 节,有关 A/D 转换的详细设置请参考前面章节。#include #include#include/该程序用于测电网的交流电压有效值,最后的结果将在4个LED上显示,保留/1 位小数。需要将 PICC的double型数据选成32位/ 为了保证调试时数据运算的精确性, union adresint y1 ;unsigned adresult bank3char adre2/unsignedint re40;char k, data ;/doublesqu , squad;

2、/定义一个共用体定义存放 A/D 转换结果的数组,在 bank3 中/ 定义几个通用寄存器/ 平方寄存器和平方和寄存器, squ 又通用为存储其它数值#int uo#bank1consts4 ;char table10=0xc0unsigned char/ 此数组用于存储需要显示的字符的 ASII 码, 0xf9 , 0xa4, 0xb0, 0x99, 0x92, 0x82, 0XD8, 0x80,#0x90 ;/ 不带小数点的显示段码表, 0x79, 0x24, 0x30 , 0x19 , 0x12, 0x02, 0x78, 0x00,const char table010=0x400x10

3、 ;/ 带小数点的显示段码表/A/D 转换初始化子程序void adinitial()#ADCON0=0x4;1/ADCON1=0X8;E/选择A/D通道为RA0且打开A/D转换器 在工作状态,使 A/D 转换时钟为 8Tosc 转换结果右移,及ADRES寄存器的高6位为0 把RAO口设置为模拟量输入方式ADIE=1;PEIE=1;/A/D 转换中断允许/ 外围中断允许#TRISA0=1;/设置RAO为输入方式/spi void方式显示初始化子程序SPIINIT()#TRISA0=1;/设置RAO为输入方式PIR1=0;SSPCON=0x3;0SSPSTAT=0xC;0 / 设置 SPI 的控

4、制方式, /SCLK 从低到高跳变时,TRISC=0xD7;TRISA5=0;/ 系统其它初始化子程序void i nitial() 允许SSP方式,并且时钟下降沿发送,与74HC595,当其 串行输入寄存器 的特点相对应/SDO引脚为输出,SCK引 |脚为输出/RA5 引脚设置为输出,以输出显示锁存信号#TRISA0=1;/设置RAO为输入方式CCP2IE=O;SSPIE=O;CCP2CON=OX;OBCCPR2H=OXO;1CCPR2L=OXF;4/禁止CCF中断/禁止SSP中断/初始化CCP2CQNCCP2为特别事件触发方式/初始化CCPR2寄存器,设置采样间隔500卩s,/ 一个周期内

5、电压采 4O 个点#TRISA0=1;/设置RAO为输入方式#TRISA0=1;/设置RAO为输入方式中断服务程序void interrupt/adint(void)CCP2IF=0;ADIF=0;adresult.adre0=ADRESL adresult.adre1=ADRESH/清除中断标志/rek=adresult.y1k+;/SPI 传送数据子程序 void SPILED(data)/读取并存储A/D转换结果,A/D转换的结果通过共用体的形式放入了变量 y1 中/1 次 A/D 转换的结果存入数组数组访问指针加 1#SSPBUF=data; do/ 启动发送while(SSPIF=0

6、) ;#SSPIF=0;/ 主程序 main( ) adinitial() ; SPIINIT() ; initial() ; while(1) k=0; TMR1H=0X00 ; TMR1L=0X0;0 ei() ; T1CON=0X0;1 while(1) if(k=40) di() ;uo=rek ; squ=(double)uo ; squ=squ*5/1023 ; squ=squ*squ ; squad=squad+squ; squ=squad/40 ; squ=sqrt(squ) ; squ=squ*154.054 ;squ=squ*10 ;/A/D 转换初始化/spi 方式显示初

7、始化/ 系统其它初始化/ 数组访问指针赋初值/ 定时器 1 清 0 / 中断允许/ 打开定时器 1break ; /A/D 转换次数达到 40,则终止/ 禁止中断for(k=0 ;k40;k+)rek=rek-0X199 ;/ 假设提升电压为 2 V ,对应十六进制数199H,/ 则需在采样值的基础上减去该值for(k=0 ,squad=0; k40;k+) / 强制把采得的数据量转换成双精度数,以便运算/ 把每点的数据转换成实际数据/ 求一点电压的平方/ 以上求得 40 点电压的平方和,存于寄存器 squad 中/ 求得平均值/ 开平方,求得最后的电压值/ 通过变压器的变比和分压电阻分配确定

8、该系数/ 以上得到了实际电网的电压值/ 为了保证显示的小数点的精度,先对电压值乘以 10uo=(int)squ ; sprintf(s , %4d, uo);/强制把U转换成有符号整型量/ 通过 sprintf 函数把需要显示的电压数据转换成/ASII码,并存于数组S中RA5=0;for(k=0 ; k4; k+) data=sk ; data=data&0X0F;/ 准备锁存/通过按位相与的形式把ASII码转换成BCD码if(k=2) data=table0data ;/ 因为 squ 已乘以 10,则需在第 2位打小数点/ table0 存储带小数点的显示段码,/table 存储不带小数点的显示段码/ 发送显示段码else data=tabledataSPILED(data) ;for(k=0 ;k4; k+) data=0xFF;RA5=1;SPILED(data) ;/连续发送4个DAR,使显示看起来好看一些,这点与/该实验板的LED分布结构有关/ 最后给一个锁存信号,代表显示任务完成#

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号