5152单片机14课:温控开关
#include <reg51.h>//头文件
#define uint unsigned int//宏定义
#define uchar unsigned char //宏定义
sbit DQ=P3^2;//18B20的2脚与单片机P3.2口相接
sbit P10=P1^0;//数码管位选引脚P1.0
sbit P11=P1^1;//数码管位选引脚P1.1
sbit P14=P1^4;//继电器控制引脚
uchar temp;
uchar htemp=30;//动作温度值
code unsigned char sz []={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0-9数组
void delay (uint t);//延时函数声明
void delayms(uint a);//for语句延时函数声明
void init();//18B20初始化程序声明
void write (uchar dat);//写1字节程序声明
uchar read ();//读1字节程序声明
void display();//显示程序声明
uchar readtemp();//读温度程序声明
void delay (uint t)//延时函数
{
while(t--);
}
void delayms(uint a) //for语句延时函数
{
uint x,y;
for(y=110;y>0;y--);
}
void init ()//18B20初始化程序
{
uchar n;
DQ=1;
delay(8);
DQ=0;
delay(80);
DQ=1;
delay(8);
n=DQ;
delay(4);
}
void write (uchar dat)//写1字节程序
{
uchar i;
for (i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;
delay (4);
DQ=1;
dat>>=1;//dat=dat>>1
}
delay(4);
}
uchar read ()//读1字节程序
{
uchar i,value;
for (i=0;i<8;i++)
{
DQ=0;
value>>=1;
DQ=1;
if(DQ)///
value|=0x80;
delay(4);
}
return value;
}
uchar readtemp()//读温度程序
{
uchar a,b;
init();
write (0xcc);
write (0x44);
delay (300);
init ();
write (0xcc);
write (0xbe);
a=read();
b=read();
b<<=4;
b+=(a&0xf0)>>4;
return b;
}
void display ()//显示程序
{
P10=0;
P0=sz[temp/10];
delayms(2);
P10=1;
P11=0;
P0=sz[temp%10];
delayms(2);
P11=1;
}
void main()//主程序
{
while(1)
{
temp=readtemp();
display ();
if (temp>=htemp)
{
P14=0;
}
else
{
P14=1;
}
}
}
单片机驱动数码管设计详解(用74HC595实现)
简单设计了一个单片机驱动数码管的电路,该设计中只使用了4位数码管,占用了单片机3个IO口,如果驱动芯片全用满可以驱动8位数码管。仅供初学者分享学习。
1. 数码管显示设计
本设计使用了一个4位的数码管,为共阳型,为了节省单片机的IO口,使用了两片74HC595作为数码管的驱动芯片,共占用3个IO口。74HC595部分电路图如下:
与单片机相连接的三个脚分别为:HC_DAT,HC_RCK,HC_CLK。两片595采用级联方式,即U2的第9脚接到U3的第14引脚。
2. 74HC595简介
74HC595是8位的移位寄存器,串入并出,并具有锁存功能,被广泛的用于数码管、点阵的驱动电路中。其管脚介绍如下:
15:数据输出A-接数码管数据A段;
1:数据输出B-接数码管数据B段;
2:数据输出C-接数码管数据C段;
3:数据输出D-接数码管数据D段;
4:数据输出E-接数码管数据E段;
5:数据输出F-接数码管数据F段;
6:数据输出G-接数码管数据G段;
7:数据输出H-接数码管数据H段;
16:电源正脚-接电源正;
8:电源负脚-接电源负;
14:数据输入脚-接单片机管脚;
12:数据锁存时钟-接单片机管脚;
11:数据输入时钟-接单片机管脚;
13:使能输出脚-低电平有效,接低电平;
10:数据清零-不清零,接高电平;
9:数据级联输出-接下一片595的数据输入脚;
74HC595的真值表如下:
知道了74HC595的引脚定义和真值表,那该如何编程呢?下面重点来了,通过时序图来编程。看重点!!!
3. 74HC595时序图
我是重点!我是重点!我是重点!
通过时序可以看出:
SCK是上升沿的时候要把数据写入;
RCK是上升沿的时候数据才能锁存显示;
有数据操作的过程中RESET必须是高电平;
EN必须是低电平,595才能工作;
知道了以上4点就可以写程序了。其中3、4条是硬件连接上的事情(也可以用单片机的IO口来连接,这样的话可以随时控制74HC595的工作与否情况)。写程序主要靠1、2条。下面具体操作。
4. 程序实例
看下面一段程序:
第39行:HC595_CLK(0)的原型如下:
HC595_CLK(0)是让CLK处于低电平,即上升沿还没有来到;
HC595_DAT(1)就是要把写入的数据准备好;
temp<<1是将数据移位,即一个字节分八次写入;
HC595_CLK(1)是让CLK处于高电平,即上升沿来了;
以上几句解释一下就是:
在CLK时钟上升沿来临之前把要写入的数据准备好,等上升沿来了就把准备好的数据写入。 这就是对时序图的解释。
记住,这仅仅是把数据写入到了74HC595中,但是还没有让74HC595锁存,即没有让数据显示出来,如果让数据显示的话,必须要给RCK一个上升沿(即时序图中的第2条),操作如下:
单片机执行完这个程序后,数据才会在数码管上显示出来。
这一节内容的难度较大,主要是因为时序图这个东西是很模糊的一个内容,大家可以慢慢理解体会。
本订阅号致力于单片机、ARM等嵌入式软硬件的设计经验分享,秉承“人人都是电子设计经验的分享者”的理念,成功路上不孤单,我们一起努力。公众号:micropoint8
相关问答
ds18b20数据如何发给 单片机 ?在DQ=0,之后,DQ就是输入端了。如果这时DQ=1了,就在dat的最高位加一,就是:dat|=0x80。最先收到的位,是数据的最低位,所以要逐步的向低位移动...在...
单片机 实验中,怎么用汇编比较大小?51单片机中,没有专门的有符号数比较指令,只能通过一些变通的方法来实现,比如:比较30H和40H中有符号数的大小,结果放在R2中,大于则为1,等于为0,小于为128...5...