求一单片机程序设计
发布网友
发布时间:2023-09-17 15:55
我来回答
共1个回答
热心网友
时间:2024-12-04 08:39
这个纯粹是学校最小单片机系统,跟毕业设计有点像,P0用于段码的显示,P2低4位为位码,P2.4与P2.5作为控制继电器的驱动三极管的驱动,但是奇怪的是你把HS1101接到了P1口了,这样程序会复杂的多,为什么不把HS1101输出接到单片机的定时计数器上去,P1口就做设定值的输入端口用,这样只要定时间来计数就可以得到数据了,(HS1101输出是频率信号),注意得到的数据和湿度是有对比的关系的,我找到了一段读取HS1101输出的C程序给你参考,用的T1口,
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
uchar tem0, tem1;
uchar temp0, temp1;
uint f=0;
//初值
/******************名称:timer0() **************
功能:定时器1,每50000us中断一次。入口参数:
*************************************/
void timer0() interrupt 1
{
EA =0;
TR0=0;
TR1=0;
TL0=0xFF;
//重装值 定时50000us OX4BFFH
TH0=0x4B;
tem0= TL1;
//读数
tem1= TH1;
TL1=0x00; //定时器1清零
TH1=0x00;
f=1; //作标注位
TR0=1;
TR1=1;
EA=1;
}
/**********************************
名称:timer1()
功能:计数器,用于计数将555输出的频率,以计数相对湿度。
入口参数:
****************************************/
void timer1() interrupt 3
//T1中断,表示计数的频率溢出,超出了可测量的频率范围,显然在这里不可能。
//所以重新启动。
{
EA =0;
TR0=0;
TR1=0;
TL0=0x00; //重装值 定时 50000us
TH0=0x4C;
TL1=0x00; //定时器1清零
TH1=0x00;
TR0=1;
TR1=1;
EA=1;
}
void Init_timer()
{
TMOD=0x51; //0101 0001 定时器0在模式1下工作16位定时器,定时方式
//定时器1在模式1下工作16位计数器,T1负跳变加1
TL0=0x00; //定时器0初值 定时50000us
TH0=0x4C;
TL1=0x00; //定时器1清零
TH1=0x00;
ET0=1; //使能定时器0中断
ET1=1; //使能定时器1中断
EA=1; //使能总中断
TR0=1; //开始计时
TR1=1;
}
void Ddisp() //要补个显示的程序
void tran()
{
f = tem1;
f = ( f<<8 ) | tem0;
f = f * 20; //这里f的值是最终读到的频率,不同频率对于不同相对湿度。查器件对照表
if(( 5623<= f)&&( f<=6852) )//相对湿度在有效范围内(0%--100%)
{ if(( 6734<f)&&( f<= 6852) )
{ temp0 = 0; temp1 =(6852 -f)*10/118; }
if( (6618<f)&&( f<= 6734) )
{ temp0 = 1; temp1 =(6734 -f)*10/116; }
if( (6503<f)&&( f<= 6618 ) )
{ temp0 = 2; temp1 =(6618 -f)*10/115; }
if( (6388<f)&&( f<= 6503 ) )
{ temp0 = 3; temp1 =(6503 -f)*10/115; }
if( (6271<f)&&( f<= 6388 ) )
{ temp0 = 4; temp1 =(6388 -f)*10/117; }
if( (6152<f)&&( f<= 6271 ) )
{ temp0 = 5; temp1 =(6271 -f)*10/119; }
if( (6029<f)&&( f<= 6152 ) )
{ temp0 = 6; temp1 =(6152 -f)*10/123; }
if( (5901<f)&&( f<= 6029 ) )
{ temp0 = 7;temp1 =(6029 -f)*10/128; }
if( (5766<f)&&( f<= 5901 ))
{ temp0 = 8; temp1 =(5901 -f)*10/135; }
if( (5623<f)&&(f<= 5766))
{ temp0 = 9; temp1 =(5766 -f)*10/143; }
}
else
{
temp0= 0;
temp1= 0;
}
}
/////////主程序
void main()
{ uchar i,k;
uchar count; //结果
Init_timer();
count = 0;
while(1)
{
for(i=0;i<200;i++)
for (k=0;k<200;k++);//开机延时,烧机用,保证测试值的准确性
tran();
temp0 &=0x0F;
temp1 &= 0x0F;
temp0= temp0 <<4;
count=temp0 | temp1;
Ddisp(count); //显示
//如果还要做控制的话,将得到的数据跟预设的值对比大小,对应输出即可
}
}