单片机的跑马灯程序 求注释 尽量每行都注释 我几乎看不懂啊! 谢谢= =!!明天就要答辩啦!!快的话加分加
发布网友
发布时间:2022-04-23 14:03
我来回答
共3个回答
热心网友
时间:2023-10-17 05:43
哈哈 这不难啊!!!!…………单片机的跑马灯程序主要用到了延时子程序,clr,lcall,ajmp 指令, 通过轮流点亮p1.0 …..P1.7 实现效果。你可以通过此程序的学习, 进一步掌握单片机的IO端口操作。
汇编语言参考程序:
org 0000h ;开始
ajmp loop
org 0080h ;到0030h处避开00-30的敏感地址
loop:
mov p1,#0ffh ;关闭所有灯
clr p1.0 ;点亮灯p1.0
lcall delay ;延时一段时间?
clr p1.1 ;点亮灯p1.1
lcall delay
clr p1.2 ;点亮灯p1.2
lcall delay
clr p1.3 ;点亮灯p1.3
lcall delay
clr p1.4 ;点亮灯p1.4
lcall delay
clr p1.5 ;点亮灯p1.5
lcall delay
clr p1.6 ;点亮灯p1.6
lcall delay
clr p1.7 ;点亮灯p1.7
lcall delay
AJMP LOOP ;到最开始loop处重新运行
delay: mov r5,#20 ;延时。
d1: mov r6,#40
d2: mov r7,#248
djnz r7,$
djnz r6,d2
djnz r5,d1
ret
end
c语言参考程序:
#include<reg51.h> //头文件
#define uchar unsigned char //宏定义,为方便编程
#define uint unsigned int
#define LED P1 //宏定义,将P1口定义为LED
uchar led_value[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x00}; //定义一数组,内存放跑马灯数据
uchar *p=led_value; //定义指针,指向跑马灯数组首地址
void delay() //延迟函数,与跑马灯跳动频率有关
{
uchar ii,jj;
for(ii=0;ii<200;ii++)
for(jj=0;jj<200;jj++);
}
void run_led() //跑马灯运行函数
{
while(*p!=0x00)
{
LED=*p; //将数组中数据取出赋给P1口
p++; //预取下一数据
delay(); //延迟
}
p=led_value;
}
char code SST516[3] _at_ 0x003b; //仿真器保留
main() //主函数
{
while(1)
run_led(); //上电即运行跑马灯程序
}
哈哈 !!!哈哈哈!!!!打字 打得手都是痛的 …………希望对你有所帮助……
热心网友
时间:2023-10-17 05:43
/*-----------------------------------------------
名称:IO口高低电平控制
论坛:www.doflye.net
编写:shifang
日期:2009.5
修改:无
内容:花样灯一般有两种方法实现:
1、程序循环执行
2、查表法
这里我们两种都使用一下
------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
/*------------------------------------------------
花样表格
------------------------------------------------*/
unsigned char code seg[]={0x7f,0xbf,0xdf,0xef,
0xf7,0xfb,0xfd,0xfe,
0xff,0xff,0x00,0x00,
0x55,0x55,0xaa,0xaa
};//rom允许情况可以无限添加
void Delay(unsigned int t); //函数声明
/*------------------------------------------------
主函数
------------------------------------------------*/
main()
{
unsigned char i; //定义一个无符号字符型
//局部变量 i 取值范围 0~255
while(1)
{
P1=0xFE; //第1个LED亮
for(i=0;i<8;i++)
{
Delay(20000);
P1 <<=1;
}
P1=0x7F; //第8个LED亮
for(i=0;i<8;i++)
{
Delay(20000);
P1 >>=1;
}
P1=0xFE; //第1个LED亮
for(i=0;i<8;i++)
{
Delay(20000);
P1 <<=1;
P1 |=0x01;
}
P1=0x7F; //第8个LED亮
for(i=0;i<8;i++)
{
Delay(20000);
P1 >>=1;
P1 |=0x80;
}
//下面通过查表方法获得花样参数
for(i=0;i<16;i++)//查表可以简单的显示各种花样 实用性更强
{
Delay(20000);
P1=seg[i];
}
}
}
/*------------------------------------------------
延时函数,含有输入参数 unsigned int t,无返回值
unsigned int 是定义无符号整形变量,其值的范围是
0~65535
------------------------------------------------*/
void Delay(unsigned int t)
{
while(--t);
}追问能不能帮我注释上面我的程序啊 TAT TAT TAT
参考资料:www.doflye.net 单片机爱好者论坛
热心网友
时间:2023-10-17 05:44
下面就是我要问的单片机程序。谢谢啦。尽量详细点啊!
4. 利用GP32模拟霓虹灯效果。用4位数码管作为显示屏,显示效果有:闪烁、从左到右、从右到左、从中间往两边、从两边往中间。各效果切换频率可由键盘设定,范围为0.1~5秒。
//-------------------------------------------------------------------------*
//工 程 名: *
//硬件连接: *
//程序描述: *
//目 的: *
//说 明: *
//日 期: *
//-------------------------------------------------------------------------*
#include "Includes.h" //总头文件
void delay(int n)
{
int i;
for(i=0;i<n;i++) ;
}
const unsigned char Table[16]={0x3F,0x06,0x5B,0x4F,0x66,
0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7c,0x39,0x5f,0x79,0x71}; //显示码表
int sec=0;
unsigned char key=0xff;
//Timer1Init:定时器初始化----------------------------------------*
//功能:将定时器初始化为一秒钟一次溢出中断。
//-------------------------------------------------------------------------*
void Timer1Init(void)
{
//不允许溢出中断、不启动计数、分频因子 = 64
T1SC=0b00100110;
//计数器寄存器初值=0x0000
T1CNTH=0x00; T1CNTL=0x00;
//1秒产生1次溢出中断,预置寄存器=1×(2457600/64)=9600
T1MODH=0x96; T1MODL=0x00;
}
char key_scan(void)
{ int i;
unsigned char line, row;
unsigned char k_value, key;
const unsigned char KBTable[] = {
0x77,'7',0x7B,'4',0x7D,'1',0x7E,'0',
0xB7,'B',0xBB,'F',0xBD,'2',0xBE,'A',
0xD7,'9',0xDB,'6',0xDD,'E',0xDE,'8',
0xE7,'C',0xEB,'D',0xED,'3',0xEE,'5',
0x00,0x00 };
// PTD0~PTD3输出0
PTD=PTD & 0xF0;
if ((PTD & 0xf0) == 0xf0)
return 0xff; //无键按下
row = PTD;
//延时,消除抖动
delay(100);
if (row != PTD)
return 0xff; //判为抖动,无键按下
line=0xFE;
for (i=0;i<4;i++)
{
PTD = line; //输出扫描信号
row=PTD; //读键盘口
if ((row & 0xf0) != 0xf0)
break;
line=(line<<1)+1;
}
if (i==4) return 0xff;
k_value = (row & 0xf0) | (line & 0x0f) ;
for (key=0; key<32; key+=2)
if (k_value == KBTable[key])
break;
return KBTable[key+1];
}
void shanshuo(unsigned char i)
{
while(sec<i)
{
PTC=0xf0;
PTB= Table[i];
delay(5000);
PTB=0x00;
delay(5000);
}
}
void LtoR(unsigned char i)
{
int j;
while(sec<i)
{
for(j=0;j<4;j++)
{
PTC= ~(0b00000001 << j);
PTB=Table[i];
delay(5000);
PTB=0x00;
delay(5000);
}
}
}
void RtoL(unsigned char i)
{
int j;
while(sec<i)
{
for(j=0;j<4;j++)
{
PTC= ~(0b00001000 >> j);
PTB=Table[i];
delay(5000);
PTB=0x00;
delay(5000);
}
}
}
void OtoI(unsigned char i)
{
int j;
while(sec<i)
{
PTC=0x06;
PTB=Table[i];
delay(5000);
PTB=0x00;
delay(5000);
PTC=0x09;
PTB=Table[i];
delay(5000);
PTB=0x00;
delay(5000);
}
}
void ItoO(unsigned char i)
{
int j;
while(sec<i)
{
PTC=0x09;
PTB=Table[i];
delay(5000);
PTB=0x00;
delay(5000);
PTC=0x06;
PTB=Table[i];
delay(5000);
PTB=0x00;
delay(5000);
}
}
void Timer1Over(void)
{
DisableMCUInt();
sec++; //秒加1
T1SC&= ~(1<<7); //清除定时器溢出标志位
EnableMCUInt();
}
void check(void)
{
if((T1SC & 0x80)==0x80)
{
sec++; //秒加1
T1SC&= ~(1<<7); //清除定时器溢出标志位
}
}
//主函数
void main()
{
unsigned char delaysec=2;
unsigned char key_scan(void);
int i,j;
void check(void);
void delay(int n);
DisableMCUInt(); //禁止总中断
MCUInit(); //芯片初始化
Timer1Init(); //定时器1的初始化
T1SC|=(1<<6); //令T1SC.6=1,开放Timer1溢出中断
T1SC &= ~(1<<5); //清T1SC.5,允许定时器1计数
EnableMCUInt(); //开总中断
//在此处添加用户程序
DDRD=0x0f, PTDPUE=0xf0; //PTD0~3输出,PTD4~7带上拉输入
DDRB = 0xff, DDRC = 0xff;
PTC = 0xf0, PTB = 0x40; //显示'-'
while(1)
{
key=key_scan();
if (key!=0xff)
{
if (key >='0' & key <='9')
{
delaysec = key - 0x30;
}
else
{
delaysec = key - 0x37;
}
}
sec=0;
shanshuo(delaysec);
sec=0;
LtoR(delaysec);
sec=0;
RtoL(delaysec);
sec=0;
OtoI(delaysec);
sec=0;
ItoO(delaysec);
sec=0;
}
}
热心网友
时间:2023-10-17 05:43
哈哈 这不难啊!!!!…………单片机的跑马灯程序主要用到了延时子程序,clr,lcall,ajmp 指令, 通过轮流点亮p1.0 …..P1.7 实现效果。你可以通过此程序的学习, 进一步掌握单片机的IO端口操作。
汇编语言参考程序:
org 0000h ;开始
ajmp loop
org 0080h ;到0030h处避开00-30的敏感地址
loop:
mov p1,#0ffh ;关闭所有灯
clr p1.0 ;点亮灯p1.0
lcall delay ;延时一段时间?
clr p1.1 ;点亮灯p1.1
lcall delay
clr p1.2 ;点亮灯p1.2
lcall delay
clr p1.3 ;点亮灯p1.3
lcall delay
clr p1.4 ;点亮灯p1.4
lcall delay
clr p1.5 ;点亮灯p1.5
lcall delay
clr p1.6 ;点亮灯p1.6
lcall delay
clr p1.7 ;点亮灯p1.7
lcall delay
AJMP LOOP ;到最开始loop处重新运行
delay: mov r5,#20 ;延时。
d1: mov r6,#40
d2: mov r7,#248
djnz r7,$
djnz r6,d2
djnz r5,d1
ret
end
c语言参考程序:
#include<reg51.h> //头文件
#define uchar unsigned char //宏定义,为方便编程
#define uint unsigned int
#define LED P1 //宏定义,将P1口定义为LED
uchar led_value[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x00}; //定义一数组,内存放跑马灯数据
uchar *p=led_value; //定义指针,指向跑马灯数组首地址
void delay() //延迟函数,与跑马灯跳动频率有关
{
uchar ii,jj;
for(ii=0;ii<200;ii++)
for(jj=0;jj<200;jj++);
}
void run_led() //跑马灯运行函数
{
while(*p!=0x00)
{
LED=*p; //将数组中数据取出赋给P1口
p++; //预取下一数据
delay(); //延迟
}
p=led_value;
}
char code SST516[3] _at_ 0x003b; //仿真器保留
main() //主函数
{
while(1)
run_led(); //上电即运行跑马灯程序
}
哈哈 !!!哈哈哈!!!!打字 打得手都是痛的 …………希望对你有所帮助……
热心网友
时间:2023-10-17 05:43
/*-----------------------------------------------
名称:IO口高低电平控制
论坛:www.doflye.net
编写:shifang
日期:2009.5
修改:无
内容:花样灯一般有两种方法实现:
1、程序循环执行
2、查表法
这里我们两种都使用一下
------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
/*------------------------------------------------
花样表格
------------------------------------------------*/
unsigned char code seg[]={0x7f,0xbf,0xdf,0xef,
0xf7,0xfb,0xfd,0xfe,
0xff,0xff,0x00,0x00,
0x55,0x55,0xaa,0xaa
};//rom允许情况可以无限添加
void Delay(unsigned int t); //函数声明
/*------------------------------------------------
主函数
------------------------------------------------*/
main()
{
unsigned char i; //定义一个无符号字符型
//局部变量 i 取值范围 0~255
while(1)
{
P1=0xFE; //第1个LED亮
for(i=0;i<8;i++)
{
Delay(20000);
P1 <<=1;
}
P1=0x7F; //第8个LED亮
for(i=0;i<8;i++)
{
Delay(20000);
P1 >>=1;
}
P1=0xFE; //第1个LED亮
for(i=0;i<8;i++)
{
Delay(20000);
P1 <<=1;
P1 |=0x01;
}
P1=0x7F; //第8个LED亮
for(i=0;i<8;i++)
{
Delay(20000);
P1 >>=1;
P1 |=0x80;
}
//下面通过查表方法获得花样参数
for(i=0;i<16;i++)//查表可以简单的显示各种花样 实用性更强
{
Delay(20000);
P1=seg[i];
}
}
}
/*------------------------------------------------
延时函数,含有输入参数 unsigned int t,无返回值
unsigned int 是定义无符号整形变量,其值的范围是
0~65535
------------------------------------------------*/
void Delay(unsigned int t)
{
while(--t);
}追问能不能帮我注释上面我的程序啊 TAT TAT TAT
参考资料:www.doflye.net 单片机爱好者论坛
热心网友
时间:2023-10-17 05:44
下面就是我要问的单片机程序。谢谢啦。尽量详细点啊!
4. 利用GP32模拟霓虹灯效果。用4位数码管作为显示屏,显示效果有:闪烁、从左到右、从右到左、从中间往两边、从两边往中间。各效果切换频率可由键盘设定,范围为0.1~5秒。
//-------------------------------------------------------------------------*
//工 程 名: *
//硬件连接: *
//程序描述: *
//目 的: *
//说 明: *
//日 期: *
//-------------------------------------------------------------------------*
#include "Includes.h" //总头文件
void delay(int n)
{
int i;
for(i=0;i<n;i++) ;
}
const unsigned char Table[16]={0x3F,0x06,0x5B,0x4F,0x66,
0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7c,0x39,0x5f,0x79,0x71}; //显示码表
int sec=0;
unsigned char key=0xff;
//Timer1Init:定时器初始化----------------------------------------*
//功能:将定时器初始化为一秒钟一次溢出中断。
//-------------------------------------------------------------------------*
void Timer1Init(void)
{
//不允许溢出中断、不启动计数、分频因子 = 64
T1SC=0b00100110;
//计数器寄存器初值=0x0000
T1CNTH=0x00; T1CNTL=0x00;
//1秒产生1次溢出中断,预置寄存器=1×(2457600/64)=9600
T1MODH=0x96; T1MODL=0x00;
}
char key_scan(void)
{ int i;
unsigned char line, row;
unsigned char k_value, key;
const unsigned char KBTable[] = {
0x77,'7',0x7B,'4',0x7D,'1',0x7E,'0',
0xB7,'B',0xBB,'F',0xBD,'2',0xBE,'A',
0xD7,'9',0xDB,'6',0xDD,'E',0xDE,'8',
0xE7,'C',0xEB,'D',0xED,'3',0xEE,'5',
0x00,0x00 };
// PTD0~PTD3输出0
PTD=PTD & 0xF0;
if ((PTD & 0xf0) == 0xf0)
return 0xff; //无键按下
row = PTD;
//延时,消除抖动
delay(100);
if (row != PTD)
return 0xff; //判为抖动,无键按下
line=0xFE;
for (i=0;i<4;i++)
{
PTD = line; //输出扫描信号
row=PTD; //读键盘口
if ((row & 0xf0) != 0xf0)
break;
line=(line<<1)+1;
}
if (i==4) return 0xff;
k_value = (row & 0xf0) | (line & 0x0f) ;
for (key=0; key<32; key+=2)
if (k_value == KBTable[key])
break;
return KBTable[key+1];
}
void shanshuo(unsigned char i)
{
while(sec<i)
{
PTC=0xf0;
PTB= Table[i];
delay(5000);
PTB=0x00;
delay(5000);
}
}
void LtoR(unsigned char i)
{
int j;
while(sec<i)
{
for(j=0;j<4;j++)
{
PTC= ~(0b00000001 << j);
PTB=Table[i];
delay(5000);
PTB=0x00;
delay(5000);
}
}
}
void RtoL(unsigned char i)
{
int j;
while(sec<i)
{
for(j=0;j<4;j++)
{
PTC= ~(0b00001000 >> j);
PTB=Table[i];
delay(5000);
PTB=0x00;
delay(5000);
}
}
}
void OtoI(unsigned char i)
{
int j;
while(sec<i)
{
PTC=0x06;
PTB=Table[i];
delay(5000);
PTB=0x00;
delay(5000);
PTC=0x09;
PTB=Table[i];
delay(5000);
PTB=0x00;
delay(5000);
}
}
void ItoO(unsigned char i)
{
int j;
while(sec<i)
{
PTC=0x09;
PTB=Table[i];
delay(5000);
PTB=0x00;
delay(5000);
PTC=0x06;
PTB=Table[i];
delay(5000);
PTB=0x00;
delay(5000);
}
}
void Timer1Over(void)
{
DisableMCUInt();
sec++; //秒加1
T1SC&= ~(1<<7); //清除定时器溢出标志位
EnableMCUInt();
}
void check(void)
{
if((T1SC & 0x80)==0x80)
{
sec++; //秒加1
T1SC&= ~(1<<7); //清除定时器溢出标志位
}
}
//主函数
void main()
{
unsigned char delaysec=2;
unsigned char key_scan(void);
int i,j;
void check(void);
void delay(int n);
DisableMCUInt(); //禁止总中断
MCUInit(); //芯片初始化
Timer1Init(); //定时器1的初始化
T1SC|=(1<<6); //令T1SC.6=1,开放Timer1溢出中断
T1SC &= ~(1<<5); //清T1SC.5,允许定时器1计数
EnableMCUInt(); //开总中断
//在此处添加用户程序
DDRD=0x0f, PTDPUE=0xf0; //PTD0~3输出,PTD4~7带上拉输入
DDRB = 0xff, DDRC = 0xff;
PTC = 0xf0, PTB = 0x40; //显示'-'
while(1)
{
key=key_scan();
if (key!=0xff)
{
if (key >='0' & key <='9')
{
delaysec = key - 0x30;
}
else
{
delaysec = key - 0x37;
}
}
sec=0;
shanshuo(delaysec);
sec=0;
LtoR(delaysec);
sec=0;
RtoL(delaysec);
sec=0;
OtoI(delaysec);
sec=0;
ItoO(delaysec);
sec=0;
}
}
求51单片机8个LED灯实现跑马灯左移的c语言程序??求每部的详细说明,好的...
如果电路是P1口控制LED,高电平灯亮:include "reg52.h"define uchar unsigned char void delay(void ){ uchar i,y;for(i=100;i>0;i--){ y=200;while(y--);} } void main(void){ uchar i;uchar var=0x01;P1=0X00;while(1){ for(i=0;i<7;i++){ P1= var;delay();var <<...
高手们!帮帮忙看看我的单片机跑马灯程序哪出问题了!!!
两个键盘都不按,显示第三种模式。你原来只是在起动的时候,按键才管用,要想更换模式,必须重新起动。现在增加了三行:“LJMP START ;本行可删除”,就可以在运行期间,更换模式。.ORG 0000H START:MOV P1, #255 CLR P1.6 MOV P2, #0 SETB P2.1 SETB P2.3 JNB P1.0, LOOPB J...
求个89c51单片机 汇编语言设计的LED跑马灯的程序
ajmp loop ; 跳转main继续循环 delay: mov r5,#20 ;延时子程序1闪烁灯调用 d1:mov r6,#20 d2: mov r7,#250 djnz r7,djnz r6,d2 djnz r5,d1(时间此处可自行设置)
哪你们学了多久才学会单片机啊!我早两年就想学了,可是到现在还是不会...
区别,能自己动手搭一个单片机的最小系统,然后就可以直接从程序入手,程序最好还是用 C 语言编程,从简单的跑马灯做起,逐渐深入,陆续可以做一些数码管、液晶、 DS1302 、 DS18B20 等电子元器件的应用,在深入就可以结合一些具体实例扩展一些中断、串口通讯等功能。
请给我翻译一下这个单片机51的程序(加注释)
LJMP MAIN ;转主程序MAIN org 0003h ;指定程序存放的地址 ljmp int0 ;转中断入口INT0 org 000Bh ;指定程序存放的地址 ljmp timer0 ;转定时中断入口timer0 MAIN: ;主程序 MOV SP,#60h ;设栈底60H mov TCON,#00000001b ;mov IE,#10000011b ;开中断 START: ;开始 mov A,#0fh ;送0F到A...
单片机流水灯程序,烧到单片机里,8个灯全亮,是怎么回事,下面使程序...
我有更好的答案推荐于2017-12-15 11:45:02 最佳答案 你这程序写得太复杂了吧,延时位置不对,主循环程序改成下面这样才行。while(1){ if(i!=8) { P2=table[i]; i++; while(num<100);num=0; } else i=0;}还有:c3344c指出的:ET1=1;//这一行应改成ET0 = 1;TR1=1; //这一行应改成...