前情提要:
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);//松开消抖
}