单片机设计(流水灯、矩阵键盘、数码管倒计时)

合集下载

毕业设计---基于单片机的流水灯设计

毕业设计---基于单片机的流水灯设计
8
总结
通过这次单片机课程设计,我不仅加深了 对单片机理论的理解,将理论很好地应用 到实际当中去,而且我还学会了如何去培 养我们的创新精神,从而不断地战胜自己 ,超越自己。创新可以是在原有的根底上 进行改进,使之功能不断完善,成为真己 的东西。
9
致谢
系老师三年以来的帮助和教导 同学在生活上的帮助 辩论委员会
11111110〕
MOV P1,ACC
;将ACC的数据送P1口
MOV R0,#7
;将数据再移动7次就完成一个8位流水过程
LOOP: RL
A
;将ACC中的数据左移一位
MOV P1,A
;把ACC移动过的数据送p1口显示
ACALL DELAY
;调用延时子程序
DJNZ R0,LOOP ;没有移动够7次继续移动
5
软件编程
单片机的应用系统由硬件和软件组成,上述硬件原理图搭建完成
上电之后,我们还不能看到流水灯循环点亮的现象,我们还需要编写
程序控制单片机管脚电平的上下变化,来实现发光二极管的一亮一灭
。软件编程是单片机应用系统中的一个重要的组成局部。以最简单的
流水灯控制功能即实现8个LED灯的循环点亮,来介绍实现流水灯控
4
流水灯硬件原理图
从原理图中可以看出,如果要 让接在P1.0口的LED1亮起来,那 么只要把P1.0口的电平变为低电平 就可以了;相反,如果要接在P1.0 口的LED1熄灭,就要把P1.0口的 电平变为高电平;同理,接在P1.1 ~P1.7口的其他7个LED的点亮和 熄灭的方法同LED1。因此,要实 现流水灯功能,我们只要将发光二 极管LED1~LED8依次点亮、熄灭 ,8只LED灯便会一亮一暗的做流 水灯了。在此我们还应注意一点, 由于人眼的视觉暂留效应以及单片 机执行每条指令的时间很短,我们 在控制二极管亮灭的时候应该延时 一段时间,否那么我们就看不到“ 流水〞效果了。

用单片机设计流水灯的方法和程序编写

用单片机设计流水灯的方法和程序编写

用单片机设计流水灯的方法和程序编写-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIANS51增强型单片机实验板上有8个高亮度发光二极管(见图1所示),可以用来做单片机流水灯、跑马灯。

等实验,电路原理图见下图3。

图3单片机流水灯设计方法从原理图可以看出,如果我们想让接在口的LED1亮起来,那么我们只要把口的电平变为低电平就可以了;相反,如果要接在口的LED1熄灭,就要把口的电平变为高电平就可以;同理,接在~口的其他7个LED的点亮和熄灭方法方法同LED1。

因此,要实现流水灯功能,我们只要将LED2~LED8依次点亮、熄灭,依始类推,8只LED变会一亮一暗的做流水灯了。

实现8个LED流水灯程序用中文表示为:低、延时、高、低、延时、高、低、延时、高、低、延时、高、低、延时、高、低、延时、高、低、延时、高、低、延时、高、返回到开始、程序结束。

从上面中文表示看来实现单片机流水灯很简单,但是我们不能说你变低,它就变低了。

因为单片机听不懂我们的汉语的,只能接受二进制的“1、0......”机器代码。

我们又怎样来使单片机按我们的意思去工作呢为了让单片机工作,只能将程序写为二进制代码交给其执行;早期单片机开发人员就是使用人工编写的二进制代码交给单片机去工作的。

今天,我们不必用烦人的二进制去编写程序,完全可以将我们容易理解的“程序语言”通过“翻译”软件“翻译”成单片机所需的二进制代码,然后交给单片机去执行。

这里的“程序语言”目前主要有汇编语言和C语言两种;在这里我们所说的“翻译”软件,同行们都叫它为“编译器”,将“程序语言”通过编译器产生单片机的二进制代码的过程叫编译。

前面说到,要想使LED1变亮,只需将对应的单片机引脚电平变为低电平就可以了。

现在让我们将上面提到的8只LED流水灯实验写为汇编语言程序。

在上面主程序中用到了五条汇编语言指令:CLR、ACALL、SETB、LJMP、EN D。

CLR:是将其后面指定的位清为0,程序中使对应端口输出低电平ACALL:是子程序调用指令,程序中调用了DELAY延时子程序SETB:是将其后面指定的位置成1,程序中使对应端口输出高电平AJMP:是无条件跳转指令,意思是:跳转到指定的标号处继续运行END:是程序结束的伪指令,意思是告诉编译器,程序到此结束。

单片机流水灯实验报告

单片机流水灯实验报告

单片机流水灯实验报告本实验旨在通过单片机控制LED灯的亮灭,实现流水灯效果。

通过对实验的设计、搭建和调试,我们可以更深入地理解单片机的工作原理和掌握相应的编程技巧。

实验器材和元件:1. 单片机,我们选用了STC89C52单片机作为控制核心;2. LED灯,我们使用8个LED灯作为实验的输出设备;3. 电阻,为了限流,我们使用了适当的电阻;4. 连接线、面包板等。

实验步骤:1. 搭建电路,首先,我们按照电路图将单片机、LED灯和电阻连接在一起,并将电路连接到电源上;2. 编写程序,接下来,我们使用C语言编写单片机的控制程序,实现LED灯的流水灯效果;3. 烧录程序,将编写好的程序通过烧录器烧录到单片机中;4. 调试程序,将烧录好的单片机连接到电路上,进行程序的调试和验证;5. 完善电路,根据实际调试情况,对电路进行必要的调整和完善,确保LED 灯能够按照预期的流水灯效果工作。

实验结果:经过反复调试和完善,我们成功实现了单片机控制LED灯的流水灯效果。

在程序控制下,8个LED灯按照顺序依次亮起并熄灭,形成了流水灯的效果。

整个实验过程非常顺利,取得了预期的效果。

实验心得:通过本次实验,我们对单片机的控制原理有了更深入的理解,也掌握了一定的C语言编程技巧。

在实验的过程中,我们遇到了一些问题,如LED灯未按预期工作、程序逻辑错误等,但通过分析和调试,最终都得到了解决。

实验不仅提高了我们的动手能力,也培养了我们的分析和解决问题的能力。

总结:本次实验不仅让我们熟悉了单片机的控制方法,也让我们体验了从实验设计到调试完善的整个过程。

通过这次实验,我们不仅学到了专业知识,也培养了动手能力和解决问题的能力。

希望在以后的学习和实践中,能够更好地运用所学知识,不断提升自己的能力。

以上就是本次单片机流水灯实验的报告内容,希望对大家有所帮助。

C51实验程序(流水灯、矩阵键盘、动态显示、串行口、1602液晶)

C51实验程序(流水灯、矩阵键盘、动态显示、串行口、1602液晶)
{RI=0;
switch(SBUF)//根据收到的数据决定模式
{ case 'A':LED1=~LED1,LED2=1;break;
case 'B':LED2=~LED2,LED1=1;break;
case 'C': LED1=~LED1,LED2=~LED2;break;
}
}
else
LED1=LED2=1;
TMOD=0x20;
PCON=0x00;
TH1=0xfd;
TL1=0xfd;
TI=0;
TR1=1;
while(1)
{ if(K1==0)
{ while(K1==0);
Operation_NO=(Operation_NO+1)%4; //计按键次数决定模式
}
switch(Operation_NO)
{ case 0:LED1=LED2=1;break;
{uchar t;
while(ms--)
{
for(t=0;t<120;t++);
}
}
void main()//主函数
{SCON=0x50;//以下为串行口初始化
TMOD=0x20;
PCON=0x00;
TH1=0xfd;
TL1=0xfd;
RI=0;
TR1=1;
LED1=LED2=1;
while(1)
{ if(RI)
DelayMS(10);
}}
#include<reg52.h>(LCD1602)
#define uint unsigned int
#define uchar unsigned char

单片机c语言程序设计---矩阵式键盘实验报告

单片机c语言程序设计---矩阵式键盘实验报告

单片机c语言程序设计---矩阵式键盘实验报告课程名称:单片机c语言设计实验类型:设计型实验实验项目名称:矩阵式键盘实验一、实验目的和要求1.掌握矩阵式键盘结构2.掌握矩阵式键盘工作原理3.掌握矩阵式键盘的两种常用编程方法,即扫描法和反转法二、实验内容和原理实验1.矩阵式键盘实验功能:用数码管显示4*4矩阵式键盘的按键值,当K1按下后,数码管显示数字0,当K2按下后,显示为1,以此类推,当按下K16,显示F。

(1)硬件设计电路原理图如下仿真所需元器件(2)proteus仿真通过Keil编译后,利用protues软件进行仿真。

在protues ISIS 编译环境中绘制仿真电路图,将编译好的“xxx.hex”文件加入AT89C51。

启动仿真,观察仿真结果。

操作方完成矩阵式键盘实验。

具体包括绘制仿真电路图、编写c源程序(反转法和扫描法)、进行仿真并观察仿真结果,需要保存原理图截图,保存c源程序,总结观察的仿真结果。

完成思考题。

三、实验方法与实验步骤1.按照硬件设计在protues上按照所给硬件设计绘制电路图。

2.在keil上进行编译后生成“xxx.hex”文件。

3.编译好的“xxx.hex”文件加入AT89C51。

启动仿真,观察仿真结果。

四、实验结果与分析void Scan_line()//扫描行{Delay(10);//消抖switch ( P1 ){case 0x0e: i=1;break;case 0x0d: i=2;break;case 0x0b: i=3;break;case 0x07: i=4;break;default: i=0;//未按下break;}}void Scan_list()//扫描列{Delay(10);//消抖switch ( P1 ){case 0x70: j=1;break;case 0xb0: j=2;break;case 0xd0: j=3;break;case 0xe0: j=4;break;default: j=0;//未按下break;}}void Show_Key(){if( i != 0 && j != 0 ) P0=table[ ( i - 1 ) * 4 + j - 1 ];else P0=0xff;}五、讨论和心得。

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

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

单片机实验报告姓名: 学号:一、 实验实现功能: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;}}}。

单片机设计(流水灯、矩阵键盘、数码管倒计时)

单片机设计(流水灯、矩阵键盘、数码管倒计时)

单片机结业作业1.电路图2.程序:#include <reg51.h>sbit P1_6=P1^6;sbit P1_7=P1^7;unsigned char code led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsigned char clock[2]={59,59}; //60秒倒计时缓冲数组unsigned char *dis_p;unsigned char keytest(); //键盘检测函数unsigned char search(); //查键值函数void display(unsigned char *p); //显示函数void main(){unsigned char i,a,c;TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;dis_p=clock;while(1){P0=0x80;c=P0;for(i=0;i<8;i++){c>>=1;P0=c;a=keytest();if(a==0x0f) display(dis_p);else{display(dis_p);a=keytest();if(a!=0x0f){P3=0x00;a=search();switch(a){case 0x00:P2=0x3f;break;case 0x01:P2=0x06;break;case 0x02:P2=0x5b;break;case 0x03:P2=0x4f;break;case 0x04:P2=0x66;break;case 0x05:P2=0x6d;break;case 0x06:P2=0x7d;break;case 0x07:P2=0x07;break;case 0x08:P2=0x7f;break;case 0x09:P2=0x6f;break;case 0x0a:P2=0x77;break;case 0x0b:P2=0x7c;break;case 0x0c:P2=0x39;break;case 0x0d:P2=0x5e;break;case 0x0e:P2=0x79;break;case 0x0f:P2=0x71;break;default:break;}while((a=keytest())!=0x0f);}}}}}//**********************************主函数完void display(unsigned char *p){unsigned char buffer[]={0,0,0,0};unsigned char k,i,j,m,temp;buffer[0]=p[0]%10;buffer[1]=p[0]/10;buffer[2]=p[1]%10;buffer[3]=p[1]/10;for(k=0;k<3;k++){temp=0x10;for(i=0;i<4;i++){P3=~temp;j=buffer[i];P2=led[j];temp<<=1;for(m=0;m<200;m++);}}}//*******************************显示函数完unsigned char keytest(){unsigned char c;P1=0x0f;c=P1;c=c&0x0f;return(c);}//*******************键盘检测函数完unsigned char search(){unsigned char a,b,c,d,e;c=0xfe;a=0;while(1){P1=c;d=P1;d=d&0xf0;if(d==0x70){b=0;break;}else if(d==0xb0){b=1;break;}else if(d==0xd0){b=2;break;}else if(d==0xe0){b=3;break;}a++;c<<=1;}e=a*4+b;return(e);}//*****************查键值函数完void daojishi() interrupt 1{unsigned char a;EA=0;TH0=(65536-50000)/256;TL0=(65536-50000)%256;a++;if(a==20){a=0;if(clock[0]==0){clock[0]=59;clock[1]=59;}else{clock[0]--;clock[1]--;}}EA=1;}。

单片机课程设计报告流水灯(WORD档)

单片机课程设计报告流水灯(WORD档)

XX工程学院单片机课程设计报告题目:流水灯学生姓名:学号:系部名称:职业技术学院班级:机电一体化Z11-1 指导教师:目录摘要 (3)一、课程设计题目 (4)二、设计任务及要求 (4)三、实验方案 (4)四、流程图 (4)五、硬件电路 (6)六、软件设计 (6)1 主体程序 (6)2 键扫描子程序 (6)3 闪烁控制程序 (6)4 延时子程序 (6)5 源程序设计 (7)七、功能调试 (12)八、设计总结 (12)九、参考文献 (13)【摘要】单片机课程设计主要是为了让我们增进对单片机芯片电路的感性认识,加深对理论方面的理解。

了解软硬件的有关知识,并掌握软件设计过程、方法及实现,为以后设计和实现应用系统打下良好基础。

另外,通过简单课题的设计练习,使我们了解必须提交的各项工程文件,达到巩固、充实和综合运用所学知识解决实际问题的目的。

一、课程设计题目:流水灯二、设计任务及要求:任务:完成对接在P1,P3口的发光二极管闪亮控制程序的设计1.用程序延时方法让P1的一个LED小灯每隔1S交替闪亮2.用程序延时方法让P1的8个LED小灯循环(每个亮50MS)闪亮3.用程序延时方法让P1的8个LED小灯追逐闪亮(50MS间隔变化)4.用程序延时方法让P1、P3的16个LED小灯循环(每个亮50MS)闪亮要求:1. 根据硬件电路原理,画出接线2. 设计出相应的软件程序三、实验方案:方案:单片机采用40脚的89C52标准双列直插系列,有4个标准输入/输出端口共32位控制端口。

本次设计采用并行口低电平(吸电流)直接驱动LED发光管发光形式,选择了P1和P3口的16个端口进行模拟LED小灯控制,如要多些小灯单元可再将P2口、P0口及其他空余端口用LED小灯驱动控制。

因系统功能要求能控制灯亮的方式,在P0.0—P0.3端口接了4个按键小开关,每个小开关可控制一种亮灯方式。

在端口较紧张的情况下,LED小灯驱动也可用串入/并出移位寄存器(如74HC595),单片机用并行移位方式进行驱动。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机结业作业
1.电路图
2.程序:
#include <reg51.h>
sbit P1_6=P1^6;
sbit P1_7=P1^7;
unsigned char code led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char clock[2]={59,59}; //60秒倒计时缓冲数组
unsigned char *dis_p;
unsigned char keytest(); //键盘检测函数
unsigned char search(); //查键值函数
void display(unsigned char *p); //显示函数
void main()
{
unsigned char i,a,c;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
dis_p=clock;
while(1)
{
P0=0x80;
c=P0;
for(i=0;i<8;i++)
{
c>>=1;
P0=c;
a=keytest();
if(a==0x0f) display(dis_p);
else
{
display(dis_p);
a=keytest();
if(a!=0x0f)
{
P3=0x00;
a=search();
switch(a)
{
case 0x00:P2=0x3f;break;
case 0x01:P2=0x06;break;
case 0x02:P2=0x5b;break;
case 0x03:P2=0x4f;break;
case 0x04:P2=0x66;break;
case 0x05:P2=0x6d;break;
case 0x06:P2=0x7d;break;
case 0x07:P2=0x07;break;
case 0x08:P2=0x7f;break;
case 0x09:P2=0x6f;break;
case 0x0a:P2=0x77;break;
case 0x0b:P2=0x7c;break;
case 0x0c:P2=0x39;break;
case 0x0d:P2=0x5e;break;
case 0x0e:P2=0x79;break;
case 0x0f:P2=0x71;break;
default:break;
}
while((a=keytest())!=0x0f);
}
}
}
}
}
//**********************************主函数完void display(unsigned char *p)
{
unsigned char buffer[]={0,0,0,0};
unsigned char k,i,j,m,temp;
buffer[0]=p[0]%10;
buffer[1]=p[0]/10;
buffer[2]=p[1]%10;
buffer[3]=p[1]/10;
for(k=0;k<3;k++)
{
temp=0x10;
for(i=0;i<4;i++)
{
P3=~temp;
j=buffer[i];
P2=led[j];
temp<<=1;
for(m=0;m<200;m++);
}
}
}
//*******************************显示函数完unsigned char keytest()
{
unsigned char c;
P1=0x0f;
c=P1;
c=c&0x0f;
return(c);
}
//*******************键盘检测函数完unsigned char search()
{
unsigned char a,b,c,d,e;
c=0xfe;
a=0;
while(1)
{
P1=c;
d=P1;
d=d&0xf0;
if(d==0x70){b=0;break;}
else if(d==0xb0){b=1;break;}
else if(d==0xd0){b=2;break;}
else if(d==0xe0){b=3;break;}
a++;
c<<=1;
}
e=a*4+b;
return(e);
}
//*****************查键值函数完
void daojishi() interrupt 1
{
unsigned char a;
EA=0;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a++;
if(a==20)
{
a=0;
if(clock[0]==0)
{clock[0]=59;clock[1]=59;}
else{
clock[0]--;
clock[1]--;
}
}
EA=1;
}。

相关文档
最新文档