做网站有底薪吗,seo网站架构,建设银行纪检监察网站,手机壳定制网站制作一、前期准备
1、硬件设备 2、软件设备 二、预备知识
1、什么是单片机#xff1f;
在一片集成电路芯片上集成微处理器、存储器、IO接口电路#xff0c;从而构成了单芯片微型计算机#xff0c;及单片机。STC89C52单片机#xff1a; STC#xff1a;公司89#xff1a;所属…
一、前期准备
1、硬件设备 2、软件设备 二、预备知识
1、什么是单片机
在一片集成电路芯片上集成微处理器、存储器、IO接口电路从而构成了单芯片微型计算机及单片机。STC89C52单片机 STC公司89所属系列C工作电压5.5V~3.8V52程序空间及RAM空间大小8KB程序空间及512B的RAM空间
2、电平特性
定义单片机为TTL电平高5v、低0vRS232电平计算机的串口高-12v、低12v 故计算机与单片机之间通讯时需要加电平转换芯片max232
3、二进制数的逻辑关系
与或非!异或⊕相同为0不同为1
4、80C51系列介绍
以8051为基核开发出的CMOS工艺单片机产品统称为80C51系列。STC公司名89系列CCMOS522为内部存储空间大小2*48kRC40晶振频率C商业级-温度-PDIP封装格式072107年21周CV4336
5、80C51引脚封装
总线型四组每组8位。非总线型
6、C-51数据类型扩充定义
sfr特殊功能寄存器声明。sfr16sfr16位数据声明。sbit特殊功能位声明。bit位变量声明。
7、C-51包含的头文件
reg51.h定义特殊功能寄存器和位寄存器。math.h定义常用数学运算。
8、C-51的运算符
位右移位左移按位与|按位或^按位异或~按位取反
9、单片机主要掌握一下几点
最小系统能够运行起来的必要条件电源、晶振、复位电路程序从头执行。对单片机任意IO口的随意操作输出控制电平高低、输出检测电平高低。定时器重点掌握最常用的方式2。中断外部中断、定时器中断、串口中断。串口通信单片机之间、单片机与计算机间。
10、电路图符号表示
电阻R电容C电感L集成块/芯片U地GND电源VCC、AVDD、DVDD
三、LED模块
1、点亮一个LED
1.1、LED的位置 1.2、新建一个工程
新建一个工程。选择存放位置新建一个文件夹用于存放该工程。进入文件夹输入文件名即工程名。选择单片机的型号。选择Atmel下的AT89C52。本单片机使用的是STC89C52新建一个c语言程序文件。
1.3、LED原理图
下图红框区域相连接。LED右端接的是电源为高电平故左端为低电平即可导通。单片机默认输出高电平
1.4、单片机如何控制LED
P2寄存器的8位决定了LED的高低电平。1为高电平0为低电平。当为低电平时低于外部电压有电流通过点亮led。【注】51单片机所有IO口上电后默认全是高电平。例如控制第一个灯亮p2寄存器应为1111 1110。
1.5、进制转换
c语言中不能识别二进制应该转换为十六进制。例如 p21111 1110; // 错误p20xFE; // 正确前面0x表示十六进制。
1.6、编写代码
#include REGX52.H // 头文件定义特殊功能寄存器和位寄存器
void main(){P20xFE; // 1111 1110while(1); // 让程序停止在这不让main重复执行
}
1.7、设置生成.hex下载文件
设置完后编译程序生成.hex文件。
1.8、将.hex文件下载到单片机中
将单片机连接电脑串口。 打开STC-ISP程序选择hex文件点击下载。重启单片机成功点亮第一个led。
2、LED闪烁
新建工程和c语言程序文件与前相同。尝试点亮一个led再熄灭它。 #includeREGX52.H
void main(){while(1){P20xFE; // 亮P20xFF; // 灭}
} 结果led常亮并未闪烁。原因是led闪烁的频率过快人的肉眼无法捕捉。 使用STC-ISP生成延时函数。设置要与使用的单片机一致。 添加延时函数。 #includeREGX52.H
#inlcudeINTRINS.H // 引入nop函数
void Delay500ms() // 500ms延时函数
{unsigned char i, j, k;_nop_();i 4;j 205;k 187;do{do{while (--k);} while (--j);} while (--i);
}
void main(){while(1){P20xFE; // 亮Delay500ms(); // 延时500msP20xFF; // 灭Delay500ms();}
} 编译后下载程序到单片机LED灯以500ms的时间间隔闪烁。
3、LED流水灯
新建工程和c语言程序文件设置生成hex文件。编辑代码 #includeregx52.h
#inlcudeintrins.h // 引入nop函数
void Delay500ms() //500ms延时函数
{unsigned char i, j, k;_nop_();i 4;j 205;k 187;do{do{while (--k);} while (--j);} while (--i);
}
void main(){while(1){P20xFE; // 1111 1110Delay500ms(); // 延时500msP20xFD; // 1111 1101Delay500ms();P20xFB; // 1111 1011Delay500ms();P20xF7; // 1111 0111Delay500ms();P20xEF; // 1110 1111Delay500ms();P20xDF; // 1101 1111Delay500ms();P20xBF; // 1011 1111Delay500ms();P20x7F; // 0111 1111Delay500ms();}
} 编译后下载程序到单片机LED灯以500ms的时间间隔流动。原延时函数不方便不能随时更改延时时间重新编辑延时函数。先使用STC-ISP生成一个延时1ms的函数。C51数据类型为延时函数添加一个参数控制延时时间。 #includeregx52.h
void Delay(unsigned int xms) //带参延时函数
{unsigned char i, j;while(xms--){i 2;j 239;do{while (--j);} while (--i);}
}
void main(){while(1){P20xFE; // 1111 1110Delay(500); // 延时500msP20xFD; // 1111 1101Delay(500);P20xFB; // 1111 1011Delay(500);P20xF7; // 1111 0111Delay(500);P20xEF; // 1110 1111Delay(500);P20xDF; // 1101 1111Delay(500);P20xBF; // 1011 1111Delay(500);P20x7F; // 0111 1111Delay(500);}
} 带参数的延时函数更加灵活。
四、独立按键 1、独立按键控制LED亮灭
1.1、独立按键
相当于是一种电子开关按下时开关接通松开时开关断开实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开。
1.2、独立按键原理图
下图红框区域相连接。 1.3、编写代码
由原理图知K1由P3.1控制。 #includeregx52.h
void main(){//P20xFE;while(1){if(P3_10){ // K1按下P2_00; // 按位操作在regx52.h头文件中有声明}else{ // K1松开P2_01;}}
} K1按下LED亮K1松开LED灭。
2、独立按键控制LED状态
2.1、按键的抖动
对于机械开关当机械触点断开、闭合时由于机械触点的弹性作用一个开关在闭合时不会马上稳定地接通在断开时也不会一下子断开所以在开关闭合及断开的瞬间会伴随一连串的抖动。抖动会使对按键的判断产生一些误操作可以通过代码解决。
2.2、解决抖动并控制LED状态 #includeregx52.h
void Delay(unsigned int xms) //带参延时函数
{unsigned char i, j;while(xms--){i 2;j 239;do{while (--j);} while (--i);}
}
void main(){while(1){if(P3_10){ // K1按下// 防抖Delay(20);while(P3_10);Delay(20);P2_0~p2_0; // 取反}}
} 按下K1没反应松开K1灯亮按下K1无反应松开K1灯灭。
3、独立按键控制LED显示二进制 #includeregx52.h
void Delay(unsigned int xms)
{unsigned char i, j;while(xms--){i 2;j 239;do{while (--j);} while (--i);}
}
void main(){unsigned char Led_Num0; // 8位相当于寄存器的8位while(1){if(P3_10){ // K1按下// 防抖Delay(20);while(P3_10);Delay(20);Led_Num;P2~Led_Num; // 取反}}
} 每按一次按键8个LED显示对应的二进制。 如表示0000 0111。
4、独立按键控制LED移位 #includeregx52.h
void Delay(unsigned int xms) // 延时函数
{unsigned char i, j;while(xms--){i 2;j 239;do{while (--j);} while (--i);}
}
void main(){unsigned char Led_Num0;P2~0x01; // 初始化while(1){// K1按键左移if(P3_10){Delay(20);while(P3_10);Delay(20);Led_Num;if(Led_Num8) // 越界判断Led_Num0;P2~(0x01Led_Num);}// K2按键右移if(P3_00){Delay(20);while(P3_00);Delay(20);if(Led_Num0)Led_Num7;else Led_Num--;P2~(0x01Led_Num);}}
} 按下K1LED左移一个按下K2LED右移一个。
五、数码管 1、静态数码管显示
1.1、数码管介绍
数码管是一种简单、廉价的显示器是由多个发光极管封装在一起组成“8”字型的器件。
1.1.1、一位数码管
段的名称、引脚序号 共阴极连接、共阳极连接 例如让共阴极数码管显示6。 应该让A、C、D、E、F、G点亮。首先需要将38引脚接地即位选让某个数码管亮。控制7、4、2、1、9、10输出高电平即段选让数码管输出6。
1.1.2、四位一体数码管
引脚序号 连接方式 例如让共阴极数码管第3位显示1。 需要如下图所示。【注】同一时刻只能有一个位被选中显示数字或者4个位都显示相同的数字。静态
1.2、数码管原理图
上图左边74HC573为双向数据缓冲器来提高驱动能力。138译码器用来控制位选3位输入8位输出原理如下表。
1.3、编写代码
让第三位数码管显示6。 #includeregx52.hvoid main(){// 位选P2_41;P2_30;P2_21;// 段选P00x7D; // 0111 1101while(1);
} 1.4、引入函数 #includeregx52.h
//段选
unsigned char NixieTable[]{0x3F, 0x06, 0x5B, 0x4F,0x66, 0x6D, 0x7D, 0x07,0x7F, 0x6F, 0x77, 0x7C,0x39, 0x5E, 0x79, 0x71, 0x00
}
// 数码管显示函数
void Nixie(unsigned char Location, int Number){switch(Location){case 1: P2_41; P2_31; P2_21; break;case 2: P2_41; P2_31; P2_20; break;case 3: P2_41; P2_30; P2_21; break;case 4: P2_41; P2_30; P2_20; break;case 5: P2_40; P2_31; P2_21; break;case 6: P2_40; P2_31; P2_20; break;case 7: P2_40; P2_30; P2_21; break;case 8: P2_40; P2_30; P2_20; break;}P0NixieTable[Number];
}
void main(){Nixie(7,2);while(1);
}
2、动态数码管显示
2.1、数码管消影
现象数码管数字显示的位置错乱。动态数码管显示过程 位选 - 段选 - 位选 - 段选。。。原因速度太快数据串位。解决方法 位选 - 段选 - 清零 - 位选 - 段选。。。
2.2、编写代码 #includeregx52.h
// 延时函数
void Delay(unsigned int xms)
{unsigned char i, j;while(xms--){i 2;j 239;do{while (--j);} while (--i);}
}
//段选
unsigned char NixieTable[]{0x3F, 0x06, 0x5B, 0x4F,0x66, 0x6D, 0x7D, 0x07,0x7F, 0x6F, 0x77, 0x7C,0x39, 0x5E, 0x79, 0x71, 0x00
}
// 数码管显示函数
void Nixie(unsigned char Location, int Number){switch(Location){case 1: P2_41; P2_31; P2_21; break;case 2: P2_41; P2_31; P2_20; break;case 3: P2_41; P2_30; P2_21; break;case 4: P2_41; P2_30; P2_20; break;case 5: P2_40; P2_31; P2_21; break;case 6: P2_40; P2_31; P2_20; break;case 7: P2_40; P2_30; P2_21; break;case 8: P2_40; P2_30; P2_20; break;}P0NixieTable[Number];// 消影Delay(1);P00x00;
}
void main(){while(1){Nixie(1,1);//Delay(20);Nixie(2,2);//Delay(20);Nixie(3,3);//Delay(20);}
}
2.3、数码管驱动方式
单片机直接扫描硬件设备简单但会耗费大量的单片机CPU时间如上代码。专用驱动芯片内部自带显存、扫描电路单片机只需告诉它显示什么即可。TM1640芯片
六、模块化编程及LCD1602调试工具
1、模块化编程
把各个模块的代码放在不同的.c文件里在.h文件里提供外部可调用函数的声明其它.c文件想使用其中的代码时只需要#include xxx.h文件即可。使用模块化编程可极大的提高代码的可阅读性、可维护性、可移植性等。
1.1、案例
Delay.h #ifndef __DELAY_H__
#define __DELAY_H__void Delay(unsigned int xms);#endif 开头两句和最后一句代码是为了防止重复定义。在头文件中都有 #ifndef __XX_H__如果没有定义__XX_H__执行下列语句。#define __XX_H__定义__XX_H__。#endif与#ifndef匹配组成“括号”。Delay.c void Delay(unsigned int xms)
{unsigned char i, j;while(xms--){i 2;j 239;do{while (--j);} while (--i);}
} main.c #include Delay.hvoid main(){Delay(20);
}
1.2、注意事项
.c文件函数、变量的定义。.h文件可被外部调用的函数、变量的声明。任何自定义的变量、函数在调用前必须有定义或声明(同一个.c)。使用到的自定义函数的.c文件必须添加到工程参与编译。使用到的.h文件必须要放在编译器可寻找到的地方(工程文件夹根目录、安装目录、自定义)。
2、LCD1602调试工具
使用LCD1602液晶屏作为调试窗口提供类似printf函数的功能可实时观察单片机内部数据的变换情况便于调试和演示。
函数作用LCD_Init();初始化LCD_ShowChar(1,1,A);显示一个字符LCD_ShowString(1,3,Hello);显示字符串LCD_ShowNum(1,9,123,3);显示十进制数字LCD_ShowSignedNum(1,13,-66,2);显示有符号十进制数宇LCD_ShowHexNum(2,1,0xA8,2);显示十六进制数字LCD_ShowBinNum(2,4,0xAA,8);显示二进制数宇
待续。。。