51单片机智能温控风扇

大三上学期写的一个课程设计,完成的功能就是读取当前环境温度,在数码管上显示,并根据其驱动风扇转动的快慢,另用键盘扫描实现了总开关,超过一定阈值蜂鸣器响起。用51单片机由于芯片问题,使用两个定时器,很容易得到脏数据,程序当时写完,反复检查各种模块,和老师讨论,得出不是代码的问题,就进行了一次数据过滤
主要难点:步进电机的控制,使用占空比。

回头看,段锁存和位锁存都弄不清楚了,位锁存就是第几个数码管,段锁存就是数码管上的第几段,锁存器的锁存端为1是,数据直通,为0时就无论输入什么,输出保持前一次的输入值。

主程序:


#include<reg52.h> 
#include "18b20.h"
#include "delay.h"

sbit LATCH1=P2^6;//定义锁存使能端口 段锁存
sbit LATCH2=P2^7;//                 位锁存
sbit A1=P1^0; //定义步进电机连接端口
sbit B1=P1^1;
sbit C1=P1^2;
sbit D1=P1^3;
sbit SPK1=P1^4;    //定义喇叭端口
bit ReadTempFlag;//定义读时间标志

#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
#define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电
#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电
#define KeyPort P3





unsigned char code dofly_DuanMa[10]={
  
  0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
unsigned char code dofly_WeiMa[]={
  
  0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
unsigned char code special_DuanMa[10]={
  
  0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};// 带小数点的段码0~9
unsigned char TempData[8]; //存储显示值的全局变量
unsigned int CYCLE=100,PWM_ON=0;//定义周期并赋值
unsigned char key = 0;              //键盘扫描
unsigned int flag=0;            //电机转动开关
unsigned int lin=0;
unsigned int tp=0;


void Init_Timer0(void);//定时器初始化
void Init_Timer1(void);
void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数

unsigned char KeyScan(void);//键盘扫描
unsigned char KeyPro(void);

/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main (void)
{                  
    unsigned int TempH,TempL;
    unsigned int temp=0;
    unsigned int hig,low;
    Init_Timer0();
    Init_Timer1();

    while (1)         
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值