小蜜蜂老师【基于PCF8951的电压信号探测器】

2023-12-16 09:48

本文主要是介绍小蜜蜂老师【基于PCF8951的电压信号探测器】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关于PCF8951模块,有一点需要指出, 

IIC_SendByte(0x03);和IIC_SendByte(0x43);

0x43是打开了模拟输出,如果用到DAC最好写0x43,不然可能误关开关

如果只需要进行DAC的话,写0x03就ok了

什么时候用到ADC呢,要把电压值显示在数码管上的时候

什么时候用到DAC呢,要有模拟电压输出的时候,这个是用万用表进行测量的

 

#include"reg52.h"
#include"iic.h"sbit S4=P3^3;
sbit S5=P3^2;
sbit S6=P3^1;unsigned char code SMG_duanma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
unsigned int adc_value=0;
float adc_volt=0;
unsigned int smg_volt=0;
unsigned int para=300;
unsigned char stat=0;
unsigned char num=0;
unsigned int count=0;
unsigned char stat_led=0xff;
unsigned char led_f=0;
unsigned char count_k=0;void HC138(unsigned char m)
{switch(m){case 4:P2=(P2&0x1f)|0x80;break;case 5:P2=(P2&0x1f)|0xa0;break;case 6:P2=(P2&0x1f)|0xc0;break;case 7:P2=(P2&0x1f)|0xe0;break;case 0:P2=(P2&0x1f)|0x00;break;}P2=(P2&0x1f)|0x00;
}void SMG_bit(unsigned char pos,unsigned char dat)
{P0=(0x01<<pos);HC138(6);P0=dat;HC138(7);
}void SMG_off()
{P0=0xff;HC138(6);P0=0xff;HC138(7);
}void SMG_delay(unsigned char y)
{while(y--);
}void SMG_display()
{if(stat==0){SMG_bit(0,0xc1);SMG_delay(200);SMG_bit(0,0xff);SMG_delay(200);SMG_bit(5,SMG_duanma[smg_volt/100]);SMG_delay(200);SMG_bit(5,0xff);SMG_delay(200);SMG_bit(6,SMG_duanma[(smg_volt/10)%10]);SMG_delay(200);SMG_bit(6,0xff);SMG_delay(200);SMG_bit(7,SMG_duanma[smg_volt%10]);SMG_delay(200);SMG_bit(7,0xff);SMG_delay(200);SMG_off();SMG_delay(200);}else if(stat==1){SMG_bit(0,0x8c);SMG_delay(200);SMG_bit(0,0xff);SMG_delay(200);SMG_bit(5,SMG_duanma[para/100]);SMG_delay(200);SMG_bit(5,0xff);SMG_delay(200);SMG_bit(6,SMG_duanma[(para/10)%10]);SMG_delay(200);SMG_bit(6,0xff);SMG_delay(200);SMG_bit(7,SMG_duanma[para%10]);SMG_delay(200);SMG_bit(7,0xff);SMG_delay(200);SMG_off();SMG_delay(200);}else if(stat==2){SMG_bit(0,0x92);SMG_delay(200);SMG_bit(0,0xff);SMG_delay(200);if(num>9){SMG_bit(6,SMG_duanma[num/10]);SMG_delay(200);SMG_bit(7,0xff);SMG_delay(200);}SMG_bit(7,SMG_duanma[num%10]);SMG_delay(200);SMG_bit(7,0xff);SMG_delay(200);SMG_off();SMG_delay(200);}	
}void InitTimer0()
{TMOD=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;TR0=1;ET0=1;
}void serviceTimer0() interrupt 1
{TH0=(65535-50000)/256;TL0=(65535-50000)%256;if(count_k==1){count++;if(count%20==0){if(num!=99){num++;}if(led_f==1){if((stat_led&0x80)==0x80){stat_led&=~0x80;}else{stat_led|=0x80;}}}if(count>120){stat_led&=~0x07;led_f=1;}else if(count>80){stat_led&=~0x03;}else if(count>40){stat_led&=~0x01;}else{stat_led=0xff;}}
}unsigned char ReadPCF88951()
{unsigned char tmp;IIC_Start();IIC_SendByte(0x90);IIC_WaitAck();IIC_SendByte(0x03);IIC_WaitAck();IIC_Stop();SMG_display();IIC_Start();IIC_SendByte(0x91);IIC_WaitAck();tmp=IIC_RecByte();IIC_SendAck(1);IIC_Stop();return tmp;	
}void analysize_volt()
{unsigned char i;adc_value=0;for(i=0;i<3;i++){adc_value+=ReadPCF88951();}adc_value=adc_value/3;adc_volt=adc_value*(5.0/255);smg_volt=adc_volt*100;if(smg_volt<para){if(count_k==0){count_k=1;}}else{count_k=0;led_f=0;count=0;num=0;stat_led|=0xff;}SMG_display();P0=stat_led;HC138(4);
}void key_delay(unsigned char p)
{while(p--);
}void keyboard()
{if(S4==0){key_delay(200);if(S4==0){while(S4==0){analysize_volt();}if(stat==0){stat=1;}else if(stat==1){stat=2;}else if(stat==2){stat=0;}}}if(S5==0){key_delay(200);if(S5==0){while(S5==0){analysize_volt();}if(stat==1){if(para!=0){para=para-50;}else{para=500;}}}}if(S6==0){key_delay(200);if(S6==0){while(S6==0){analysize_volt();}if(stat==1){if(para!=500){para=para+50;}else{para=0;}}}}
}void Initsystem()
{P0=0xff;HC138(4);P0=0x00;HC138(5);SMG_off();
}void main()
{Initsystem();InitTimer0();while(1){analysize_volt();keyboard();}
}

这篇关于小蜜蜂老师【基于PCF8951的电压信号探测器】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/500038

相关文章

列举你能想到的UNIX信号,并说明信号用途

信号是一种软中断,是一种处理异步事件的方法。一般来说,操作系统都支持许多信号。尤其是UNIX,比较重要应用程序一般都会处理信号。 UNIX定义了许多信号,比如SIGINT表示中断字符信号,也就是Ctrl+C的信号,SIGBUS表示硬件故障的信号;SIGCHLD表示子进程状态改变信号;SIGKILL表示终止程序运行的信号,等等。信号量编程是UNIX下非常重要的一种技术。 Unix信号量也可以

Linux中如何屏蔽信号

本篇文章主要学习Linux的信号处理机制,着重学习屏蔽信号部分。屏蔽信号处理的两种方式类似于信号的捕获,一种方式是直接对其设置,另一种方式是先获得描述符的掩码,然后对其设置操作。 本文主要参考自《嵌入式linux系统使用开发》,作者何永琪,Thanks. 在linux系统中,如何处理某个进程发送的一个特定信号呢?一般来说有三种方式: 1) 忽略信号 2) 屏蔽信号 3) 为该信号添

资料分析系统课-刘文超老师

1、考试大纲 2、解题的问题->解决方法     3、统计术语  基期量与现期量:作为对比参照的时期称为基期,而相对于基期的称为现期。描述具体数值时我们称之为基期量和现期量。 增长量:是指基期量与现期量增长(或减少)的绝对量。增长量是具体值,有单位。增长量=现期量-基期量。增长量有正负,负值代表减少量。增长率:  年均增长量:    年均增长率: 同比和环比

爬取豪ru老师刘艳小说

网址准备 可自行搜索,发现在电脑端无法获取内容,用浏览器仿手机的功能实现 抓包分析,发现网址非常简单,没有任何的反爬措施 可以得到返回的页面,而且字体也没用常见的反爬措施 接下来就分析各个章节的属性就大功告成了 爬取到了 警告,技术不可用于传播黄色

信号与信号量的区别[转]

信号量(Semaphore),有时被称为信号灯,是在多环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。为了完成这个过程,需要创建一个信号量VI,然后将Acquire Semaphore VI以及Release Se

国产隔离放大器:增强信号完整性和系统安全性的指南

隔离放大器是电子领域的关键组件,特别是在信号完整性和电气隔离至关重要的应用中。这些放大器隔离输入和输出信号,使它们能够在没有直接电气连接的情况下跨不同系统传输数据。这确保了电路一部分的高压尖峰或噪声不会影响另一部分,从而保护了系统和用户。随着国产隔离放大器的不断发展,它们提供了性能、可靠性和成本效益的完美结合,使其成为工程师和系统设计师的理想选择。 1. 了解国产隔离放大器的优势 增强信号

信号有效带宽

根据傅里叶变换可以知道信号带宽是无穷大的,这对实际应用是帮助不大的,所以有了有效带宽的概念,可能大家知道常用的经验公式:O.35/Tr或者0.5/Tr等,那这个公式是怎么来的呢?有效带宽又是什么含义呢? 首先来看一个RC低通滤波器,如下: 其上升时间Tr为: 该滤波器的传递函数为: H(s)=1/(RCS+1) 式中S=2πf,转换为频率f的函数为: H(f)=1/(R

Linux 一个简单的中断信号实现

1.查看手册,学习中断处理图 流程:(次级源->开关)到 源挂起 到 开关  到 处理优先级 到 中断挂起标志 到 CPSR里面的开关(图中未展现) 最后cpu处理 此次我们先使用k1按键实现中断,即是eint8 2.此次仅涉及一个中断挂起,步骤较简单,有的寄存器未涉及处理。 寄存器挂起后,通过写1清除对应位( 硬件设计逻辑: 中断标志位通常由硬件自动设置为 1,表示中断发生。

【QT】十分钟全面理解 信号与槽的机制

目录 从一个定时器开始全方位简介1. 基本的信号与槽连接语法例子 2. 使用函数指针连接信号与槽(现代 C++ 风格)语法例子 3. 使用 Lambda 表达式作为槽语法例子 4. 自动连接(`QMetaObject::connectSlotsByName`)规则例子 5. 信号与槽的多对多连接例子(一个信号连接多个槽)例子(多个信号连接一个槽) 6. 断开信号与槽的连接语法例子 7. 信号

笔记 14 : 彭老师课本第 8 章, UART : 寄存器介绍 ,

(99) 继续介绍 uart 的关于通道的 一整套 寄存器, UCON 等: ++ 接着介绍寄存器 UTRSTAT : ++ 接着介绍读写数据的寄存器: ++ 设置 uart 的波特率,有关的寄存器: ++ (100) (101) 谢谢