上周焊板子焊到头晕的电路实训课终于结束了,至于这周呢,就是为单片机设计程序了。按照老师的计划,这次实训不会教太深奥的内容,只要入门就够了。
之后在交谈中得知,其实老师也很讨厌这种事。据说在她刚到单位工作时,按规定要参加三个月的培训,主要是为了熟悉单位的管理制度。在第一个月里干的是检查回流焊机筛选下来的残次品,找出不合格的地方,用电烙铁手动焊到正确的地方。
因为对多数人来说是第一次使用Keil,首先要安装开发环境。需要的软件和工具包在keil网站都有下载。顺便还有最重要的密钥生成器(学校不提供正版Keil没办法啊):
官方下载页面:https://www.keil.com/download/product/
c51v952下载:http://pan.baidu.com/s/1F0bFS
MDK5.00下载:http://pan.baidu.com/s/1nFHuJ
STC程序下载软件:http://www.stcmcu.com/STCISP/stc-isp-15xx-v6.63.exe
这次实训要用到的关键字似乎只有一个:
sbit:定义特殊功能寄存器的位变量
e.g.
sbit a = P0^1;
sbit P1 = 0xff;
在为C51编程时必须要包含REG51.H文件。在这个文件中包含对单片机各种端口和地址的定义,不包含的话程序很可能运行不了。
学了这么多该写个程序练习一下了。就从最简单且最常用的延时函数开始写起。
为了直观的体验延时函数的作用,我们要求使开发板上的一个二极管以肉眼可分辨的频率有规律的闪烁。那么在编程之前先观察单片机获得一些必要的信息:
1、用来练习的单片机是这样的:
2、选定一个输出信息的二极管:
决定选P17,因为看起来最好找。
3、记录晶震的工作频率:
显然是12.000MHz
OK,接下来要设置Keil中的一些参数:
点击Target Options:
在这里填入晶震参数:
选中Create HEX File,等下要用外部工具下载程序。
好的,接下来就可以建工程写代码了
1、如果没有STC8051CPU参数可选的话就用Atmel的AT89C51;
2、建立必要的文件:
3、敲代码:
FDdelay.h
#include <REG51.h>
void FDdelay(unsigned int delayTime);
FDdelay.c
void FDdelay(unsigned int delayTime){ // 看上去可以工作的延时函数
unsigned int i, j;
for(i = 0; i < delayTime; i++){
for(j = 0; j < 120; j++);
}
}
delayTest.c
#include "FDdelay.h"
sbit a = P1^7;
void main(){ // 测试函数
for(;;){
a = 1;
FDdelay(500);
a = 0;
FDdelay(500);
}
}
代码写完了,编~译……成功~
打开STC下载软件下载编好的程序:
选好要下载的程序后点击"下载/编程";
这时重新开关单片机开关,如果不出意外的话,会出现这个提示:
P17一闪一闪的好好看。
------------第一天实训结束-----------------
第二天实训一开始就复习了下很基本的东西……算了写一下吧:
1、reg51.h是单片机51系列必须的头文件;
2、进行位定义 sbit A= P0^1;
3、要使用无符号数据类型保证程序不会出错;
4、宏定义 #define 标识符 字符串;
5、要使用for(;;) 或者 while(1)语句是程序连续执行;
6、端口赋值语句 端口名 = 参数; P1 = 0xFF;
7、比较器工作方式:
#include <reg52.h>
/*
0 = open
1 = close
光敏电阻:
光强越大,电流越强
光强越小,电流越弱
假设:
开发板的按键按下为有光,抬起为无光;
开发板的LED亮起为电机启动,灭掉为电机停机。
*/
const unsigned int open = 0;
const unsigned int close = 1;
const unsigned int light = 0;
const unsigned int dark = 1;
sbit lightLeft = P2^0;
sbit lightRight = P2^1;
sbit powerLeft = P1^7;
sbit powerRight = P1^6;
void delay(unsigned int time){
unsigned int i, j;
for(i = 0; i < time; i++){
for(j = 0; j < 110; j++);
}
}
void main(){
for(;;){
if(lightLeft == light && lightRight == light){
powerLeft = open;
powerRight = open;
}
if(lightLeft == dark && lightRight == dark){
powerLeft = close;
powerRight = close;
}
if(lightLeft == dark && lightRight == light){
powerLeft = open;
powerRight = close;
delay(500);
powerLeft = close;
}
if(lightLeft == light && lightRight == dark){
powerLeft = close;
powerRight = open;
delay(500);
powerRight = close;
}
}
}
uint LED_2 = 0x40;
uint LED_3 = 0x20;
uint LED_4 = 0x10;
uint CHAR_1 = 0x9f;
uint CHAR_2 = 0x25;
uint CHAR_3 = 0x0d;
uint CHAR_4 = 0x99;
uint CHAR_5 = 0x49;
uint CHAR_6 = 0x41;
uint CHAR_7 = 0x1f;
uint CHAR_8 = 0x01;
uint CHAR_9 = 0x09;
uint CHAR_DOT = 0xfe;
#include <reg51.h>
#define uint unsigned int;
// delay function
void delay(unsigned int time){
int i;
for(i = 0; i < time; i++);
}
// end delay function
/*
显示位选择
*/
uint LED[4] = {0x80, 0x40, 0x20, 0x10};
/*
uint LED_1 = 0x80;
uint LED_2 = 0x40;
uint LED_3 = 0x20;
uint LED_4 = 0x10;
*/
/*
数字选择
*/
uint CHAR[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};
/*
uint CHAR_0 = 0x03;
uint CHAR_1 = 0x9f;
uint CHAR_2 = 0x25;
uint CHAR_3 = 0x0d;
uint CHAR_4 = 0x99;
uint CHAR_5 = 0x49;
uint CHAR_6 = 0x41;
uint CHAR_7 = 0x1f;
uint CHAR_8 = 0x01;
uint CHAR_9 = 0x09;
uint CHAR_DOT = 0xfe;
*/
/*
端口设定
*/
// disp number to SEG7
void disp(int j, int k){
int count;
for(count = 0;count < 500; count++){
P2 = LED[0];
P0 = CHAR[j];
delay(100);
P2 = LED[1];
P0 = CHAR[k];
delay(100);
}
}
// end disp number to SEG7
void main (){
for(;;){
int j, k;
// count number 0 to 99
for(j = 0; j < 10; j++){
for(k = 0; k < 10; k++){
disp(j, k);
}
}
// end count number 0 to 99
/* test code
P2 = LED[0];
P0 = CHAR[3];
delay(50);
P2 = LED[1];
P0 = CHAR[5];
delay(50);
*/
}
}
以上就是本次实训全部内容。至于各种琐事就不必提了。