单片机简介
1.内部集成了CPU、RAM、ROM、定时器、中断系统及通讯接口等一系列电脑的常用硬件功能
2.单片机的任务是信息采集(依靠传感器)、处理(依靠CPU)和硬件设备(例如电机,LED等)的控制
3.单片机和计算机相比,单品机算是一个袖珍版计算机,一个芯片就能构成完整的计算机系统。但在性能上,与计算机相差甚远,但单片机成本、体积小、结构简单,在生活和工业控制领域大有所用
这里以STC89C52为例,外观如下图:
原理图:
部分引脚示意图:
点亮LED
#include <REGX52.H>
void main()
{
P2=0x55;//0101 0101
while(1)
{
}
}
由原理图可知控制各个外设的名称编号,这里通过对P2赋值控制LED灯,这里给低电频的亮,赋16进制转换为2进制即为最终点亮的效果。
延时函数
延时函数的简单应用:
void main()
{
while(1){
P2=0x55;
Delay500ms();
P2=0xFF;
Delay500ms();
}
}
在这里运用delay函数可以实现0.5s闪烁效果。
delay函数可以在stc-isp中直接生成,但为了方便使用,对他进行优化如下:
#include <intrins.h>
void Delay1ms(unsigned int k)
{
unsigned char i, j;
while(k--){
_nop_(); //这里的_nop_的使用需要引入头文件如上
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
消抖
当我们按下按键时,金属片会上下抖动,这将会使,电路一下接通,一下不接通,即在0与1间来回跳转,这将导致,当我们检测时,明明只按一次按钮,却出现按下多次按钮的检测结果。
所以我们为了功能实现的稳定,采用delay函数进行消抖。
例:
void main(void)
{
while (1) {
if (P3_1 == 0) {
Delay(20);
while(P3_1 == 0);
Delay(20);
P2_0 = ~P2_0;
}
}
}
移位
unsigned char LEDnum;
void main()
{
P2=~0x80;
while (1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
LEDnum++;
if(LEDnum>=8)
LEDnum=0;
P2=~(0x80>>LEDnum);
}
if(P3_0==0)
{
Delay(20);
while(P3_0==0);
Delay(20);
if(LEDnum==0)
LEDnum=7;
else
LEDnum--;
P2=~(0x80>>LEDnum);
}
}
}
移位用到移位运算符<<,>>,分别表示左移右移。代码中是以固定位置为基准点,每次移位用变量LEDnum来控制。
数码管
简介
a.数码管电路图:
连接方式分为共阳极和共阴极,这里的采用共阴极。
由图可知所有数码管的a都连在一起,其他的bcdefg.也是如此。所以同时如果点亮多个数码管,显示的样式也都是一样的。
b.138译码器:
数码管的com端连向这里,利用3个P口来控制8个端。
ABC为P口,C为最高位,即排序C的数字排最右;
VCC,GND电源正负极;
Y0~Y7,LED端,上方一横表负极有效;
G1~G2AB,使能端,即芯片自带开关,打开后才能使用。
静态数码管显示
#include <REGX52.H>
unsigned char table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};
void orde(unsigned char location,number)
{
switch(location)
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=table[number];
}
void main()
{
orde(5,15);
while(1);
}
即定义一个数组,存放要显示的数字或字母等字符,再通过定义的函数用switch定位要显示的数码管的位置,在这个位置上用户数组对P0赋值。(这里给高电频亮)
动态数码管显示
void orde(unsigned char location,number)
{
switch(location)
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=table[number];
delay(1);
P0=0x00; //在下一个位选前,将本次段选清除,以达到消影目的
}
void main()
{
while(1)
{
orde(1,1);
orde(2,2);
orde(3,3);
orde(4,4);
orde(5,10);
orde(6,11);
orde(7,12);
orde(8,13);
}
}