这段程序完整嘛
时间: 2023-08-07 20:18:50 浏览: 116
根据您提供的代码,完整程序应该还缺少一些必要的函数和变量定义,同时也需要根据具体的硬件和需求进行适当的修改和调整。以下是一个可能的完整程序示例,仅供参考:
```
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
sbit led0=P2^0;
sbit led1=P2^1;
sbit beep=P2^2;
unsigned char dat1,dat2,dat3;
unsigned char i,j,k;
unsigned int mmm;
unsigned long Noise,Noise_h=2000;
unsigned int AD_dat;
// 读取EEPROM存储的阈值
void read_memory() {
dat1=0xA5;
iap_enable();
dat2=iap_read_byte(0x0000);
dat3=iap_read_byte(0x0100);
iap_disable();
Noise_h=(dat2<<8)+dat3;
if(dat1!=0xA5) Noise_h=2000;
}
// 写入EEPROM存储的阈值
void write_memory() {
iap_enable();
iap_erase_sector(0x0000);
iap_program_byte(0x0000,0xA5);
iap_program_byte(0x0100,Noise_h>>8);
iap_program_byte(0x0101,Noise_h&0xFF);
iap_disable();
}
// 显示当前噪声值和阈值
void display() {
if(Noise<Noise_h) {
printf("Noise=%ld,Noise_h=%ld,Normal.\r\n",Noise,Noise_h);
} else {
printf("Noise=%ld,Noise_h=%ld,Danger!\r\n",Noise,Noise_h);
}
}
// 读取ADC转换结果
unsigned int A_D(unsigned char ch) {
unsigned int ad_result;
ADC_CONTR=0x80|ch<<3|0x01; //通道选择,启动ADC转换
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
while(!(ADC_CONTR&0x20)); //等待ADC转换完成
ADC_CONTR&=~(1<<7); //清除ADC转换完成标志
ad_result=ADC_RES; //获取ADC转换结果
ad_result|=ADC_RESL<<8;
return ad_result;
}
// 计算噪声平均值
void memroy() {
dat1=0xA5;
iap_enable();
dat2=iap_read_byte(0x0000);
dat3=iap_read_byte(0x0100);
iap_disable();
Noise_h=(dat2<<8)+dat3;
if(dat1!=0xA5) Noise_h=2000;
}
// 初始化ESP8266模块
void esp_init() {
printf("AT+UART=9600,8,1,0,0\r\n");
delay_ms(100);
printf("AT+CWMODE=1\r\n");
delay_ms(100);
printf("AT+CWJAP=\"SSID\",\"PASSWORD\"\r\n");//这里填写具体的地址
delay_ms(1000);
}
// 发送数据到OneNet云平台
void esp_send(char* data) {
printf("AT+CIPSTART=\"TCP\",\"api.heclouds.com\",80\r\n");
delay_ms(1000);
printf("AT+CIPSEND=%d\r\n",strlen(data));
delay_ms(100);
printf("%s",data);
delay_ms(1000);
printf("AT+CIPCLOSE\r\n");
delay_ms(100);
}
void main() {
esp_init();
read_memory();
uchar i;
char data[100]; // 存放发送到OneNet云平台的数据
while(1) {
memroy();
display();
if(i<80){
i++;
mmm=mmm+A_D(0)/0.51;
P1.4ͨµÀ
} else{
mmm=mmm/80;
AD_dat=mmm;
mmm=0;
i=0;
Noise=(AD_dat*36);
if(Noise<3000)Noise=Noise*2+3000;
}
// 判断是否需要改变阈值
if (从OneNet云平台接收到的控制命令) {
// 根据命令改变阈值,例如:
Noise_h = 100;
write_memory(); // 将新的阈值写入EEPROM
}
if(Noise>Noise_h*100){
led0=1;
led1=0;
beep=~beep;
led1=0;
delay(1000);
led1=0;
delay(1000);
} else{
led0=0;
led1=1;
}
// 将数据发送到OneNet云平台
sprintf(data, "{\"datastreams\":[{\"id\":\"noise\",\"datapoints\":[{\"value\":%d}]}]}", Noise);
esp_send(data);
}
}
```
需要注意的是,这仅是一个示例程序,并不保证能够直接运行。还需要根据具体的硬件和需求进行适当的修改和调整,例如调整ADC通道和参考电压、修改OneNet云平台的设备ID和API KEY等。
阅读全文