单片机c语言编程实现中间向两边,再从两边向中间亮的程序流程图,单片机控制LED流水灯从中间向两边.doc...
单片机控制LED流水灯从中间向两边,从两边向中间
这个就是把 先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动三次;再从中间往两边流动三次;不过这个程序实现的 应该是这样的 先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动;再从中间往两边流动;
#include< reg52.h>
#include< intrins.h>
#define uint unsigned int
#define uchar unsigned char
void delay();
void main()
{ uchar temp,temp1,temp2,a,b;
P3=0xff;
while(1)
{ for(b=3;b>0;b--)
{ temp=0xaa;
P1=temp;
delay();
temp=0x55;
P1=temp;
delay();
}
for(a=3;a>0;a--)
{ temp=0xfe;
for(b=7;b>0;b--)
{ P1=temp;
temp=_crol_(temp,1);
delay();
P1=temp;
delay();
}
}
temp1=0xfe;
temp2=0x7f;
for(a=8;a>0;a--)
{
temp=temp1&temp2;
P1=temp;
delay();
temp1=_crol_(temp1,1);
temp2=_cror_(temp2,1);
}
}
}
void delay()
{ uint a,b;
for(a=100;a>0;a--)
for(b=600;b>0;b--);
}
程序实现的第2种方法:下面是http://www.51hei.com单片机12群里的朋友木信大侠提出的,实现单片机led流水灯从中间向两边,从两边向中间的效果,下面的程序就是实现思路,这个是直接调用,应该明白吧,数组那其实也可以改一下,如采用一维数组,在多次调用;也可以采用二维数组。主要看个人喜好.
-----------------------------------------------------
#include< reg52.h>
unsigned char code TABLE[]={
0xFF,0xE7,0xC3,0x81,0x00, //从中间向两侧点亮
0xFF,0xE7,0xC3,0x81,0x00,
0xFF,0xE7,0xC3,0x81,0x00,
0xFF,0x7E,0x3C,0x18,0x00, //从两侧向中间点亮
0xFF,0x7E,0x3C,0x18,0x00,
0xFF,0x7E,0x3C,0x18,0x00
};
unsigned char i;
DELAY()
{
unsigned int s;
for(s=0;s<30000;s++);
}
main()
{
while(1)
{
if(TABLE[i]!=0x01)
{
P1=TABLE[i];
i++;
DELAY();
}
else
{
i=0;
}
}
}
汇编程序如下:; 花样流水灯(8个发光二极管以各种形式循环点亮); 功能:流水灯(8个发光二极管循环以1S间隔以各种形式循环点亮) ORG 0000H ;伪指令,指定程序从0000H开始存放 LJMP MAIN ;跳转指令,程序跳转至MAIN处执行 ORG 0030H ;伪指令,指定程序从0030H开始存放MAIN: MOV SP, #60H ;给堆栈指针赋初值 MOV P1,#0FFH ;给P1口赋值 MOV DPTR,#TABLE;查表LIGHT: MOV R4,#42 ;设置循环次数LOOP: MOV A,#42 ;给A赋初值 SUBB A,R4 ;将A的值与R4的值相减,结果存在A中 MOVC A,@A+DPTR ;将A+DPTR的值所对应的TABLE中的值赋给A MOV P1,A ;将A的值赋给P1口 LCALL DEL1S ;调用1S延时子程序 DJNZ R4,LOOP ;判断R4是否为0,不为0跳转,为0顺序执行 LJMP LIGHT ;跳转指令,跳转至LIGHT处继续执行;1S延时子程序(11.0592MHz晶振,误差0微秒)DEL1S: MOV R5, #089HDL1S0: MOV R6, #0A4HDL1S1: MOV R7, #013H DJNZ R7, $ DJNZ R6, DL1S1 DJNZ R5, DL1S0 RETTABLE: ;定义表格数据DB 0FFH ;全灭DB 0FEH 0FDH 0FBH 0F7H 0EFH 0DFH 0BFH 07FH ;依次逐个点亮DB 0FEH 0FCH 0F8H 0F0H 0E0H 0C0H 080H 000H ;依次逐个叠加DB 080H 0C0H 0E0H 0F0H 0F8H 0FCH 0FEH 0FFH ;依次逐个递减DB 07EH 0BDH 0DBH 0E7H 0E7H 0DBH 0BDH 07EH ;两边靠拢后分开DB 07EH 03CH 018H 000H 000H 018H 03CH 07EH ;两边叠加后递减DB 000H ;全亮 END ;程序结束指令C语言程序如下:/* 该实验是花样流水灯(8个发光二极管以各种方式循环点亮),功能是花样流水灯(8个发光二极管以1S间隔以各种方式循环点亮) */#include//包含reg.52文件#define uint unsigned int//宏定义#define uchar unsigned char//宏定义void delay(uint z);//声明延时函数uint a;//定义循环用变量uchar code table[]={0xff,//全灭0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,//依次逐个点亮0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,//依次逐个叠加0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,//依次逐个递减0x7e,0xbd,0xdb,0xe7,0xe7,0xdb,0xbd,0x7e,//两边靠拢后分开0x7e,0x3c,0x18,0x00,0x00,0x18,0x3c,0x7e,//两边叠加后递减0x00,//全亮};//定义循环用数据表格/*亮的现象:先是全灭,然后依次逐个点亮,然后依次逐个叠加,然后依次逐个递减,然后两边靠拢后分开,然后两边叠加后递减,最后全亮。循环!*/void main()//main函数{ a=0;//给a赋初值 while(1)//while循环 { P1=table[a];//将a所在的table中的值赋给P1口 delay(1000);//1S延时子程序 a++;//a的值加一 if(a==42)//测试a是否等于42 a=0;//给a赋值 }} void delay(uint z)//1ms延时子程序,通过z值改变延时时间{ uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--);}
/*动态数显的设计思路,首先是我们要先知道怎样才能使哪个位亮,显示的段是什么数值,接下来就是中断时间
的问题了,设计步骤如下,如果要让八个数码管静态显示1到8,我们可以修改中断时间,如把50000改成100或更低*/
#include#include#define uint unsigned int
#define uchar unsigned char
sbit duan=P2^6;
sbit wei=P2^7;
uchar a,numw,numd;
uchar code tabled[]={
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f}; /*第二步骤,创建段显数值的对码表0~9数值.如果要显示1~8数值,最好多加前后两位数0跟9,
因为后面++移位时就能按我们常规顺序亮下去,至于如何显示对应数值请先看数码显示电路图*/
uchar code tablew[]={
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f}; //第二步骤,创建位显,就是显示的位置,这个码表相对简单,用二进制表示11111110~01111111,是0的为八位数显管的位置
void main()
{
a=0; //定义个时间函数
numw=0; //附位显初值为0位
numd=0; //附段显初值为0位
TMOD=0X01; //第四步骤,附中断暂存器初值
TH0=(65535-50000)/256; //附中断请求时间初值,高8位
TL0=(65536-50000)%256; //附中断请求时间初值,低8位
EA=1; //开启总中断
ET0=1; //开启定时中断
TR0=1; //启动定时中断
while(1)
{
if(a==10) //第三步骤,执行速度,如果等20差不多是1秒,则往下执行,相当于单位数值亮的时间
{
a=0; //重新附值初值0
numd++; //段显值++
if(numd==9) //如果段值在对码表第9位则转下执行
numd=1; /*重新附值段显值对应对码表第1位,因为++所以0位并不在数码管中显示.
如果要显示,也会因为++而在第二轮中显示出*/
duan=1; //开启段显端
P0=tabled[numd];//附段显P0值对应段显值对码表
duan=0; //锁存
wei=1; //开启位显端
P0=tablew[numw];//附位显P0值对应位显值对码表
wei=0; //锁存
numw++; //相当于位显移位
if(numw==8) //如果位显值到对应位显对码表第八位则转下执行
numw=0; //重新附值位显值对应对码表第0位起
/*
下面是简单的单个数码管显示例证 第一骤, 修改后在第三步骤内
#include"reg52.h"
#include"intrins.h"
sbit duan=P2^6; //段显端口
sbit wei=P2^7; //位显端口
void main()
{
//P0=0xff; 数码管不显示任何信号,默认情况下通电本身就不显示,可以不写
duan=1; //开启段显端口
P0=0x06; //附值段显数值为1,可以查阅数码管电路图相对应显示的对码表
duan=0; //锁存,保持上一步段显状态,硬件说明请查阅74HC573功能
wei=1; //开启位显端口
P0=0xfe; //附值位显位置,01111111,左边第一位,为0的显示
wei=0; //锁存,保持上一步位显状态,硬件说明请查阅74HC573功能
}
*/
}
}
}
void timer0() interrupt 1 /*第四步骤,中断时间函数这个相当于移位数显的速度,速度够快,人眼就会有余辉效应,
感觉8位数显一直在亮着,相当于正在播放的电影胶卷*/
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a++;
}
展开阅读全文
单片机c语言编程实现中间向两边,再从两边向中间亮的程序流程图,单片机控制LED流水灯从中间向两边.doc...相关推荐
- 从两边往中间流水灯c语言程序,单片机控制LED流水灯从中间向两边.doc
WORD格式.分享 精品.资料 单片机控制LED流水灯从中间向两边,从两边向中间 这个就是把 先奇数亮再偶数亮,循环三次:一个灯上下循环三次:两个分别从两边往中间流动三次:再从中间往两边流动三次:不过 ...
- 从两边往中间流水灯c语言程序,单片机控制LED流水灯从中间向两边
单片机控制LED流水灯从中间向两边,从两边向中间 这个就是把先奇数亮再偶数亮,循环三次:一个灯上下循环三次:两个分别从两边往中间流动三次:再从中间往两边流动三次:不过这个程序实现的应该是这样的先奇数亮 ...
- 从两边往中间流水灯c语言程序,单片机控制LED流水灯从中间向两边,从两边向中间...
这个就是把 先奇数亮再偶数亮,循环三次:一个灯上下循环三次:两个分别从两边往中间流动三次:再从中间往两边流动三次:不过这个程序实现的 应该是这样的 先奇数亮再偶数亮,循环三次:一个灯上下循环三次:两 ...
- STC15单片机 线性按键控制LED流水灯位移
目录 1.现象 2.代码 3.LED模块原理图 4.线性键盘原理图 1.现象 程序下载完成后: 首先,由最右边的 LED1 点亮.当按下线性按键 S1 后,LED1 熄灭,LED2 点亮.其次,每按下 ...
- 51单片机 按键控制LED流水灯模式
本章博客实现按键控制LED流水灯模式的功能 1.将之前文件中Delay.c.h复制过来,进行添加 2.模块化编程 3.main.c #include <REGX52.H> #include ...
- 点亮led流水灯c语言程序,用数组的指针控制LED流水灯--C语言编程
#include/************************************************* 函数功能:延时约150ms (3*200*250=150 000μs=150ms ...
- PIC单片机与PIC单片机C语言编程简介
对于计算机学院与电子学院相关的同学来说,单片机一定不是一个陌生的概念.在大学的学习生涯中,经常用于教学的是MCS-51系列单片机.其实,除了MCS-51单片机外,还有一类单片机--PIC单片机. PI ...
- 51单片机c语言编程100,51单片机C语言编程100例.doc
51单片机C语言编程100例.doc 目 录实例3用单片机控制第一个灯亮3实例4用单片机控制一个灯闪烁认识单片机的工作频率3实例5将 P1口状态分别送入P0.P2.P3口认识I/O口的引脚功能4实例6 ...
- c语言程序设计分段定时器,单片机C语言编程定时器的几种表达方式
原标题:单片机C语言编程定时器的几种表达方式 吴鉴鹰单片机开发板地址 店铺:[吴鉴鹰的小铺] 地址:[https://item.taobao.com/item.htm?_u=ukgdp5a7629&a ...
最新文章
- 三星15TB固态硬盘开卖 售价高达10000美元
- 易语言复制C指针,易语言教程API模块制作cmd复制文件
- 后续升级鸿蒙系统,荣耀部分机型后续将支持升级为鸿蒙系统
- MySQL - 触发器
- Linux下基于socket和多线程的聊天室小程序
- Linux下Wireshark的Lua: Error during loading 和 couldn't run /usr/bin/dumpcap in child process 的解决方案
- biodist r语言_R语言 Biostrings包 pairwiseAlignment()函数中文帮助文档(中英文对照)
- Windows 有哪些值得推荐的必装软件?
- .net 4.5 新特性 async await 一般处理程序实例
- 数字图像处理技术与人脸识别
- 金蝶EAS初始化操作手册之科目表
- Linux 痕迹清理
- 2DPCA人脸识别--python
- Excel2003 找回工作表密码方法
- 主叫用户、被叫用户、局内呼叫、局间呼叫、发话端局、受话端局 等定义
- 1.7.10服务器物品编辑器,我的世界背包编辑器1.7.10
- 基于机器学习的Adam 优化算法来提高深层神经网络的训练速度
- vissim跟驰模型_vissim简介
- Packetdrill(网络协议测试工具)
- 【商品架构day3】京东商品系统的演进之路 - 如何抗住亿级流量
热门文章
- [Unity][Fungus]强大的剧情叙述、问答对话、文字互动插件Fungus
- vat可以退税吗_英国VAT退税流程以及VAT退税政策
- Pandas详解三之Index对象
- IDEA代码对齐整洁快捷键
- Xcode12调试iOS 15.1启动页卡顿解决
- JS判断输入手机号码是否正确
- asis2016_b00ks
- 2019.10 全世界评分最高动画TOP100
- poi 操作excel 自动换行
- skype java_使用taskan的java-skype api以Java形式发送Skype消息