在数码管上显示温度启动继电器

#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char 
	bit fiag;
sbit D0=P2^2;
sbit  duan=P2^5;
sbit  wei=P2^6;
sbit  fmq=P3^3;

sbit si=P1^0;//数据输入口
sbit rck=P2^3;//595移位寄存器,数据送输出的时钟
sbit srck=P1^4;//595数据    写进   移位 寄存器时钟输入口
uchar code suzu[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80};
uint temp;
void wo_74_hc595(uchar v)
{
	uchar H;
	rck=0;
	
for(H=0;H<8;H++)
	{
	srck=0;
	si=(v<<H)&0x80;
	srck=1;		
  }
	rck=1;
	si=1;
	 }
 

void delay(uchar x)
{
  uchar a,b;
	for(a=x;a>0;a--)
	 for(b=200;b>0;b--);
}
void delayyanshi(uint t )
   
	{ while(t--);}
	 
	 
	 
void D0_reset(void)
      {
 D0=1;
	delayyanshi(5);
 D0=0;
	delayyanshi(80);
 D0=1;
	delayyanshi(14);
	if(D0==0)
		fiag=1;
	else
		fiag=0;
	delayyanshi(20);
      }
bit D0_read_bit()
			  {
	bit dat;
D0=0;
_nop_();
_nop_();
D0=1;
_nop_();
dat=D0;
delayyanshi(10);
return	dat;				
				}
uchar D0_read_byte()
				   {
uchar i,j,k;
for(i=0;i<8;i++)//循环8次
  {
	j=D0_read_bit();
	k=(j<<7)|(k>>1);
	
	}	
return k;	
					 }
void D0_write_byte(uchar dat)
      {
uchar i;
for(i=0;i<8;i++)
				{
D0=0;
_nop_();
D0=dat&0x01;
delayyanshi(6);
D0=1;
dat=dat>>1;
				}
				delayyanshi(6);
			}
uint read_temperature()
			{
uchar a,b;
				D0_reset();
				D0_write_byte(0xcc);
				D0_write_byte(0xbe);
				a=D0_read_byte();
				b=D0_read_byte();
				temp=b;
				temp=temp<<8;
				temp=temp|a;
				temp=temp*0.0625*10+0.5;
				
				
				return temp;
			}
void display(uint temp)
			{
				
				wei=1;
				P0=0x01;
				wei=0;
				duan=1;
				P0=suzu[temp/100];
				duan=0;
				delay(4);
				
				
				
				wei=1;
				P0=0x02;
				wei=0;
				duan=1;
				P0=suzu[temp%100/10]&0x7f;
				duan=0;
				delay(4);
			
        
				
				
				wei=1;
				P0=0x04;
				wei=0;
				duan=1;
				P0=suzu[temp%10];
				duan=0;
				delay(2);
				
			
				
				
				
				}
			
void main(void)
{
	
	while(1)
	{
D0_reset();
D0_write_byte(0xcc);
D0_write_byte(0x44);
	display(read_temperature());
		
	
 
   
			if(read_temperature()>=290)
			wo_74_hc595(0x07);//继电器闭合
	    else
		  wo_74_hc595(0x00);//继电器打开
	 
		}
}
好的,以下是一个基于C51单片机温度控制器可设置温度上限控制继电器的按键设置程序例程。 ```c #include<reg52.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit led=P1^0; // 控制LED的引脚 sbit relay=P1^1; // 控制继电器的引脚 uchar temp=0; // 存储当前温度 uchar set_temp=30; // 存储用户设置的温度 uchar key=0; // 存储按键值 // 延时函数 void delay(uint i) { while(i--); } // 初始化函数 void init() { TMOD=0x01; // 定时器0工作在模式1 TH0=(65536-50000)/256; // 初始值为50000us TL0=(65536-50000)%256; ET0=1; // 开启定时器0中断 EA=1; // 开启总中断 TR0=1; // 启动定时器0 } // 数码管显示函数 void display(uchar n) { uchar code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 数码管显示表 P2=table[n]; } // 获取温度函数 void get_temp() { uchar code table[9]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe}; // 温度传感器返回的数据表 uchar i; for(i=0;i<9;i++) { P2=table[i]; delay(100); if(P3==0xfe) // 如果温度传感器输出低电平 { temp=i+1; break; } } } // 按键扫描函数 void keyscan() { key=0; if(P3!=0xff) { delay(1000); // 消抖 if(P3!=0xff) { switch(P3) { case 0xfe: set_temp++;break; // 按下K1键,温度上限+1 case 0xfd: set_temp--;break; // 按下K2键,温度上限-1 default: break; } while(P3!=0xff); // 等待按键松开 key=1; } } } // 主函数 void main() { init(); // 初始化 while(1) { get_temp(); // 获取当前温度 display(temp); // 数码管显示当前温度 if(temp>=set_temp) // 如果当前温度超过设定温度 { led=0; // LED灯亮 relay=1; // 继电器断开 } else { led=1; // LED灯灭 relay=0; // 继电器闭合 } keyscan(); // 按键扫描 if(key==1) // 如果有按键按下 { if(set_temp>99) set_temp=99; // 温度上限不能超过99度 if(set_temp<0) set_temp=0; // 温度上限不能小于0度 } } } // 定时器0中断服务函数,用于定时扫描按键 void timer0() interrupt 1 { TH0=(65536-50000)/256; // 初始值为50000us TL0=(65536-50000)%256; static uchar i=0; i++; if(i==20) // 20ms扫描一次按键 { i=0; keyscan(); } } ``` 这个程序例程中,我们使用了数码管、LED灯和继电器来实现温度显示、警告和控制。程序中的按键K1和K2分别用于增加和减少温度上限的设定值。程序中使用了定时器0中断来定时扫描按键,保证了按键的及时响应。其中,获取温度和按键扫描的函数需要根据具体的硬件和传感器进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值