网上有关“单片机大一19个实验代码?”话题很是火热,小编也是针对单片机大一19个实验代码?寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。
您好:手机麻将有挂是真的吗这款游戏可以开挂,确实是有挂的,咨询加微信【】很多玩家在这款游戏中打牌都会发现很多用户的牌特别好,总是好牌,而且好像能看到其他人的牌一样。所以很多小伙伴就怀疑这款游戏是不是有挂,实际上这款游戏确实是有挂的
1.手机麻将有挂是真的吗这款游戏可以开挂,确实是有挂的,通过添加客服微信
2.咨询软件加微信【】在"设置DD功能DD微信手麻工具"里.点击"开启".
3.打开工具.在"设置DD新消息提醒"里.前两个选项"设置"和"连接软件"均勾选"开启"(好多人就是这一步忘记做了)
4.打开某一个微信组.点击右上角.往下拉."消息免打扰"选项.勾选"关闭"(也就是要把"群消息的提示保持在开启"的状态.这样才能触系统发底层接口)
实验一
实验(一):本程序的功能是点亮一个发光二极管
#include<reg51.h>
sbit led=P1^0;
void main()
{
led=0;
while(1);
}
实验(二):本程序的功能是点亮一个发光二极管
#include<reg51.h>
Void main()
{
P1=0xfe;
While(1)
}
实验(三):本程序的功能是点亮三个发光二极管
#include <reg51.h>
Sbit LED0=P1^0;
Sbit LED1=P1^1;
Sbit LED2=P1^2;
Void main()
{
LED0=0;
LED1=0;
LED2=0;
While(1);
}
实验(四):本程序的功能是点亮三个发光二极管
#include <reg51.h>
Void main()
{
P1=0xf8;
While(1)
}
实验二
实验(一):本程序的功能是使D0交替闪烁,频率始终一致
#include<reg51.h>
sbit LED0=P1^0;
void Delay(unsigned int t);
void main()
{
while(1)
{
LED0=0;
Delay(10000);
LED0=1;
Delay(10000);
}
}
void Delay(unsigned int t)
{
while(--t);
}
实验(二):本程序的功能是使D0交替闪烁,前10次的闪烁频率与后10次不同
#include<reg51.h>
sbit LED0=P1^0;
void Delay(unsigned int t);
void main()
{
Unsigned char i;
while(1)
{
For(i=0;i<10;i++)
{
LED0=0;
Delay(10);
LED0=1;
Delay=(10);
}
For(i=0;i<10;i++)
{
LED0=0;
Delay(6000);
LED0=1;
Delay(6000);
}
}
}
Void Delay(unsigned int t)
{
Unsigned i,j;
For(i=0;i<t;i++)
For(j=0;j<1000;j++)
}
实验(三):本程序的功能是使D0、D2、D4交替闪烁,前10次的闪烁频率与后10次不同
#include<reg51.h>
sbit LED0=P1^0;
sbit LED2=P1^2;
sbit LED4=P1^4;
void Delay(unsigned int t);
void main()
{
Unsigned char i;
while(1)
{
For(i=0;i<10;i++)
{
LED0=0;
LED2=0;
LED4=0;
Delay(100);
LED0=1;
LED2=1;
LED4=1;
Delay=(100);
}
For(i=0;i<10;i++)
{
LED0=0;
LED2=0;
LED4=0;
Delay(1000);
LED0=1;
LED2=1;
LED4=1;
Delay(1000);
}
}
}
Void Delay(unsigned int t)
{
Unsigned i,j;
For(i=0;i<t;i++)
For(j=0;j<1000;j++)
}
实验(四):本程序的功能是使D0、D2、D4交替闪烁,前10次的闪烁频率与后10次不同
#include<reg51.h>
void Delay(unsigned int t);
void main()
{
Unsigned char i;
while(1)
{
For(i=0;i<10;i++)
{
P1=0xff;
Delay(100);
P1=0xea;
Delay=(100);
}
For(i=0;i<10;i++)
{
P1=0xff;
Delay(1000);
P1=0xea;
Delay(1000);
}
}
}
Void Delay(unsigned int t)
{
Unsigned i,j;
For(i=0;i<t;i++)
For(j=0;j<1000;j++)
}
实验三
实验(一):Proteus本程序的功能是使D0-D7从右至左依次被点亮
#include<reg51.h>
void Delay(unsigned int t);
void main()
{
unsigned char i;
Delay(50000);
P1=0xff;
for(i=0;i<8;i++)
{
Delay(50000);
P1<<=1;
}
while(1)
;
}
void Delay(unsigned int t)
{
while(--t);
}
实验(二):本程序的功能是使D0-D7从左至右依次被点亮
#include<reg51.h>
void Delay(unsigned int t);
void main()
{
unsigned char i;
Delay(50000);
P1=0xff;
for(i=0;i<8;i++)
{
Delay(50000);
P1>>=1;
}
while(1)
;
}
void Delay(unsigned int t)
{
while(--t);
}
实验四
实验(一):本程序的功能是使D0-D7从有至左被点亮,某时刻只有一个灯亮,最终D7在亮
#include<reg51.h>
#include<intrins.h>
void delay(unsigned int t);
void main()
{
unsigned char i;
P1=0xfe;
delay(50000);
for(i=0;i<7;i++)
{
P1=crol_(P1,1);
delay(50000);
}
while(1)
;
}
void delay(unsigned int t)
{
while(--t);
}
实验(二):本程序的功能是使D0-D7从有至左被点亮,某时刻只有一个灯亮,最终D0在亮
#include<reg51.h>
#include<intrins.h>
void delay(unsigned int t);
void main()
{
unsigned char i;
P1=0x7f;
delay(50000);
for(i=0;i<7;i++)
{
P1=_crol_(P1,1);
delay(50000);
}
while(1);
}
void delay(unsigned int t)
{
while(--t);
}
实验五
#include<reg51.h>
sbit K0=P1^0;
sbit K1=P1^1;
sbit LED0=P1^2;
sbit LED1=P1^3;
void main()
{
while(1)
{
if(K0==1)
LED0=1;
else
LED0=0;
if(K1==1)
LED1=1;
else
LED1=0;
}
}
实验六
(1)实验箱程序清单
#include<reg51.h>
sbit K0=P0^0;
sbit lemp=P1^0;
void main()
{
while(1)
{
if(K0==0)
lemp=0;
else
lemp=1;
}
}
2.Proteus 仿真程序清党
#include<reg51.h>
sbit K0=P0^0;
sbit lamp=P3^0;
void main()
{
While(1)
{
if(K0==0)
lamp=0;
else
lamp=1;
}
}
实验七
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit K0=P1^0;
void delay(uint x)
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<1000;j++)
;
}
void main()
{
while(1)
{
K0=1;
delay(50);
K0=0;
delay(50);
}
}
实验十
(1)仿真一程序清单
#include<reg51.h>
sbit sdata=P1^0;
sbit clk=P1^1;
void delay(unsigned int x)
{
unsigned int I,j;
for(i=0;i<x;i++)
for(j=0;i<60000;i++)
}
void write_74ls164(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
Clk=0;
sdata=dat&0x01;
clk=1;
delay(50000);
dat=dat>>1;
}
}
void main()
{
write_74ls164(0x01);
while(1);
}
(2)仿真二程序清单
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit sda=P1^0;
sbit clk=P1^1;
void write_741s164(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
clk=0;
sda=dat&0x01;
clk=1;
dat=dat>>1;
}
}
void delay(uint x)
{
uchar y;
for(;x>0;x--)
for(y=1000;y>0;y--);
}
void main()
{
while(1)
{
write_741s164(0xff);
delay(1000);
}
}
(3)仿真三程序清单
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit sda=P1^0;
sbit clk=P1^1;
uchar a[2]={0xff,0xf6};
void write_741s164(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
clk=0;
sda=dat&0x01;
clk=1;
dat=dat>>1;
}
}
void delay(uint x)
{
uchar y;
for(;x>0;x--)
for(y=1000;y>0;y--);
}
void main()
{
while(1)
{
write_741s164(a[0]);
write_741s164(a[1]);
delay(1000);
}
}
(4)实验箱程序清单
#include<reg51.h》
#define uchar unsigned char
#define uint unsigned int
sbit sda=P1^0;
sbit clk=P1^1;
uchar a[5]={0xfe,0xfc,0x9c,0xb6,0x60};
void write_74ls164(uchar dat)
{
uchar I;
for(i=0;i<8;i++)
{
clk=0;
sda=dat&0x01;
clk=1;
dat=dat>>1;
}
}
void delayls(uint x)
{
uchar y;
for(;x>0;x--)
for(y=1000;y>0;y--)
}
void main()
{
while(1)
{
write_74ls164(a[0]);
write_74ls164(a[1]);
write_74ls164(a[2]);
write_74ls164(a[3]);
write_74ls164(a[4]);
delayls(3000);
}
}
实验十一
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar duanma[6]={0x06,0x7d,0x7f,0x06,0x7d,0x7f};
uchar weima[6]={0x20,0x10,0x08,0x04,0x02,0x01};
void dealy(uint x)
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<1000;j++);
}
void main()
{
uchar i;
while (1)
{
for(i=0;i<6;i++)
{
P0=duanma[i];
P1=weima[i];
dealy(80);
}
}
}
实验十二
#include<reg51.h>
void main(){
unsigned char x;
while(1)
{
x=P1;
switch(x)
{
case 0xfe:P2=0x3f;break;
case 0xfd:P2=0x06;break;//84218421
case 0xfb:P2=0x5b;break;//2 01011011
case 0xf7:P2=0x4f;break;//3 01001111
case 0xef:P2=0x66;break;//4 01100110
case 0xdf:P2=0x6b;break;//5 01101101
case 0xbf:P2=0x7d;break;//6 01111101
case 0x7f:P2=0x07;break;
}
}
}
实验十三
#include<reg51.h>
#define GPIO_KEY P1
unsigned char m[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char KeyValue;
void ys(unsigned int c);
void KeyDown();
void main()
{
while(1)
{
KeyDown();
P2=m[KeyValue];
ys(25);
}
}
void KeyDown()
{
char a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)
{
ys(1);
if(GPIO_KEY!=0x0f)
{
GPIO_KEY=0xf0;
switch(GPIO_KEY)
{
case(0xe0): KeyValue=0;break;
case(0xd0): KeyValue=1;break;
case(0xb0): KeyValue=2;break;
case(0x70): KeyValue=3;break;
}
GPIO_KEY=0x0f;
switch(GPIO_KEY)
{
case(0x0e): KeyValue=KeyValue;break;
case(0x0d): KeyValue=KeyValue+4;break;
case(0x0b): KeyValue=KeyValue+8;break;
case(0x07): KeyValue=KeyValue+12;break;
}
while((a<50)&&(GPIO_KEY!=0x0f))
{
ys(1);
a++;
}
}
}
}
void ys(unsigned int c)
{
unsigned char a,b;
for(;c>0;c--)
{
for(b=38;b>0;b--)
{
for(a=130;a>0;a--)
;
}
}
}
实验十四
#include<reg51.h>
sbit sz=P3^4;
void delay(unsigned int x)
{
unsigned int i,j;
for(i=0;i<x;i++)
for(j=0;j<1000;j++);
}
void main()
{
TMOD=0X05;
TH0=0;
TL0=0;
TR0=1;
while(1)
{
P1=TL0;
delay(0);
}
}
实验十五
(1)中断方式
#include<reg51.h>
sbit led=P1^0;
unsigned int counter;
void timer0_inter()interrupt 1
{
counter++;
}
void main()
{
led=1;
TH0=0x9c;
TL0=0x9c;
TMOD=0X02;
ET0=1;
EA=1;
TR0=1;
while(1)
{
if(counter==10000)
{
counter=0;
led=~led;
}
}
}
(2)非中断方式:
#include<reg51.h>
sbit led=P1^0;
void timer0(unsigned int x)
{
unsigned int i=0;
TH0=0x9c;
TL0=0x9c;
TR0=1;
while(i<x)
{
while(TF0==0)
i++;
TF0=0;
}
}
void main()
{
Led=1;
TMOD=0x02;
while(1)
{
led=0;
timer0(10000);
led=1;
timer0(10000);
}
}
实验十六
#include<reg51.h>
sbit P1_0=P1^0;
sbit P1_1=P1^1;
void delay();
void main()
{
P1_0=0;
P1_1=0;
EA=1;
IT0=1;
EX0=1;
while(1)
{
P1_1=0;
delay();
P1_1=1;
delay();
}
}
void int0() interrupt 0
{
bit saveled;
EA=0;
saveled=P1_1;
P1_0=!P1_0;
delay();
delay();
delay();
P1_1=saveled;
EA=1;
}
void delay()
{
unsigned int m,n;
for(m=0;m<250;m++)
for(n=0;n<255;n++)
;
}
实验十七
#include<reg51.h>
void delay();
void right();
void main()
{
P1=0xff;
EA=1;
IT0=1;
EX0=1;
while(1)
{
right();
}
}
void int0() interrupt 0
{
unsigned char saveled,i;
EA=0;
saveled=P1;
P1=0xff;
for(i=0;i<10;i++)
{
P1=~P1;
delay();
}
P1=saveled;
EA=1;
}
void right()
{
unsigned char i,k;
k=0x80;
for(i=0;i<8;i++)
{
P1=~k;
delay();
k>>=1;
}
}
void delay()
{
unsigned int m,n;
for(m=0;m<250;m++)
for(n+0;n<255;n++)
;
}
实验十八
#include<reg51.h>
sbit led1=P1^0;
sbit led2=P1^1;
void delayls();
void main()
{
EA=1;
IT0=1;
EX0=1;
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
TR0=1;
while(1)
{
led1=0;
delayls();
led1=1;
led2=0;
delayls();
led2=1;
}
}
void int0() interrupt 0
{
unsigned char saveled;
EA=0;
saveled=P1;
led1=1;
led2=0;
delayls();
delayls();
delayls();
delayls();
led2=1;
P1=saveled;
EA=1;
}
void delayls()
{
unsigned char i=0;
while(i!=20)
{
if(TF0==1)
{
i++;
TH0=0x3c;
TL0=0xb0;
TF0=0;
}
}
}
实验十八
#include<reg51.h>
sbit led1=P1^0;
sbit led2=P1^1;
void delayls();
void main()
{
EA=1;
IT0=1;
EX0=1;
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
TR0=1;
while(1)
{
P1_0=0;
delayls();
P1_0=1;
P1_1=0;
delayls();
P1_1=1;
}
}
void int0() interrupt 0
{
unsigned char saveled;
EA=0;
saveled=P1;
P1_0=1;
P1_1=0;
delayls();
delayls();
delayls();
delayls();
P1_1=1;
P1=saveled;
EA=1;
}
void delayls()
{
unsigned char i=0;
while(i!=20)
{
if(TF0==1)
{
i++;
TH0=0x3c;
TL0=0xb0;
TF0=0;
}
}
}
实验二十
(1)串口以工作方式1实现数据收发
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
void delay(uint x)
{
uint y,z;
for(y=x;y>0;y--)
for(z=250;z>0;z--)
;
}
void timer1_int()
{
TMOD=0x20;
TL1=0xfd;
TH1=0xfd;
TR1=1;
}
void serial_int()
{
PCON=0;
SCON=0x40;
}
void main()
{
uchar send_data=0;
uchar i=0;
timer1_int();
serial_int();
IE=0x00;
while(1)
{
send_data='A';
for(i=0;i<26;i++)
{
SBUF=send_data;
while(TI==0)
;
TI=0;
send_data++;
delay(1000);
}
delay(6000);
}
}
(2)89c51点对点通讯
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit P2_0=P2^0;
sbit P2_1=P2^1;
uchar led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar num;
void delay(uchar x)
{
uchar y,z;
for(y=x;y>0;y--)
for(z=250;z>0;z++)
}
void display(uchar num)
{
P2_0=0;
P0=~led[num/10];
delay(5);
P2_0=1;
P2_1=0;
P0=~led[num%10];
delay(5);
P2_1=1;
}
void TAKE_SBUF(uchar dat)
{
ES=0;
SUBF=dat;
while(~TI)
TI=0;
ES=1;
}
void main()
{
SCON=0x90;
EA=1;
ES=1;
P2=0xff;
num=0;
TAKE_SUBF(num+1);
while(1)
}
void intorupt()interrupt 4
{
uchar num;
Uchar i;
RI=0;
num=SUBF;
if(num>99)
Num=0;
for(i=100;i>0;i--)
display(num);
TAKE_SBUF(num+1);
}
实验二十三
#include<reg51.h>
#define ZHK P0
#define ZLK P1
#define uchar unsigned char
#define uint unsigned int
uchar h1[]={0xf7,0xef};
uchar l1[]={0x18,0x18};
uchar h2[]={0xfb,0xf7,0xef,0xdf};
uchar l2[]={0x3c,0x24,0x24,0x3c};
uchar h3[]={0xfd,0xfb,0xf7,0xef,0xdf,0xbf};
uchar l3[]={0x7e,0x42,0x42,0x42,0x42,0x7e};
uchar h4[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar l4[]={0xff,0x81,0x81,0x81,0x81,0x81,0x81,0xff};
void delay(uchar x)
{
uchar y,z;
for(y=x;y>0;y--)
for(z=250;z>0;z--)
;
}
void main()
{
uchar i;
while(1)
{
for(i=0;i<2;i++)
{
ZHK=h1[i];
ZLK=l1[i];
delay(5);
}
delay(100);
for(i=0;i<4;i++)
{
ZHK=h2[i];
ZLK=l2[i];
delay(5);
}
delay(100);
for(i=0;i<6;i++)
{
ZHK=h3[i];
ZLK=l3[i];
delay(5);
}
delay(100);
for(i=0;i<8;i++)
{
ZHK=h4[i];
ZLK=l4[i];
delay(5);
}
delay(100);
}
}
实验二十四
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit lcde=P1^0;
sbit lcdrs=P1^1;
uchar i;
uchar a1[]="Welcome to ";
uchar a2[]="an zhi yuan";
void chushihua();
void write_c(uchar c);
void write_d(uchar d);
void delay(uint x);
void main()
{
chushihua();
write_c(0x80+0x00);
for(i=0;i<11;i++)
{
write_d(a1[i]);
delay(10);
}
write_c(0x80+0x41);
for(i=0;i<11;i++)
{
write_d(a2[i]);
delay(10);
}
for(i=0;i<3;i++)
{
write_c(0x18);
delay(10);
}
while(1)
;
}
void chushihua()
{
lcde=0;
write_c(0x38);
write_c(0x0f);
write_c(0x01);
write_c(0x06);
}
void write_c(uchar c)
{
lcdrs=0;
P2=c;
delay(2);
lcde=1;
delay(5);
lcde=0;
delay(2);
}
void write_d(uchar d)
{
lcdrs=1;
P2=d;
delay(2);
lcde=1;
delay(5);
lcde=0;
delay(2);
}
void delay(uint x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=120;j>0;j--)
;
}
单片机C语言程序设计实训100例:基于PIC+Proteus仿真的目录
你好! 给你两个份实例 基本可以搞定啦 !
一。。。。流水灯实例
1. 基础知识:寻址方式是寻找、确定参与操作的数据的地址的方式。8051单片机的寻址方式包括寄存器寻址、直接寻址、寄存器间接寻址、立即寻址、变址寻址和位寻址7种寻址方式。
2. 硬件电路(等级不够还不能传哈)
3. 软件程序设计:
ORG 0000H ;伪指令,指定程序从0000H开始存放
LJMP MAIN; 跳转指令,程序跳转到MAIN处
ORG 0100H ;伪指令,指定以下程序从0100H开始存放
MAIN:
MOV SP,#60H ;给堆栈指针赋初值
MOV P1,#0FFH ;给P1赋初值,LED全灭
;以下为查表程序
MOV DPTR,#LED_TABLE
LIGHT:
MOV R7,#42
LOOP:
MOV A,#42
SUBB A,R7
MOVC A,@A+DPTR
MOV P1,A ;输出显示
LCALL DELAY ;调延时子程序
DJNZ R7,LOOP
SJMP LIGHT ;跳转,程序继续
DELAY:
MOV R7,#10H
DELAY0:
MOV R6,#7FH
DELAY1:
MOV R5,#7FH
DJNZ R5,$
DJNZ R6,DELAY1
DJNZ R7,DELAY0
RET
;表格数据
LED_TABLE:
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 , 01BH , 000H , 000H , 018H , 03CH, 07EH ;从两边叠加后递减
DB 000H ;全部点亮
END
4. 运行结果
程序运行后,将依次循环出现8只LED依次逐个点亮 、依次逐个叠加、依次逐个递减、从两边靠拢后分开、从两边叠加后递减的流水灯效果。
5. 技巧总结
查表指令可用于复杂代码转换显示,通过查表指令可以实现复杂的显示效果,并可以减少程序代码。
二 。。。。用单片机控制的LED流水灯设计(电路、程序全部给出)
1.引言
当今时代是一个新技术层出不穷的时代,在电子领域尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统,正以前所未见的速度被单片机智能控制系统所取代。单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。目前,一个学习与应用单片机的高潮正在工厂、学校及企事业单位大规模地兴起。学习单片机的最有效方法就是理论与实践并重,本文笔者用AT89C51单片机自制了一款简易的流水灯,重点介绍了其软件编程方法,以期给单片机初学者以启发,更快地成为单片机领域的优秀人才。
2.硬件组成
按照单片机系统扩展与系统配置状况,单片机应用系统可分为最小系统、最小功耗系统及典型系统等。AT89C51单片机是美国ATMEL公司生产的低电压、高性能CMOS
8位单片机,具有丰富的内部资源:4kB闪存、128BRAM、32根I/O口线、2个16位定时/计数器、5个向量两级中断结构、2个全双工的串行口,具有4.25~5.50V的电压工作范围和0~24MHz工作频率,使用AT89C51单片机时无须外扩存储器。因此,本流水灯实际上就是一个带有八个发光二极管的单片机最小应用系统,即为由发光二极管、晶振、复位、电源等电路和必要的软件组成的单个单片机。其具体硬件组成如图1所示。
图1 流水灯硬件原理图
从原理图中可以看出,如果要让接在P1.0口的LED1亮起来,那么只要把P1.0口的电平变为低电平就可以了;相反,
如果要接在P1.0口的LED1熄灭,就要把P1.0口的电平变为高电平;同理,接在P1.1~P1.7口的其他7个LED的点亮和熄灭的方法同LED1。因此,要实现流水灯功能,我们只要将发光二极管LED1~LED8依次点亮、熄灭,8只LED灯便会一亮一暗的做流水灯了。在此我们还应注意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很短,我们在控制二极管亮灭的时候应该延时一段时间,否则我们就看不到“流水”效果了。
3.软件编程
单片机的应用系统由硬件和软件组成,上述硬件原理图搭建完成上电之后,我们还不能看到流水灯循环点亮的现象,我们还需要告诉单片机怎么来进行工作,即编写程序控制单片机管脚电平的高低变化,来实现发光二极管的一亮一灭。软件编程是单片机应用系统中的一个重要的组成部分,是单片机学习的重点和难点。下面我们以最简单的流水灯控制功能即实现8个LED灯的循环点亮,来介绍实现流水灯控制的几种软件编程方法。
3.1位控法
这是一种比较笨但又最易理解的方法,采用顺序程序结构,用位指令控制P1口的每一个位输出高低电平,从而来控制相应LED灯的亮灭。程序如下:
ORG 0000H ;单片机上电后从0000H地址执行
AJMP START ;跳转到主程序存放地址处
ORG 0030H ;设置主程序开始地址
START:MOV SP,#60H ;设置堆栈起始地址为60H
CLR P1.0 ;P1.0输出低电平,使LED1点亮
ACALL DELAY ;调用延时子程序
SETB P1.0 ;P1.0输出高电平,使LED1熄灭
CLR P1.1 ;P1.1输出低电平,使LED2点亮
ACALL DELAY ;调用延时子程序
SETB P1.1 ;P1.1输出高电平,使LED2熄灭
CLR P1.2 ;P1.2输出低电平,使LED3点亮
ACALL DELAY ;调用延时子程序
SETB P1.2 ? ;P1.2输出高电平,使LED3熄灭
CLR P1.3 ;P1.3输出低电平,使LED4点亮
ACALL DELAY ;调用延时子程序
SETB P1.3 ;P1.3输出高电平,使LED4熄灭
CLR P1.4 ;P1.4输出低电平,使LED5点亮
ACALL DELAY ;调用延时子程序
SETB P1.4 ;P1.4输出高电平,使LED5熄灭
CLR P1.5 ;P1.5输出低电平,使LED6点亮
ACALL DELAY ;调用延时子程序
SETB P1.5 ;P1.5输出高电平,使LED6熄灭
CLR P1.6 ;P1.6输出低电平,使LED7点亮
ACALL DELAY ;调用延时子程序
SETB P1.6 ;P1.6输出高电平,使LED7熄灭
CLR P1.7 ;P1.7输出低电平,使LED8点亮
ACALL DELAY ;调用延时子程序
SETB P1.7 ;P1.7输出高电平,使LED8熄灭
ACALL DELAY ;调用延时子程序
AJMP START ;8个LED流了一遍后返回到标号START处再循环
DELAY: ;延时子程序
MOV R0,#255 ;延时一段时间
D1: MOV R1,#255
DJNZ R1,$
DJNZ R0,D1
RET ;子程序返回
END ;程序结束
3.2循环移位法
在上个程序中我们是逐个控制P1端口的每个位来实现的,因此程序显得有点复杂,下面我们利用循环移位指令,采用循环程序结构进行编程。我们在程序一开始就给P1口送一个数,这个数本身就让P1.0先低,其他位为高,然后延时一段时间,再让这个数据向高位移动,然后再输出至P1口,这样就实现“流水”效果啦。由于8051系列单片机的指令中只有对累加器ACC中数据左移或右移的指令,因此实际编程中我们应把需移动的数据先放到ACC中,让其移动,然后将ACC移动后的数据再转送到P1口,这样同样可以实现“流水”效果。具体编程如下所示,程序结构确实简单了很多。
ORG 0000H ;单片机上电后从0000H地址执行
AJMP START ;跳转到主程序存放地址处
ORG 0030H ;设置主程序开始地址
START:MOV SP,#60H ;设置堆栈起始地址为60H
MOV A,#0FEH ;ACC中先装入LED1亮的数据(二进制的11111110)
MOV P1,A ;将ACC的数据送P1口
MOV R0,#7 ;将数据再移动7次就完成一个8位流水过程
LOOP: RL A ;将ACC中的数据左移一位
MOV P1,A ;把ACC移动过的数据送p1口显示
ACALL DELAY ;调用延时子程序
DJNZ R0,LOOP ;没有移动够7次继续移动
AJMP START ;移动完7次后跳到开始重来,以达到循环流动效果
DELAY: ;延时子程序
MOV R0,#255 ;延时一段时间
D1: MOV R1,#255
DJNZ R1,$
DJNZ R0,D1
RET ;子程序返回
END ;程序结束
3.3查表法
上面的两个程序都是比较简单的流水灯程序,“流水”花样只能实现单一的“从左到右”流方式。运用查表法所编写的流水灯程序,能够实现任意方式流水,而且流水花样无限,只要更改流水花样数据表的流水数据就可以随意添加或改变流水花样,真正实现随心所欲的流水灯效果。我们首先把要显示流水花样的数据建在一个以TAB为标号的数据表中,然后通过查表指令“MOVC A,@A+DPTR”把数据取到累加器A中,然后再送到P1口进行显示。具体源程序如下,TAB标号处的数据表可以根据实现效果的要求任意修改。
ORG 0000H ;单片机上电后从0000H地址执行
AJMP START ;跳转到主程序存放地址处
ORG 0030H ;设置主程序开始地址
START:MOV SP,#60H ;设置堆栈起始地址为60H
MOV DPTR,# TAB ;流水花样表首地址送DPTR
LOOP: CLR A ;累加器清零
MOVC A,@A+DPTR ;取数据表中的值
CJNE A,#0FFH,SHOW;检查流水结束标志
AJMP START ;所有花样流完,则从头开始重复流
SHOW: MOV P1,A ;将数据送到P1口
ACALL DELAY ;调用延时子程序
INC DPTR ;取数据表指针指向下一数据
AJMP LOOP ;继续查表取数据
DELAY: ;延时子程序
MOV R0,#255 ;延时一段时间
D1: MOV R1,#255
DJNZ R1,$
DJNZ R0,D1
RET ? ;子程序返回
TAB: ;下面是流水花样数据表,用户可据要求任意编写
DB 11111110B ;二进制表示的流水花样数据,从低到高左移
DB 11111101B
DB 11111011B
DB 11110111B
DB 11101111B
DB 11011111B
DB 10111111B
DB 01111111B
DB 01111111B ;二进制表示的流水花样数据,从高到低右移
DB 10111111B
DB 11011111B
DB 11101111B
DB 11110111B
DB 11111011B
DB 11111101B
DB 11111110B
DB 0FEH,0FDH,0FBH,0F7H ;十六进制表示的流水花样数据
DB 0EFH,0DFH,0BFH,7FH
DB 7FH,0BFH,0DFH,0EFH
DB 0F7H,0FBH,0FDH,0FEH
……
DB 0FFH ;流水花样结束标志0FFH
END ;程序结束
4.结语
当上述程序之一编写好以后,我们需要使用编译软件对其编译,得到单片机所能识别的二进制代码,然后再用编程器将二进制代码烧写到AT89C51单片机中,最后连接好电路通电,我们就看到LED1~LED8的“流水”效果了。本文所给程序实现的功能比较简单,旨在抛砖引玉,用户可以自己在此基础上扩展更复杂的流水灯控制,比如键盘控制流水花样、控制流水灯显示数字或图案等等。
希望能帮上你
51单片机流水灯程序
第1章PIC单片机C语言程序设计概述
1.1 PIC单片机简介
1.2 MPLAB+C语言程序开发环境安装及应用
1.3 PICC/PICC18/MCC18程序设计基础
1.4 PIC单片机内存结构
1.5 PIC单片机配置位
1.6 基本的I/O端口编程
1.7 中断服务程序设计
1.8 PIC单片机外设相关寄存器
1.9 C语言程序设计在PIC单片机应用系统开发中的优势
第2章PROTEUS操作基础
2.1 PROTEUS操作界面简介
2.2 仿真电路原理图设计
2.3 元件选择
2.4 仿真运行
2.5 MPLAB IDE与PROTEUS的联合调试
2.6 PROTEUS在PIC单片机应用系统开发中的优势
第3章 基础程序设计
3.1 闪烁的LED
3.2 用双重循环控制LED左右来回滚动显示
3.3 多花样流水灯
3.4 LED模拟交通灯
3.5 单只数码管循环显示0~9
3.6 4只数码管滚动显示单个数字
3.7 8只数码管扫描显示多个不同字符
3.8 K1~K5控制两位数码管的开关、加减与清零操作
3.9 数码管显示4×4键盘矩阵按键
3.10 数码管显示拨码开关编码
3.11 继电器及双向可控硅控制照明设备
3.12 INT中断计数
3.13 RB端口电平变化中断控制两位数码管开关与加减显示
3.14 TIMER0控制单只LED闪烁
3.15 TIMER0控制流水灯
3.16 TIMER0控制数码管扫描显示
3.17 TIMER1控制交通指示灯
3.18 TIMER1与TIMER2控制十字路口秒计时显示屏
3.19 用工作于同步计数方式的TMR1实现按键或脉冲计数
3.20 用定时器设计的门铃
3.21 报警器与旋转灯
3.22 用工作于捕获方式的CCP1设计的频率计
3.23 用工作于比较模式的CCP1控制音阶播放
3.24 CCP1 PWM模式应用
3.25 模拟比较器测试
3.26 数码管显示两路A/D转换结果
3.27 EEPROM读写与数码管显示
3.28 睡眠模式及看门狗应用测试
3.29 单片机与PC双向串口通信仿真
3.30 PIC单片机并行从动端口PSP读写测试
第4章 硬件应用
4.1 74HC138与74HC154译码器应用
4.2 74HC595串入并出芯片应用
4.3 用74HC164驱动多只数码管显示
4.4 数码管BCD解码驱动器7447与4511应用
4.5 8×8LED点阵屏显示数字
4.6 8位数码管段位复用串行驱动芯片MAX6951应用
4.7 串行共阴显示驱动器MAX7219与7221应用
4.8 14段与16段数码管串行驱动显示
4.9 16键解码芯片74C922应用
4.10 1602LCD字符液晶测试程序
4.11 1602液晶显示DS1302实时时钟
4.12 1602液晶工作于4位模式实时显示当前时间
4.13 带RAM内存的实时时钟与日历芯片PCF8583应用
4.14 2×20串行字符液晶演示
4.15 LGM12864液晶显示程序
4.16 PG160128A液晶图文演示
4.17 TG126410液晶串行模式显示
4.18 HDG12864系列液晶演示
4.19 Nokia7110液晶菜单控制程序
4.20 8通道模拟开关74HC4051应用测试
4.21 用带I2C接口的MCP23016扩展16位通用I/O端口
4.22 用带SPI接口的MCP23S17扩展16位通用I/O端口
4.23 用I2C接口控制MAX6953驱动4片5×7点阵显示器
4.24 用I2C接口控制MAX6955驱动16段数码管显示
4.25 用带SPI接口的数/模转换器MCP4921生成正弦波形
4.26 用带SPI接口的数/模转换器MAX515控制LED亮度循环变化
4.27 正反转可控的直流电机
4.28 PWM控制MOSFET搭建的H桥电路驱动直流电机运行
4.29 正反转可控的步进电机
4.30 用L297+L298控制与驱动步进电机
4.31 PC通过RS-485器件MAX487远程控制单片机
4.32 I2C接口DS1621温度传感器测试
4.33 SPI接口温度传感器TC72应用测试
4.34 温度传感器LM35全量程应用测试
4.35 K型热电偶温度计
4.36 用铂电阻温度传感器PT100设计的测温系统
4.37 DS18B20温度传感器测试
4.38 SHT75温湿度传感器测试
4.39 1-Wire式可寻址开关DS2405应用测试
4.40 光敏电阻应用测试
4.41 MPX4250压力传感器测试
4.42 用I2C接口读写存储器AT24C04
4.43 用SPI接口读写AT25F1024
4.44 PIC18 I2C接口存储器及USART接口测试程序
4.45 PIC18 SPI接口存储器测试程序
4.46 PIC18定时器及A/D转换测试
4.47 用PIC18控制Microwire接口继电器驱动器MAX4820
4.48 MMC存储卡测试
4.49 ATA硬盘数据访问
4.50 微芯VLS5573液晶显示屏驱动器演示
第5章 综合设计
5.1 用DS1302/DS18B20+MAX6951设计的多功能电子日历牌
5.2 用PCF8583设计高仿真数码管电子钟
5.3 用4×20LCD与DS18B20设计的单总线多点温度监测系统
5.4 用内置EEPROM与1602液晶设计的加密电子密码锁
5.5 用PIC单片机与1601LCD设计的计算器
5.6 电子秤仿真设计
5.7 数码管显示的GP2D12仿真测距警报器
5.8 GPS全球定位系统仿真
5.9 能接收串口信息的带中英文硬字库的80×16点阵显示屏
5.10 用M145026与M145027设计的无线收发系统
5.11 红外遥控收发仿真
5.12 交流电压检测与数字显示仿真
5.13 带位置感应器的直流无刷电机PMW控制仿真
5.14 3端可调正稳压器LM317应用测试
5.15 模拟射击训练游戏
5.16 带触摸屏的国际象棋游戏仿真
5.17 温室监控系统仿真
5.18 PIC单片机MODBUS总线通信仿真
5.19 PIC单片机内置CAN总线通信仿真
5.20 基于PIC18+Microchip TCP/IP协议栈的HTTP服务器应用
参考文献
程序如下:
#include <reg52.h>
sbit led1 = P2^0;
sbit led2 = P2^1;
sbit led3 = P2^2;
sbit led4 = P2^3;
sbit led5 = P2^4;
sbit led6 = P2^5;
sbit led7 = P2^6;
sbit led8 = P2^7;
void main()
{
int i,j;
//点亮第一个灯
led1 = 1;
led2 = 0;
led3 = 0;
led4 = 0;
led5 = 0;
led6 = 0;
led7 = 0;
led8 = 0;
//延时1秒?
for(i = 0;i < 110; ++i) {for(j = 0; j < 1000; ++j)
{
?;//什么也不做
}
}//点亮第二个灯
led1 = 0;
led2 = 1;
led3 = 0;
led4 = 0;
led5 = 0;
led6 = 0;
led7 = 0;
led8 = 0;
//点亮剩余的灯
//省略……
while(1);
}
扩展资料:
流水灯几点说明:
void:因为该延时函数不需要返回值,所以写为void
delay1s:该函数的函数名,命名需要符合C语言的标识符命名规则。
(): 不需要传入参数,所以括号中为空
至此我们可以把流水灯程序写为以下形式:
关于“单片机大一19个实验代码?”这个话题的介绍,今天小编就给大家分享完了,如果对你有所帮助请保持对本站的关注!