求大神指点,我有一个别人用51写的程序,但不会转换到stm代码中。#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P2^5; //LCD的RS,WR,E的端口
sbit wr=P2^6;
sbit e=P2^7;
sbit key_yi=P3^5; //报警值整定键端口
sbit key_er=P3^6;
sbit key_san=P3^7;
sbit GP2Y_LED=P1^3; //传感器驱动端口
sbit beep=P1^4; //蜂鸣器驱动端口
uchar yi,er,san; //变量定义
uint b,time_num1,set_count,PM_dat=0;
/*****************************************************
功能:将模拟信号转换成数字信号
***************************************************/
sbit ADC0832_CS=P1^2;
sbit ADC0832_CLK=P1^0;
sbit ADC0832_DIO=P1^1;
void write_com(uchar com);
void write_data(uchar dat);
unsigned int A_D(bit flag)
{
unsigned char i;
unsigned char dat;
ADC0832_CS=1; //一个转换周期开始
ADC0832_CLK=0; //为第一个脉冲作准备
ADC0832_CS=0; //CS置0,片选有效
ADC0832_DIO=1; //DIO置1,规定的起始信号
ADC0832_CLK=1; //第一个脉冲
ADC0832_CLK=0; //第一个脉冲的下降沿,此前DIO必须是高电平
ADC0832_DIO=1; //DIO置1, 通道选择信号
ADC0832_CLK=1; //第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入两位数据用于选择通道,这里选通道CH0
ADC0832_CLK=0; //第二个脉冲下降沿
if(!flag)
ADC0832_DIO=0; //DI置0,选择通道0
else
ADC0832_DIO=1; //DI置1,选择通道1
ADC0832_CLK=1; //第三个脉冲
ADC0832_CLK=0; //第三个脉冲下降沿
ADC0832_DIO=1; //第三个脉冲下沉之后,输入端DIO失去作用,应置1
ADC0832_CLK=1; //第四个脉冲
for(i=0;i<8;i++) //高位在前
{
ADC0832_CLK=1; //第四个脉冲
ADC0832_CLK=0;
dat<<=1; //将下面储存的低位数据向右移
dat|=(unsigned char)ADC0832_DIO; //将输出数据DIO通过或运算储存在dat最低位
}
ADC0832_CS=1; //片选无效
return dat; //将读书的数据返回
}
void delay(uchar u)
{ int x,y;
for(x=u;x>0;x--)
for(y=110;y>0;y--);
}
void delay1(uchar u)
{ uint x,y;
for(x=u;x>0;x--)
for(y=1;y>0;y--); }
void init() //初始化函数
{ yi=1;
er=0;
san=0;
TMOD=0X02;
TH0=216; //每40us进一次中断
TL0=216;
ET0=1;
TR0=0;
GP2Y_LED=0;
EA=1;
//开总中断,定时器0开
}
//---------------------------独立键盘扫描程序------设定报警值-------------------//
void keyscan1() //键盘扫描
{
if(key_yi==0) //第一个按键按下
{ delay(1); //延时消除按键抖动
if(key_yi==0) //确认按键按下
{ yi++;if(yi>=10)yi=0;}
while(!key_yi);
}
if(key_er==0) //第二个按键按下
{ delay(1); //延时消除按键抖动
if(key_er==0) //确认按键按下
{ er++;if(er>=10)er=0;}
while(!key_er);
} //第二个按键按下
if(key_san==0)
{ delay(1); //延时消除按键抖动
if(key_san==0) //确认按键按下
{ san++;if(san>=10)san=0;}
while(!key_san);
}
}
//------------------------LCD1602显示程序----------------------------//
void write_com(uchar com) //写命令
{ rs=0;wr=0
0=com;delay(5);e=1;delay(5);e=0; }
void write_data(uchar dat) //写数据
{ rs=1;wr=0
0=dat;delay1(5);e=1;delay1(5);e=0;}
void initlcd() //液晶初始化
{ rs=0;
wr=0;
e=0;
write_com(0x38); //16x2
write_com(0x0c); //显示开,光标不显示,字符不闪烁
write_com(0x06);
write_com(0x01);
}
void write_ser(uchar *ser) //写字符串
{ uint i;
for(i=0;ser[i]!=' ';i++)
{ write_data(ser[i]);
delay(5);
}
}
void display() //显示函数
{
write_com(0x80); //第一行首地址
write_ser("S_PM2.5:"); //字符串
write_data(yi+'0'); write_data(er+'0');
write_data(san+'0');
write_data('u');
write_data('g');
write_data('/');
write_data('m');
write_data('3');
write_com(0xc0); //第二行首地址
write_ser("C_PM2.5:"); //字符串
write_data(b%1000/100+'0');
write_data(b%100/10+'0');
write_data(b%10+'0');
write_data('u');
write_data('g');
write_data('/');
write_data('m');
write_data('3');
}
void display1() //显示更新函数
{
write_com(0x88); //第一行首地址
write_data(yi+'0'); write_data(er+'0'); //更新设定数据
write_data(san+'0');
write_com(0xc8); //第二行首地址
write_data(b%1000/100+'0'); //更新报警数据
write_data(b%100/10+'0');
write_data(b%10+'0');
}
//--------------------------系统主程序------------------------//
void main()
{
uint PM_AD_buf=0;
uint PM_AD_dat=0;
uint AD_dat1=0;
float PM_js=0.0;
bit flag1=0 ;
initlcd(); //液晶初始化
display();
init(); //系统初始化
while(1)
{ //按键检测函数
keyscan1();
GP2Y_LED=1;
TR0=1; //开启中断
while(1)
{
if(time_num1>5) //大约
break;
}
AD_dat1=A_D(1); //模数转换
if(flag1==0){PM_AD_dat=AD_dat1; flag1=1;} //记录转换后的值
PM_AD_dat=PM_AD_dat*8+AD_dat1;
PM_AD_dat/=9;
// PM_AD_dat=AD_dat1; //模数转换后计算平均值
PM_js=((float)(PM_AD_dat/50.2+0.01))*100;//计算PM2.5的值
PM_dat=(uint)(PM_js);
b=PM_dat;
if(b>=999) b=999; //数据修正
if(b<0) b=10;
keyscan1(); //按键检测函数
set_count=yi*100+er*10+san; //计算设定值
if(b>=set_count) {beep=0;} //报警检测
else beep=1;
display1(); //液晶显示数据更新
delay(300); //延时
};
}
void time0_int() interrupt 1 //定时中断函数 每40us进一次中断
{
time_num1++; //定时计数变量+1
if(time_num1==8)
{
GP2Y_LED=0; //输出低电平,驱动传感器
}
else if(time_num1>250) //10MS后计数器清零,关闭定时器
{
time_num1=0;
TR0=0;
}
}
一周热门 更多>