赞
踩
目录
软件:Keil5,STC-ISP(推荐——有道词典“翻译报错语句”,福昕阅读器)
下载建议——直接点击课程下的网盘链接下载,若出错(如破解软件消失)
则可上B站搜索软件名字,会有下载安装教程视频,通常都有该软件的下载链接,
多数有汉化,破解插件,可多试几个
硬件:51单片机(STC89C52)淘宝购买
介绍——单片机算是一个袖珍版计算机,但在性能上,与计算机相差甚远。
运用——单片机成本低、体积小、结构简单,在生活和工业控制领域大有所用(智能仪表、实 时工控、通讯设备、导航系统、家用电器)。
——各种产品一旦用上了单片机,常在产品名称前冠以形容词——“智能型”。
学习目的——学习使用单片机是了解计算机原理与结构的最佳选择。
端口的号码在编程中有重要作用
十进制 | 二进制 | 十六进制 | 十进制 | 二进制 | 十六进制 |
0 | 0000 | 0 | 8 | 1000 | 8 |
1 | 0001 | 1 | 9 | 1001 | 9 |
2 | 0010 | 2 | 10 | 1010 | A |
3 | 0011 | 3 | 11 | 1011 | B |
4 | 0100 | 4 | 12 | 1100 | C |
5 | 0101 | 5 | 13 | 1101 | D |
6 | 0110 | 6 | 14 | 1110 | E |
7 | 0111 | 7 | 15 | 1111 | F |
单片机编程多采用二进制
类别 | 运算符 | 意义 | 类别 | 运算符 | 意义 |
算术 | + | 加 | 逻辑 | && | 逻辑与 |
- | 减 | || | 逻辑或 | ||
* | 乘 | ! | 逻辑非 | ||
/ | 除 | 位运算 | << | 按位左移 | |
% | 取余 | >> | 按位右移 | ||
= | 赋值 | & | 按位与 | ||
判断 | > | 大于 | | | 按位或 | |
>= | 大于等于 | ^ | 按位异或 | ||
< | 小于 | ~ | 按位取反 | ||
<= | 小于等于 | ||||
== | 等于 | ||||
!= | 不等于 |
a.上方工具栏选择“project”;
b.选择"New μvision";
c.在选择保存的地址后,新建一个文件夹放置编程产生的复数文件;
d.在跳出窗口中的“search”,处填写“AT89C52” (这是单片机的型号,但这是外国的软件,所以没有我们学的的STC89C52型,不过AT89C52与STC89C52的功能一致,选择AT89C52即可)
e.在接下来跳出的窗口选择“否”(意为复制启动文件到工程文件夹下,“是““否”皆可,但一般不对“启动文件”进行改动,所以一般选“否”。)
f.单击左侧工具栏文件夹“Taget 1”旁的加好,出现“Source group1”,对其进行右击,点击第二行
g.在跳出来的窗口处选择C语言,添加文件
h.点击红圈处
点击"output",勾选"Creat HEC File"(产生程序文件)
I.编写完毕后点击右上角处"",运行试错并产生文件(多次点击会覆盖之前的文件,且若文件出错则不会覆盖原文件)
打开 "stc-isp",点击”打开程序文件“,找到之前编写的程序,点击”下载/编程“,而后按压单片机开关
注:若出现右下对话框出现”链接不上单片机“,可仔细观察
处的型号(或问淘宝卖家),像我的就和老师的不符,是 STC89C52RC/LE52RC
又叫发光二级管
日常生活中的LED
实物: 记号:原理图:
单片机里的LED
实物: 原理图:
(保护电阻加LED)
编程通过“P2= ”来控制单片机
- #include <REGX52.H> //头文件,右击添加
-
- void main()
- {
- P2=0xFE; //1111 1110 //1表示灭,0表示亮,这个代码表示第8个LED发光
- while(1)
- {
-
- }
- }
- #include <REGX52.H>
- #include <INTRINS.H> /// 包含_nop_()函数的头文件,其实可以直接删掉_nop_()函数,//
- // 不添加该头文件,不影响程序效果//
-
-
- void Delay500ms() //延迟函数,延迟500毫秒,从stp-isp中添加,具体步骤见下文
- {
- unsigned char i, j, k;
-
- _nop_();
- i = 4;
- j = 205;
- k = 187;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
-
-
- void main()
- {
- while(1)
- {
- P2=0xFE; //1111 1110 //第八位LED亮
- Delay500ms();
- P2=0xFF; //1111 1111 //第八位LED灭
- Delay500ms();
- }
- }
添加void Delay500ms() 函数具体方法:
a.打开stp-isp,在右上工具栏找到“软件延时器”。
b.根据自己的单片机选择“系统频率”和“8051指令集”,若是“STC89C52RC”,则分别是“11.052”和“STC-Y1”,频率不知道的可以运行单片机后,看右下角.(这里若不成功,也可注意下选的是毫秒还是微秒)
c.复制程序,黏贴至keil5即可。
- #include <REGX52.H>
-
- void Delay1ms(unsigned int xms); // 自定义函数,放在末尾,前面进行使用时,需要进行声明
-
- void main()
- {
- while(1)
- {
- P2=0xFE; //1111 1110
- Delay1ms(1000);
- P2=0xFD; //1111 1101
- Delay1ms(1000);
- P2=0xFB; //1111 1011
- Delay1ms(100);
- P2=0xF7; //1111 0111
- Delay1ms(100);
- P2=0xEF; //1110 1111
- Delay1ms(100);
- P2=0xDF; //1101 1111
- Delay1ms(100);
- P2=0xBF; //1011 1111
- Delay1ms(100);
- P2=0x7F; //0111 1111
- Delay1ms(100);
- }
- }
-
- void Delay1ms(unsigned int xms) //可自定义延迟多少的延迟函数
- {
- unsigned char i, j; //但自定义的数字只能使1毫秒的整数倍
- while(xms)
- {
- i = 2;
- j = 239;
- do
- {
- while (--j);
- } while (--i);
- xms--;
- }
- }
按键介绍———相当于是一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开•轻触按键
三个按键从左到右分别使P3_1,P3_0,P3_2,P3_3
- #include <REGX52.H>
-
- void main()
- {
- while(1)
- {
- if(P3_1==0 || P3_0==0) //如果K1按键或K2按键按下
- {
- P2_0=0; //LED1输出0,点亮
- }
- else
- {
- P2_0=1; //LED1输出1,熄灭
- }
- }
- }
关于按键的抖动:对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动
- #include <REGX52.H>
-
- void Delay(unsigned int xms)
- {
- unsigned char i, j;
- while(xms)
- {
- i = 2;
- j = 239;
- do
- {
- while (--j);
- } while (--i);
- xms--;
- }
- }
-
- void main()
- {
- while(1)
- {
- if(P3_1==0) //如果K1按键按下
- {
- Delay(20); //延时消抖
- while(P3_1==0); //松手检测
- Delay(20); //延时消抖
-
- P2_0=~P2_0; //LED1取反
- }
- }
- }
- #include <REGX52.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 LEDNum=0;
- while(1)
- {
- if(P3_1==0) //如果K1按键按下
- {
- Delay(20); //延时消抖
- while(P3_1==0); //松手检测
- Delay(20); //延时消抖
-
- LEDNum++; //变量自增 //若直接P2++,则会溢出
- P2=~LEDNum; //变量取反输出给LED
- }
- }
- }
- #include <REGX52.H>
- void Delay(unsigned int xms);
-
- unsigned char LEDNum;
-
- void main()
- {
- P2=~0x01; //上电默认LED1点亮
- while(1)
- {
- if(P3_1==0) //如果K1按键按下
- {
- Delay(20);
- while(P3_1==0);
- Delay(20);
-
- LEDNum++; //LEDNum自增
- if(LEDNum>=8) //限制LEDNum自增范围
- LEDNum=0;
- P2=~(0x01<<LEDNum); //LED的第LEDNum位点亮
- }
- if(P3_0==0) //如果K2按键按下
- {
- Delay(20);
- while(P3_0==0);
- Delay(20);
-
- if(LEDNum==0) //LEDNum减到0后变为7
- LEDNum=7;
- else //LEDNum未减到0,自减
- LEDNum--;
- P2=~(0x01<<LEDNum); //LED的第LEDNum位点亮
- }
- }
- }
-
- void Delay(unsigned int xms)
- {
- unsigned char i, j;
- while(xms--)
- {
- i = 2;
- j = 239;
- do
- {
- while (--j);
- } while (--i);
- }
- }
介绍:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件
实物图:
单片机:
原理图:(左边的为共阴级,右方的为共阳级)
点亮二极管(以共阴级的为例):3.8(即公共端或阴级)处连接低电频或者接地,下方引脚接
高电频,即赋值(1),则可点亮对应二极管
下方引脚对应图:
e.g若要使形状“6”,则编写P0=0x7D即0111 1101(原理图是从右往左读图)
单片机的数码管是四个一起的:
其原理图是这样的:
在工作中“动态数码管模块”与"EEPROM模块"共同控制数码管
EEPROM模块如图:
它的几个左段口在编程中分别表示为:P2_4;P2_3;P2_2
这三个组合在一起,控制八个共阴极即(DIG1,DIG2,DIG3,DIG4),是否接地
第1个亮:P2_4=1;P2_3=1;P2_2=1;
第2个亮:P2_4=1;P2_3=1;P2_2=0;
第3个亮:P2_4=1;P2_3=0;P2_2=1;
第4个亮:P2_4=1;P2_3=0;P2_2=0;
第5个亮:P2_4=0;P2_3=1;P2_2=1;
第6个亮:P2_4=0;P2_3=1;P2_2=0;
第7个亮:P2_4=0;P2_3=0;P2_2=1;
第8个亮:P2_4=0;P2_3=0;P2_2=0;
- #include <REGX52.H>
-
- //数码管段码表
- unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
-
- //数码管显示子函数
- void Nixie(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=NixieTable[Number]; //段码输出
- }
-
- void main()
- {
- Nixie(2,3); //在数码管的第2位置显示3
- while(1)
- {
-
- }
- }
- #include <REGX52.H>
-
- //数码管段码表
- unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
-
- //延时子函数
- void Delay(unsigned int xms)
- {
- unsigned char i, j;
- while(xms--)
- {
- i = 2;
- j = 239;
- do
- {
- while (--j);
- } while (--i);
- }
- }
-
- //数码管显示子函数
- void Nixie(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=NixieTable[Number]; //段码输出
- Delay(1); //显示一段时间
- P0=0x00; //段码清0,消影
- }
-
- void main()
- {
- while(1)
- {
- Nixie(1,1); //在数码管的第1位置显示1
- // Delay(20);
- Nixie(2,2); //在数码管的第2位置显示2
- // Delay(20);
- Nixie(3,3); //在数码管的第3位置显示3
- // Delay(20);
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。