200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 51单片机温控风扇制作 数码管显示 Proteus仿真程序

51单片机温控风扇制作 数码管显示 Proteus仿真程序

时间:2019-07-05 14:10:49

相关推荐

51单片机温控风扇制作 数码管显示 Proteus仿真程序

仿真原理图如下

制作出来的实物图如下:

单片机源程序如下:

#include //调用单片机头文件

#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255

#define uint unsigned int //无符号整型 宏定义 变量范围0~65535

//数码管段选定义 0 1 2 3 4 5 6 789

uchar code smg_du[]={0x28,0xee,0x42,0x72,0xe5,0xa8,0x41,0x77,0x20,0xa0,

0x60,0x25,0x39,0x26,0x31,0x71,0xff}; //断码

//数码管位选定义

uchar code smg_we[]={0xef,0xdf,0xbf,0x7f};

uchar dis_smg[4] = {0};

uchar smg_i = 3; //显示数码管的个位数

sbit dq = P2^4; //18b20 IO口的定义

bit flag_lj_en; //按键连加使能

bit flag_lj_3_en; //按键连3次连加后使能 加的数就越大了

uchar key_time,key_value; //用做连加的中间变量

bit key_500ms ;

sbit pwm = P2^3;

uchar f_pwm_l ;//

uint temperature ; //

bit flag_300ms ;

uchar menu_1; //菜单设计的变量

uint t_high = 300,t_low = 230;//温度上下限值

/***********************1ms延时函数*****************************/

void delay_1ms(uint q)

{

uint i,j;

for(i=0;i<>< p=""><>

for(j=0;j<120;j++);

}

/***********************小延时函数*****************************/

void delay_uint(uint q)

{

while(q--);

}

/***********************数码显示函数*****************************/

void display()

{

static uchar i;

i++;

if(i >= smg_i)

i = 0;

P1 = 0xff; //消隐

P3 = smg_we[i]; //位选

P1 = dis_smg[i]; //段选

}

/***********************18b20初始化函数*****************************/

void init_18b20()

{

bit q;

dq = 1;//把总线拿高

delay_uint(1);

dq = 0;//给复位脉冲

delay_uint(80);

dq = 1;//把总线拿高 等待

delay_uint(10);

q = dq;//读取18b20初始化信号

delay_uint(20);

dq = 1;//把总线拿高 释放总线

}

/*************写18b20内的数据***************/

void write_18b20(uchar dat)

{

uchar i;

for(i=0;i<8;i++)

{//写数据是低位开始

dq = 0; //把总线拿低写时间隙开始

dq = dat & 0x01; //向18b20总线写数据了

delay_uint(5);

dq = 1; //释放总线

dat >>= 1;

}

}

/*************读取18b20内的数据***************/

uchar read_18b20()

{

uchar i,value;

for(i=0;i<8;i++)

{

dq = 0; //把总线拿低读时间隙开始

value >>= 1; //读数据是低位开始

dq = 1; //释放总线

if(dq == 1) //开始读写数据

value |= 0x80;

delay_uint(5); // 读一个时间隙

}

return value; //返回数据

}

/*************读取温度的值 读出来的是小数***************/

uint read_temp()

{

uint value;

uchar low; //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序

init_18b20(); //初始化18b20

write_18b20(0xcc);//跳过64位ROM

write_18b20(0x44);//启动一次温度转换命令

delay_uint(50);

init_18b20(); //初始化18b20

write_18b20(0xcc);//跳过64位ROM

write_18b20(0xbe);//发出读取暂存器命令

low = read_18b20();//读温度低字节

value = read_18b20(); //读温度高字节

value <<= 8; //把温度的高位左移8位

value |= low; //把读出的温度低位放到value的低八位中

value *= 0.625; //转换到温度值 小数

return value; //返回读出的温度 带小数

}

/*************定时器0初始化程序***************/

void time_init()

{

EA = 1; //开总中断

TMOD = 0X21;//定时器0、定时器1工作方式1

ET0 = 1; //开定时器0中断

TR0 = 1; //允许定时器0定时

ET1 = 1; //开定时器0中断

TR1 = 1; //允许定时器0定时

}

/********************独立按键程序*****************/

uchar key_can; //按键值

void key() //独立按键程序

{

uchar key_new;

key_can = 0; //按键值还原

P2 |=

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。