单片机跑马灯实验报告-叶坤
单片机跑马灯(流水灯)控制实验报告

单片机跑马灯(流水灯)控制实验报告实验目的:本实验旨在通过使用单片机对LED灯进行控制,实现跑马灯(流水灯)的效果,同时熟悉单片机编程和IO口的使用。
实验器材:1)STC89C52单片机2)最基本的LED灯3)面包板4)若干跳线实验过程:1.硬件连接:将单片机的P2口与面包板上的相应位置连接,再将LED灯接入面包板中。
2.编写程序:按照题目要求编写所需程序。
3.单片机烧录:将程序烧录进单片机中,即可实现跑马灯效果。
程序详解:1. 由于LED灯是呈现亮灭效果,我们要编写程序来控制LED的亮灭状态。
2. 在程序中,我们通过P2口控制LED灯的亮灭状态。
例如,若要让LED1亮,我们就将P2口的第一个引脚设置为低电平(0),此时LED1就会发光。
同样地,若要LED2,LED3等依次点亮,则需要将P2口的第二个、第三个引脚设置为低电平,依此类推即可。
3. 接下来,我们要实现每个LED灯的亮灭时间间隔,并实现跑马灯的效果。
4. 在本实验中,我们采用了计时器中断的方式来实现灯光的控制,即在定时器中断函数中对P2口进行控制,这样可以方便地控制灯亮灭时间和亮度。
通过改变定时器中断的时间,可以改变LED灯的亮灭时间;通过改变P2口的控制顺序,可以实现跑马灯效果。
5. 整个程序比较简单,具体的代码实现可以参考以下程序:#include <REG52.H>#include <intrins.h>#define uint unsigned int #define uchar unsigned char void Delay1ms(uchar _ms); void InitTimer0();sbit led1=P2^0;sbit led2=P2^1;sbit led3=P2^3;sbit led4=P2^4;sbit led5=P2^5;sbit led6=P2^6;sbit led7=P2^7;void InitTimer0(){TMOD=0x01;TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1;ET0=1;TR0=1;}void Timer0() interrupt 1 {static uint i;TH0=(65536-50000)/256; TL0=(65536-50000)%256;i++;if(i%2==0){led1=~led1;}if(i%4==0){led2=~led2;}if(i%6==0){led3=~led3;}if(i%8==0){led4=~led4;}if(i%10==0){led5=~led5;}if(i%12==0){led6=~led6;}if(i%14==0){led7=~led7;}}void Delay1ms(uchar _ms){uchar i;while(_ms--){i=130;while(i--);}}实验总结:通过本次实验,我们掌握了单片机控制跑马灯(流水灯)的方法,对单片机编程和IO 口的使用有了更深入的了解。
单片机跑马灯实训报告

4、彩灯仿真图,如图4-4所示。
图4-4彩灯仿真图
5、彩灯布局图,如图4-5所示。
图4-5彩灯布局图
五、焊接电路
按电路装配图,如图5-1。按顺序将元器件焊接到万能板上,并用导线对其进行连接,然后对其进行检测。
图5-1电路装配图
六、程序流程:
实现小灯随开关闭合亮的程流程图,如图6-1所示。
P1 口是一个内部提供上拉电阻的 8 位双向 I/O 口, 口缓冲器嫩接收输出 4TTL 门电流。 P1口管脚写入 1 后,被内部上拉高,可用作输入,P1 口被外部下拉为低电平时,将输出电 流,这是由于内部上拉的缘故。在 FLASH 编程和校验时,P1 口作为第八位地址接收。
P2 口为一个内部上拉电阻的 8 位双向 I/O 口,P2 缓冲器可接收,输出 4 个 TTL 门电流, 当 P2 口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入是,“1”P2 口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2 口当用于外部程序存 储器或 16 位地址外部数据存储器进行存取时,P2 口输出地址高八位。在给出地址“1”时它利用内部上位优势,当对外部八位地址数据存储器进行续写时,P2 口输出其特殊功能 寄存器的内容。P2 口在 FLASH 编程和校验时接收高八位地址信号和控制信号。
图6-1流程图
七、跑马灯程序:
ORG 00H
LJMP START
ORG 30H
START:MOV A,#0FEH
LOOP:MOV P1,A
LCALL DELAY
RL A
LJMPLOOP
DELAY:MOV R5,#5
D1: MOV R6,#200
D2: MOV R7,#250
单片机跑马灯(流水灯)控制实验报告

单片机实验报告姓名: 学号:一、 实验实现功能:1:计数器功能2:流水灯二、 具体操作:1、计数器功能数码管的动态显示。
每按一次K2键计数器加1通过数码管显示出来,计数器可以实现从0计数到9999。
2、流水灯当在计数器模式下的时候按下K3键时程序进入跑马灯模式,8个小灯轮流点亮每次只点亮一个,间隔时间为50ms 。
三、 程序流程图开始 定时器T0 设置初值,启动定时器,打开中断复位 Key2按下 中断关闭 计数器模式 计数器加1 Key3按下 流水灯模式 数码管显示数字加1 跑马灯点亮间隔50ms Key1按下中断打开四、程序#include <reg51.h>typedef unsigned char uint8;typedef unsigned int uint16; //类型定义sbit P2_1 = P2^1;sbit P2_2 = P2^2;sbit P2_3 = P2^3;sbit P2_4 = P2^4; //位声明四个数码管开关sbit Key2 = P3^2;sbit Key3 = P3^3; //位声明2个按键K2和K3sbit Ledk = P2^0 ; //LED 开关void delay(uint16 i); //延时函数声明void refresh (); // 数码管刷新函数声明void liushuideng(); //流水灯函数声明uint8 number[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//数码管的真值表uint8 out[4] = {0}; // 数组变量uint16 counter=0; //用作计数器的变量uint16 Time_counter=0; //用作定时器的变量void main() //主函数{TMOD = 0x01; //定时器0,工作方式一TH0 = 0xFC;TL0 = 0x18; //定时器初值使每次循环为1msTR0 = 0; //定时器0开始作ET0 = 0; // 定时器中断关EA = 0; // 关中断while(1) //计数器模式{Ledk =1 ; //led开关关out[0]=number[counter%10]; //取个位out[1]=number[counter%100/10]; //十位out[2]=number[counter%1000/100]; //百位out[3]=number[counter/1000]; //千位if (!Key2) //计数器加1{++counter; //自加out[0]=number[counter%10]; //取个位out[1]=number[counter%100/10]; //十位out[2]=number[counter%1000/100]; //百位out[3]=number[counter/1000]; //千位while(!Key2) //等待键盘抬起refresh(); //刷新数码管}refresh(); //刷新数码管if (!Key3) // 进入跑马灯模式liushuideng();}} //主函数结束/*******************延时*************/void delay(uint16 i){uint8 j; // 定义局部变量for(i;i>0;i--) //循环i*240 次for(j=240;j>0;j--);}/************数码管刷新******************/void refresh (){uint8 j;for (j=0;j<4;j++) //四次循环刷新数码管{switch(j){case 0: P2_1=1;P2_2=1;P2_3=1;P2_4=0;break;case 1: P2_1=1;P2_2=1;P2_3=0;P2_4=1;break;case 2: P2_1=1;P2_2=0;P2_3=1;P2_4=1;break;case 3: P2_1=0;P2_2=1;P2_3=1;P2_4=1;break;//每次循环只选中一个数码管default:break;}P0 = out[j]; // 位选,给数码管送值delay (20); //延时消抖}}/*************定时器的中断服务函数**************/void Timer0_Overflow() interrupt 1 //定时器0溢出中断,这个语句1ms执行一次{TH0 = 0xFC;TL0 = 0x18; //每1ms重新赋定时器初值Time_counter++; //计数,看经过了几个1ms}/***********************流水灯子函数****************************/ void liushuideng(){uint8 j = 0 ; //定义局部变量P0 = 0xff; // 小灯全关TR0 = 1; //定时器1开始计时EA = 1; //中断开放ET0 = 1; //定时器0中断开while(1){Ledk = 0 ; //打开LED开关P2 = P2|0x1E; //关掉数码管if(50 == Time_counter) //50个毫秒{P0=~(1<<j++); //控制小灯Time_counter = 0; //清零开始下一次循环定时}if (8==j) //移完8次再重新移{j=0;}}}。
单片机 跑马灯实验

void hold(){
n=8;
while(1){
if(P2==K[4]){//一直按着K4键,逆序点亮跑马灯
oldK=K[4];
if(n==-1)n=7;//D0灯亮后点亮D7
while(n>=0){
out=D[n];
n--;
if(delay4(15))break;
}
}
if(P2==K[0]){//未按下K4键,一直正序点亮跑马灯
void hold(){
n=8;
while(1){
if(P2==K[4]){//一直按着K4键,逆序点亮跑马灯
oldK=K[4];
if(n==-1)n=7;//D0灯亮后点亮D7
while(n>=0){
out=D[n];
n--;
if(delay4(15))break;
}
}
if(P2==K[0]){//未按下K4键,一直正序点亮跑马灯
图43键控的流水灯
五、实验思考题
1、采用I/O口作为输出口时要考虑哪些因素?为什么实验装置中LED要串联一个电阻?
当作为输出口时候就是单片机向外发出数据,或者再产生拉电流,单片机的拉电流一般要比灌电流小,基本上就能点亮2,3个LED,功率很有限,所以一般时候必须用驱动芯片来驱动单片机的外围器件。串联电阻是为了保护电路。
while(1){//开机即正序点亮流水灯
forward();
if(P2!=K[0]){
break;
}
}
while(1){
out=AllOff;
if((P2&0x0f)!=0x0f){//检测有键按下
delay10ms();//延时10ms再去检测
跑马灯单片机实训报告

一、前言随着科技的不断发展,单片机技术在各个领域得到了广泛的应用。
为了提高我们的实践能力,加强理论知识与实际操作的结合,我们进行了单片机跑马灯实训。
通过本次实训,我们深入了解了单片机的基本原理,掌握了单片机的编程方法,并能够运用所学知识解决实际问题。
二、实训目的1. 熟悉单片机的硬件结构和工作原理。
2. 掌握单片机的编程方法,包括汇编语言和C语言。
3. 学会使用单片机进行简单的外设控制。
4. 提高动手能力和团队合作能力。
三、实训内容1. 实训设备(1)8051单片机开发板(2)LED灯(3)电阻(4)电源2. 实训步骤(1)搭建电路首先,我们需要搭建跑马灯的电路。
将LED灯串联,然后连接到单片机的P1口。
在LED灯的正极和负极之间串联一个电阻,用于限流。
(2)编写程序接下来,我们需要编写跑马灯的程序。
以下是用C语言编写的跑马灯程序:```c#include <reg51.h>#define LED P1void delay(unsigned int ms) {unsigned int i, j;for (i = 0; i < ms; i++)for (j = 0; j < 1275; j++);}void main() {while (1) {LED = 0x01; // 第一个LED灯亮 delay(500); // 延时LED = 0x02; // 第二个LED灯亮 delay(500); // 延时LED = 0x04; // 第三个LED灯亮 delay(500); // 延时LED = 0x08; // 第四个LED灯亮 delay(500); // 延时LED = 0x10; // 第五个LED灯亮 delay(500); // 延时LED = 0x20; // 第六个LED灯亮 delay(500); // 延时LED = 0x40; // 第七个LED灯亮 delay(500); // 延时LED = 0x80; // 第八个LED灯亮 delay(500); // 延时LED = 0x00; // 所有LED灯熄灭delay(500); // 延时}}```(3)编译程序将编写的程序导入到单片机开发板中,并下载到单片机中。
跑马灯实验--实习训练报告暨教案

课题:跑马灯实验成绩:
班级:姓名:同组姓名:
组别:编号:日期:指导教师:
一、实训目的
1.练习和掌握C语言循环语句的使用;
2.掌握电路的连接和工作原理;
3.练习调试程序。
二、实训设备
四、电路原理图及操作步骤三、程序清单
五、 实训总结
1、实训有关数据、现象的记录及分析;
8只LED 灯从低位向高位轮流发光,不断循环往复。
2、思考题;
完成P3口各引脚与第二功能表:
3、实训过程中出现的问题及其分析和解决方法;
LED 灯只一个发光、熄灭循环,并不轮流发光,经检查未使用移位指令。
单片机 跑马灯实验精选全文

可编辑修改精选全文完整版实验一跑马灯实验一、实验内容1、基本的流水灯根据图1电路,编写一段程序,使8个发光二极管D1、D2、D3、D4、D5、D6、D7、D8顺序(正序)点亮:先点亮D1,再点亮D2、D3……D8、D1……,循环点亮。
每点亮一个LED,采用软件延时一段时间。
2、简单键控的流水灯不按键,按正序点亮流水灯;按下K1不松手,按倒序点亮流水灯,即先点亮D8,再顺序点亮D7、D6……D1、D8……。
松手后,又按正序点亮流水灯。
3、键控的流水灯上电,不点亮LED,按一下K1键,按正序点亮流水灯。
按一下K2键,按倒序点亮流水灯,按一下K3键,全部关闭LED。
二、实验方案1、总体方案设计考虑到K4键未被使用,所以将实验内容中的三项合并到一个主函数中:K4键代替实验内容第二项中的K1键;单片机一开机即执行实验内容第一项;K1、K2、K3键实现实验内容第三项。
所用硬件:AT89C52、BUTTON、LED-BLUE、电源输入:P2.0-K1;P2.1-K2;P2.2-K3;P2.3-K4。
低电平有效输出:P0.0~P0.7-D0~D7。
LED组连线采用共阳极,低电平有效软件设计:软件延时采用延时函数delay(t),可调整延迟时间:void delay(uint t){uint i;while(t--)for(i=0;i<1000;i++){if(P2!=oldK&&P2!=K[0])break;//按下了其他键退出循环}}由于涉及到按键变化所以要设置一个变量oldK保留按键键值,要在延时程序中检测是否按键,当按键后立即设置oldK的值。
按键判断采用在while循环中利用条件语句判断P2的值然后执行该键对应的代码段,达到相应的响应。
为了让K4键的效果优化,即状态变化从当前已亮灯开始顺序点亮或逆序点亮,利用全局变量n来记录灯号,利用算法即可实现。
主要算法:1、全局变量的定义:uchar D[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0X7f};//单个LED亮uchar AllOff=0xff;//LED全灭uchar AllOn=0x00;//LED全亮uchar K[]={0xff,0xfe,0xfd,0xfb,0xf7};//按键开关uchar oldK;//记录已按键int n;2、顺序、逆序点亮流水灯:void forward(){for(n=0;n<=7;n++){out=D[n];delay(15);if(P2!=oldK&&P2!=K[0])break;}out=AllOff;}void backward(){for(n=7;n>=0;n--){out=D[n];delay(15);if(P2!=oldK&&P2!=K[0])break;}out=AllOff;}3、实验内容第二项流水灯灯亮顺序变换:void hold(){n=8;while(1){if(P2==K[4]){//一直按着K4键,逆序点亮跑马灯oldK=K[4];if(n==-1)n=7; //D0灯亮后点亮D7while(n>=0){out=D[n];n--;if(delay4(15))break;}}if(P2==K[0]){//未按下K4键,一直正序点亮跑马灯oldK=K[0];if(n==8)n=0;//D7灯亮后点亮D0while(n<=7){out=D[n];n++;if(delay4(15))break;}}if(P2!=K[4]&&P2!=K[0]){//按下了其他键,退出hold函数break;}}}4、对应实验内容第一项,开机顺序点亮流水灯:while(1){//开机即正序点亮流水灯forward();if(P2!=K[0]){break;}}2、实验原理图图2-1 实验原理图3、程序流程图图2-2 程序流程图三、源程序#include"reg51.h"#define uchar unsigned char#define uint unsigned int#define out P0uchar D[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0X7f};//单个LED亮uchar AllOff=0xff;//LED全灭uchar AllOn=0x00;//LED全亮uchar K[]={0xff,0xfe,0xfd,0xfb,0xf7};//按键开关uchar oldK;//记录已按键int n;//记录当前亮的灯号void delay(uint t){uint i;while(t--)for(i=0;i<1000;i++){if(P2!=oldK&&P2!=K[0])break;//按下了其他键退出循环}}void delay10ms(){uint i;for(i=0;i<10000;i++);}void forward(){for(n=0;n<=7;n++){out=D[n];delay(15);if(P2!=oldK&&P2!=K[0])break;}out=AllOff;}void backward(){for(n=7;n>=0;n--){out=D[n];delay(15);if(P2!=oldK&&P2!=K[0])break;}out=AllOff;}int delay4(uint t){uint i;while(t--)for(i=0;i<1000;i++){if(P2!=oldK){ //按键变化退出循环return 1;}}return 0;}void hold(){n=8;while(1){if(P2==K[4]){//一直按着K4键,逆序点亮跑马灯oldK=K[4];if(n==-1)n=7; //D0灯亮后点亮D7while(n>=0){n--;if(delay4(15))break;}}if(P2==K[0]){//未按下K4键,一直正序点亮跑马灯oldK=K[0];if(n==8)n=0;//D7灯亮后点亮D0while(n<=7){out=D[n];n++;if(delay4(15))break;}}if(P2!=K[4]&&P2!=K[0]){//按下了其他键,退出hold函数break;}}}void main(){oldK=K[0];while(1){//开机即正序点亮流水灯forward();if(P2!=K[0]){break;}}while(1){out=AllOff;if((P2&0x0f)!=0x0f){//检测有键按下delay10ms();//延时10ms再去检测//P2.0_K1键按下正序点亮流水灯if(P2==K[1]){oldK=K[1];while(1){forward();if(P2!=K[1]&&P2!=K[0]){//按下了其他键,退出break;}}}//P2.1_K2键按下逆序点亮流水灯if(P2==K[2]){while(1){backward();if(P2!=K[2]&&P2!=K[0]){//按下了其他键,退出break;}}}//P2.2_K3键按下关闭全部LEDif(P2==K[3]){oldK=K[3];out=AllOff;}//P2.3_K4键按下长按逆序点亮流水灯,不按正序点亮流水灯,直到其他键按下停止if(P2==K[4]){hold();}}}}四、实验结果1、基本的流水灯:开机后即重复顺序点亮流水灯,等待其他按键。
单片机实验报告

单片机实验报告班级:姓名:学号:日期:实验一:跑马灯实验实验目的:1.通过实验,掌握汇编语言程序的基本格式及其编写;2.通过实验,熟悉指令系统,掌握查表指令及其应用;3.通过实验,掌握子程序及延时子程序的编写;4.通过实验,掌握中断的概念及其定时器的应用实验内容:1.键入跑马灯的代码:#include<iom16v.h>void delay_ms(unsigned int time){unsigned int k,l;for(k=0;k<time;k++)for(l=0;l<1141;l++);}void main(void){ unsigned char i,j;PORTC=0x00;DDRC=0xFF;while(1){ j=0x02;for(i=0;i<7;i++) //8个流水灯逐个闪动{PORTC=j;delay_ms(25); //调用延时函数j<<=1;}j=0x40;for(i=0;i<7;i++) //8个流水灯反向逐个闪动{PORTC=j;delay_ms(25); //调用延时函数j>>=1;}}}2.通过ISIS7 模拟单片机3..将代码通过ATMEGA16 实现跑马灯的运行。
4.在ISIS7中运行。
实验结果:8个灯能够一次从右到左,再从左到右间隔100ms亮起。
实验问题:一开始代码正确但是当键入到ATMEGA16时8个灯不能亮起,1)电阻太大而模拟的电流太小;2)delay_ms的子代码设定的时间太短。
但是可以通过修改时钟频率可以对硬件进行时间脉冲修改。
实验二:键盘扫描实验目的:1.熟悉键盘与显示器的接口连接方法。
1.掌握键盘扫描的实现过程。
实验内容:1.键入代码:#include<iom16v.h>void delay_ms(int x){int i,j;for(i=0;i<=x;i++)for(j=0;j<=5000;j++){}}char cycle(){char jianzhi;PORTA=0xf0; //行输出低电平,列带上拉电阻输入DDRA=0x0F;delay_ms(15);if(PINA==0xf0) //检查有无键按下,无键按下返回0XFF return(0xff);if(PINA==0x70) //获取按下键的行编码jianzhi=1;else if(PINA==0xb0) //四行三列jianzhi=2;else if(PINA==0xd0)jianzhi=3;else if(PINA==0xe0)jianzhi=4;PORTA=0x0f; //反转DDRA=0xf0;delay_ms(15);if(PINA==0x0D)jianzhi=jianzhi+0;else if(PINA==0x0B)jianzhi=jianzhi+4;else if(PINA==0x07)jianzhi=jianzhi+8;return(jianzhi);}void main(){DDRD=0XFF;PORTD=0X00;DDRB=0XFF;PORTB=0X00;while(1){int jianzhi=cycle();switch(jianzhi){case 1:PORTB=0X00;PORTD=0X01;break;case 2:PORTB=0X00;PORTD=0X02;break;case 3:PORTB=0X00;PORTD=0X04;break;case 4:PORTB=0X00;PORTD=0X08;break;case 5:PORTB=0X00;PORTD=0X10;break;case 6:PORTB=0X00;PORTD=0X20;break;case 7:PORTB=0X00;PORTD=0X40;break;case 8:PORTB=0X00;PORTD=0X80;break;case 9:PORTD=0X00;PORTB=0X01;break;case 10:PORTD=0X00;PORTB=0X02;break;case 11:PORTD=0X00;PORTB=0X04;break;case 12:PORTD=0X00;PORTB=0X08;break;}}}2.通过ISIS7模拟连接电路:3.带入代码,运行程序,点击每个键盘按钮在右边的LED灯处显示所按得键盘号。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机实验报告—Delay函数和中断系统实现跑马灯14级通信2班叶坤学号:201400800679
一、硬件组成介绍
1、最小系统
STC12C5A16S2单片机、开发板、12兆的晶振、电源。
2、其他
共有40个引脚,两个外部中断,两个定时器,一个串行口中断。
四个独立按键,四个数码管,一个蜂鸣器,还有一块拓展区域,可作为日后拓展功能使用,开发单片机的更多功能。
二、软件开发流程
1、新建工程
打开Keil软件,点击“Project | New Project…”,弹出一个名为“Create New Project”的对话框。
然后选择一个合适的文件夹准备来存放工程文件。
2、选择CPU
Keil提示选择CPU 器件。
选中ATMEL中的89c52即可。
接下来弹出一个对话框。
该对话框提示是否要把标准8051 的启动代码添加到工程中去,一般选择“否”。
3、新建一个.c文件
点击新建文件,将文件名改为“text.c”,然后保存在合适的文
件夹里。
扩展名“.c”不可省略。
4、添加源程序文件到工程中
一个空的源程序文件“text.c”已经建立,但是这个文件与刚才新建的工程之间并没有什么内在联系,因此我们需要把它添加到工程中去。
单击Keil软件左边项目工作窗口“Target 1 ”上的“+”,将其展开。
然后右击“Source Group 1”文件夹,会弹出选择菜单。
单击其中的“Add Files to Group 'Source Group 1' ”项。
这时,对话框内将出现刚才保存过的“text.c”。
双击文件“text.c”,这时,源程序文件“text.c ”已经出现在项目工作窗口的“Source Group 1 ”文件夹内。
5、设计和编辑C语言程序
单根据实验要求编辑C语言程序,并且通过反复的编译和调试以确保程序的正确性。
编辑“text.c ”文件,然后点击“Project”中的“compile”,根据运行结果调试程序,以达到目的。
6、勾选产生.hex文件
单击Keil C51 工具栏的“”图标,弹出名为“Options for Target ‘Target 1’ ”的对话框。
单击“Output”标签页,选中“Create HEX File”项,然后“确定”。
7、仿真调试
用鼠标左键单击菜单命令“Debug”→ “Start/Stop Debug
Session”,单击菜单命令“Peripheral”→
“I/O-Ports”→“Port1”→“View”→“Periodic Window Update”,切换到源程序窗口,将光标移到开头的一条可执行语句上,用鼠标左键单击菜单“Debug”→“Run to Cursor line”→ “Step”,或用鼠标左键单击菜单“Insert/Remove break
point”→“Go”,重复“Step”或“Insert/Remove break point”→ “Go”步骤。
停止调试:用鼠标左键单击菜单“Debug”→“Start/Stop Debug Session”。
8、烧录程序
编译成功后的结果会生成hex格式的程序文件。
打开烧录程序的软件STC_ISP,选择之前已安装好的驱动的COM口,并选择单片机的型号。
点击“打开程序文件”,找到刚才生成的hex文件,双击。
最后点击“下载”,并给单片机上电,程序便被烧录到单片机中(烧录前单片机要处于关闭状态)。
三、C语言程序展示及讲解
①运用Delay函数实现跑马灯:
#include"reg52.h"
sbit D1=P0^0;
sbit D2=P0^1;
sbit D3=P0^2;
sbit P4=P0^3;
sbit P5=P0^4;
sbit P6=P0^5;
sbit P7=P0^6;
sbit P8=P0^7;
sbit S=P2^0; //定义端口
void Delay(unsigned int xms)
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=100;j>0;j--);
} //Delay函数
void main(void) //主函数
{
int i;
S=0; //打开电源
{
D1=0;
Delay(800);
D1=1;
D2=0;
Delay(800);
D2=1;
D3=0;
Delay(800);
D3=1;
P4=0;
Delay(800);
P4=1;
P5=0;
Delay(800);
P5=1;
P6=0;
Delay(800);
P6=1;
P7=0;
Delay(800);
P7=1;
P8=0;
Delay(800);
P8=1;
P7=0;
Delay(800);
P7=1;
P6=0;
Delay(800);
P6=1;
P5=0;
Delay(800);
P5=1;
P4=0;
Delay(800);
P4=1;
D3=0;
Delay(800);
D3=1;
D2=0;
Delay(800);
D2=1;
D1=0;
Delay(800);
D1=1;
}
for(i=1;i<3;i++)
{
D1=0;
D2=0;
D3=0;
P4=0;
P5=0;
P6=0;
P7=0;
P8=0;
Delay(5000);
D1=1;
D2=1;
D3=1;
P4=1;
P5=1;
P6=1;
P7=1;
P8=1;
Delay(5000); //跑马灯过后所有灯闪烁两次}
}
②中断系统实现跑马灯:
#include"reg52.h"
unsigned char count;
sbit D1=P0^0;
sbit D2=P0^1;
sbit D3=P0^2;
sbit D4=P0^3;
sbit D5=P0^4;
sbit D6=P0^5;
sbit D7=P0^6;
sbit D8=P0^7;
sbit S=P2^0; //定义端口
void ding() interrupt 1
{
P0=0xff; //灯全灭
TH0=0x3c;
TL0=0XB0;
if(count==1)
D1=0;
if(count==2)
D2=0;
if(count==3)
D3=0;
if(count==4)
D4=0;
if(count==5)
D5=0;
if(count==6)
D6=0;
if(count==7)
D7=0;
if(count==8)
D8=0;
if(count==9)
;
if(count==10)
P0=0x00; //灯全亮 if(count==11)
;
if(count==12)
D8=0;
if(count==13)
D7=0;
if(count==14)
D6=0;
if(count==15)
D5=0;
if(count==16)
D4=0;
if(count==17)
D3=0;
if(count==18)
D2=0;
if(count==19)
D1=0;
if(count==20)
;
if(count==21)
P0=0X00; //灯全亮
if(count==22)
;
count++;
if(count==22)
count=1;
}
void main(void)
{
S=0;
count=1;
TMOD=0x01; //模式1定时
TH0=0X3C;
TL0=0XB0;
ET0=1; //开T0中断
EA=1; //开CPU中断
TR0=1; //启动T0
TF0=0; //T0溢出标志位清零
while(1)
{
}
}
四、实验结果与分析
通过两种方式都实现了跑马灯,但实现的方式个有好处。
在运用Delay函数实现跑马灯的时候C语言程序很冗杂,不易阅读而且内容很多,但是很容易懂,简单。
而使用中断系统实现跑马灯的时候程序简洁,一目了然,但是程序中中断系统的使用会有一些困难,充分发挥了单片机的作用。
五、实验心得
实验过程中,需要对中断系统进行系统的学习,掌握各种中断方式的使用。
实验过程要有耐心,需要对程序进行反复调试。
写程序的过程中,需要对实验程序做一定的注释,以便于理解和后期调试。
对于开发板电路图的阅读也极其重要,这是完成实验的第一步。