单片机流水灯实验程序

#include

#include

#define uchar unsigned char

#define uint unsigned int

Uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0~F的共阴极字段码表

uchar chocode[]={0xfe,0xfd,0xfb,0xf7}; //位选码表

uchar N,M;

sbit P3_5=P3^5; //位定义

sbit P3_6=P3^6;

sbit P3_7=P3^7;

sbit P4_4=P4^4;

sbit P3_3=P3^3;

sbit P3_4=P3^4;

sbit P0_7=P0^7;

//===================================延时1毫秒====================== void Delay1ms()

{

unsigned char i, j;

_nop_();

i = 11;

j = 190;

do

{

while (--j);

} while (--i);

}

//==================================延时300毫秒===================== void Delay300ms()

{

unsigned char i, j, k;

i = 13;

j = 156;

k = 83;

do

{

do

{

while (--k);

} while (--j);

} while (--i);

}

//=====================================数码管显示================== void display(uchar N,M)

{

P1M0=0xff;

P1M1=0x00;

P0=chocode[3];

P1=table[M];

Delay1ms();

P0=chocode[2];

P1=table[N];

Delay1ms();

P0=chocode[1];

P1=table[0];

Delay1ms();

P0=chocode[0];

P1=table[0];

Delay1ms();

}

//========================扫描键盘,设置倒计时初值=============== void Scan_Key(void)

{

uchar m;

bit FLAG0=0;

P3_6=0;

P3_7=1;

P0=0xff;

m=P0;

switch(m&0xf0)

{

case 0xd0: N++;

FLAG0=1;

break;

case 0xb0: M++;

FLAG0=1;

break;

default: break;

}

if(FLAG0)

{

while((P0|0x0f)!=0xff)

{

display(N,M);

}

}

else

{

display(N,M);

}

P3_6=1;

P3_7=0;

P0=0xff;

m=P0;

switch(m&0xf0)

{

case 0xd0: N--;

FLAG0=1;

break;

case 0xb0: M--;

FLAG0=1;

break;

default: break;

}

if(FLAG0)

{

while((P0|0x0f)!=0xff)

{

display(N,M);

} //松手检测//松手检测

}

else

{

display(N,M);

}

P3_7=1;

P3_6=0;

}

//==========================主函数============================== main()

{

P4SW|=0x10; //将P4_4口定义为普通I/O口

P1=0x0;

while(1)

{

uchar i;

Scan_Key(); //扫描键盘,确定倒计时初值

P0=0xff;

if(P0_7==0) //检测是否开始倒计时

{

while((P0|0x0f)!=0xff) //松手检测

{

display(N,M);

}

while(1) //定时开始

{

for(i=0;i

TMOD=0x01;

TH0=0xd8;

TL0=0xf0;

TR0=1;

display(N,M);

do{display(N,M);} while(TF0==0);//检测是否完成一次定时 }

if((M|N)==0) //定时到,所有灯闪烁

{

while(1)

{

P0=0xff;

} } } P2=0x00; P4_4=0; P3_3=0; P3_4=0; P3_5=0; Delay300ms(); P2=0xff; P4_4=1; P3_3=1; P3_4=1; P3_5=1; Delay300ms(); } } if(M==0) { M=9; N--; } else M--;

#include

#include

#define uchar unsigned char

#define uint unsigned int

Uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0~F的共阴极字段码表

uchar chocode[]={0xfe,0xfd,0xfb,0xf7}; //位选码表

uchar N,M;

sbit P3_5=P3^5; //位定义

sbit P3_6=P3^6;

sbit P3_7=P3^7;

sbit P4_4=P4^4;

sbit P3_3=P3^3;

sbit P3_4=P3^4;

sbit P0_7=P0^7;

//===================================延时1毫秒====================== void Delay1ms()

{

unsigned char i, j;

_nop_();

i = 11;

j = 190;

do

{

while (--j);

} while (--i);

}

//==================================延时300毫秒===================== void Delay300ms()

{

unsigned char i, j, k;

i = 13;

j = 156;

k = 83;

do

{

do

{

while (--k);

} while (--j);

} while (--i);

}

//=====================================数码管显示================== void display(uchar N,M)

{

P1M0=0xff;

P1M1=0x00;

P0=chocode[3];

P1=table[M];

Delay1ms();

P0=chocode[2];

P1=table[N];

Delay1ms();

P0=chocode[1];

P1=table[0];

Delay1ms();

P0=chocode[0];

P1=table[0];

Delay1ms();

}

//========================扫描键盘,设置倒计时初值=============== void Scan_Key(void)

{

uchar m;

bit FLAG0=0;

P3_6=0;

P3_7=1;

P0=0xff;

m=P0;

switch(m&0xf0)

{

case 0xd0: N++;

FLAG0=1;

break;

case 0xb0: M++;

FLAG0=1;

break;

default: break;

}

if(FLAG0)

{

while((P0|0x0f)!=0xff)

{

display(N,M);

}

}

else

{

display(N,M);

}

P3_6=1;

P3_7=0;

P0=0xff;

m=P0;

switch(m&0xf0)

{

case 0xd0: N--;

FLAG0=1;

break;

case 0xb0: M--;

FLAG0=1;

break;

default: break;

}

if(FLAG0)

{

while((P0|0x0f)!=0xff)

{

display(N,M);

} //松手检测//松手检测

}

else

{

display(N,M);

}

P3_7=1;

P3_6=0;

}

//==========================主函数============================== main()

{

P4SW|=0x10; //将P4_4口定义为普通I/O口

P1=0x0;

while(1)

{

uchar i;

Scan_Key(); //扫描键盘,确定倒计时初值

P0=0xff;

if(P0_7==0) //检测是否开始倒计时

{

while((P0|0x0f)!=0xff) //松手检测

{

display(N,M);

}

while(1) //定时开始

{

for(i=0;i

TMOD=0x01;

TH0=0xd8;

TL0=0xf0;

TR0=1;

display(N,M);

do{display(N,M);} while(TF0==0);//检测是否完成一次定时 }

if((M|N)==0) //定时到,所有灯闪烁

{

while(1)

{

P0=0xff;

} } } P2=0x00; P4_4=0; P3_3=0; P3_4=0; P3_5=0; Delay300ms(); P2=0xff; P4_4=1; P3_3=1; P3_4=1; P3_5=1; Delay300ms(); } } if(M==0) { M=9; N--; } else M--;


相关内容

  • 北邮小学期AVR单片机模拟电梯系统实验报告
  • 小学期单片机实验报告 姓名: 申宇飞 班级:信通3班 学号: 班内序号:03 时间:2014/9/9-2014/9/18 基于AVR 单片机的模拟电梯系统制作 目录 基于AVR 单片机的模拟电梯系统制作 ................................................ ...

  • 实验一 跑马灯实验
  • 学号序号 单片机原理与接口技术 实验报告 姓名王海标专业电气工程及其自动化班级电气15-2BF 完成时间 实验一跑马灯实验 一.实验目的 1. 熟悉HNIST-2型单片机系统相关硬件电路,程序下载方法: 2. 掌握采用汇编语言与C语言开发单片机系统的程序结构: 3. 掌握51系列单片机通用I/O口的 ...

  • LED小灯实验报告
  • led 流水灯的设计报告 课程名称: led流水灯设计 学 院: 大数据与信息工程学院 专 业: 姓 名: 学 号: 年 级: 任课教师: 一. 实验的背景和意义 单片机全称叫单片微型计算机,是一种集成在电路芯片,是采用大规模集成电路技术把 cpu 随机存储器ram .只读存储器rom .多种输入输 ...

  • 单片机外部中断实验报告
  • 实验三 外部中断 实验报告 班级: 学号: 姓名: 教师: 一.实验目的 1.掌握单片机外部中断的原理及过程. 2.掌握单片机外部中断程序的设计方法. 3.掌握单片机外部中断时中断方式的选择方法. 二.实验内容 如下图所示,P3.2设为输入, P2设为输出位,连有8个发光二极管D1~D8.每当发 生 ...

  • 单片机门铃设计
  • 单片机课程设计报告 学生姓名: 学 号: 教学院系: 专业年级: 指导教师: 完成日期: 2011年6月21日 目录 第一章 基础设计实验 ........................... - 2 - 1.1 实验内容 ................................ - 2 ...

  • C51单片机实验报告流水灯交通灯定时器双机交互时钟
  • 学 号: 31100800 班 级: 自动化10班 姓 名: 张 指导老师: 胡 2012.12 单片机核心板实验要求 一. 流水灯实验 1. 实验目的: 1) 简单I/O引脚的输出 2) 掌握软件延时编程方法 3) 简单按键输入捕获判断 2. 完成功能要求 1) 开机是点亮12发光二极管,闪烁三下 ...

  • 单片机实验心得吉林工师
  • 通过这一个学期的单片机学习,我收获了很多关于单片机的知识,并且这些知识和日常的生活息息相关. 时光飞逝,一转眼,一个学期又进尾声了,本学期的单片机实验也在上周完成了. 俗话说"好的开始是成功的一半".说起单片机实验,我认为最重要的就是做好设计的预 习,认真的研究老师给的题目.其次 ...

  • 实验七外部中断实验
  • 贵 州 大 学 实 验 报 告 纸 实验七 外部中断实验 一.实验目的 学习外部中断技术的基本使用方法. 二.实验内容 1.INT0端接单次脉冲发生器.按一次脉冲产生一次中断,CPU使P1.0状态发生一次反转,P1.0接LED灯,以查看信号反转. 2.修改程序,实现用一位开关产生外部中断1,每产生一 ...

  • 单片机总结
  • <单片机>课程学习总结 <单片机>这门课程我已经学了一个学期了,在这一个学期的学习过程中,我一开始不怎么懂得编程,但慢慢的我现在已经不仅会读程序还会写程序了.真为自己一个学期来努力学到的单片机知识只是而感到高兴. 怎么学单片机?也常看到有人说学了好几个月可就是没有什么进展.当 ...