基于51单片机的温控—程序设计一

前情提要:
1 基于51单片机的温控
2 手工焊接部分

程序设计

因为我们焊接的板子没有烧录的地方,芯片取下来用开发板烧录也比较麻烦。所以我们在仿真图上程序的调试。最终调试好之后,我们再在硬件上测试

数码管显示部分

静态显示

已知数码管四个发光二极管公用一个段选,即8个低电平有效的引脚,因此单片机向这8个引脚输出有效电平时,四个数码管会被同时点亮。
数码管静态显示
四位一体共阳的数码管,驱动电路如下:
数码管驱动
位选DB1–DB4分别连接单片机的P3.7–P3.4这四个IO口。分别对应的数码管从左到右。如果要选择数码管,则IO输出低电平
参考代码:

#include "reg52.h" 
 /*数码管0-9A-F的共阳编码*/
 unsigned char code table[]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
 /*声明位选*/
 sbit W1 = P3^7;
 sbit W2 = P3^6;
 sbit W3 = P3^5;
 sbit W4 = P3^4;
 /*函数声明*/
 void Reg_static_display(int num);
 int main()//主函数,C语言程序指令开始的地方 也是指令结束的地方
{
	Reg_static_display(6);//显示4个6
	 while(1);//单片机的机制是一直在执行ROM中的指令 意思就是主函数结束后会重新执行 
	return 0;
 }
 /*静态显示:在数码管显示数字num 0-15  ---> 0-9AF*/
 void Reg_static_display(int num)
 {
 	P1 = table[num];//P1组
	W1=0,W2=0,W3=0,W4=0;
 }

上述代码实现四个数码管同时显示相同的内容,也可以写一个循环函数使四个数码管依次显示,只要给四个位选依次给零。

动态显示

余晖效应,指人眼在观察景物时,光信号传入大脑神经,需经过一段短暂的时间,光的作用结束后,视觉形象并不立即消失,这种残留的视觉称“后像”,视觉的这一现象则被称为“视觉暂留”。
简单来说,就是人眼所看到的影像消失后,人眼仍然能保持其影像0.1秒到0.4秒

0.4秒对于人眼来说很短暂,对于单片机来说就大有可操作的空间。先加入一个延时函数

/*延时n毫秒*/
void Delay_ms(int n)
{
    int i;
    while(n--)// n次
   {	
   	 for(i=0;i<112;i++);//执行1ms 这里为112--115之间 为什么?
   }
}

第一个数码管显示,延时4ms后关闭,第二个数码管显示,再延时4ms后关闭接着下一个,如此循环,肉眼看来就是四个数码管在同时显示不同的内容。

 /*动态显示:在数码管上显示-40度到480之间的数字*/
 void Reg_dymamic_display(int num)
 {
	if(num<-40 || num>480)  return ;//参数异常
	if(num<0)
	 {
		 P1 = 0xBF;//显示
		num*=-1;//把负数变成正数
	}
	 else 
	{
		 P1 = table[num/100%10]; //显示百位上的数字
	}
	 W1 = 0;//打开第一个数码管
	Delay_ms(4);
	 W1 = 1;//关闭第一个
	 
	P1 = table[num/10%10];  //显示是十位上的数字
	W2 = 0;//打开第二个数码管
	Delay_ms(4);
	 W2 = 1;//关闭第二个
	 
	P1 = table[num%10]; //显示是十位上的数字
	W3 = 0;//打开第三个数码管
	Delay_ms(4);
	 W3 = 1;//关闭第三个
	 
	P1 = table[12]; //显示C,0xC6
	 W4 = 0;//打开第四个数码管
	Delay_ms(4);
	W4 = 1;
 }

按键

在这里插入图片描述
由电路图可知,按键按下时为低电平,故IO口配置时配置为上拉输入,检测到低电平说明按键被按下。

if(KEY1 == 0)//被按下
{
}

从仿真来看上述代码是可行的,但是实际上按键是一个机械开关,按下和松开时都会有抖动,导致单片机容易误判。
抖动
如上图,单片机可能会在抖动的地方多次判断为按键被按下,而实际上按键仅被按下一次。
按键消抖,分为软件消抖(延时跳过抖动,一般延时10ms)和硬件消抖(按键并联一个电容或者RS触发器,改变原来的电路,增加硬件成本)。

if(KEY1 == 0)
 {
 delay_ms(10);//消抖
if(KEY1 == 0)//防止误触
{
 //...
 }
 while(KEY1==0);//松开消抖
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值