51单片机c语言编程100例(单片机流水灯C语言程序(8个灯,依次点亮每个灯,延时500MS))

:暂无数据 2026-08-28 18:30:17 :0

51单片机c语言编程100例(单片机流水灯C语言程序(8个灯,依次点亮每个灯,延时500MS))

大家好,关于51单片机c语言编程100例很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于单片机流水灯C语言程序(8个灯,依次点亮每个灯,延时500MS)的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

本文目录

单片机流水灯C语言程序(8个灯,依次点亮每个灯,延时500MS)

单片机流水灯C语言程序的源代码如下:

#include //51系列单片机定义文件

#define uchar unsigned char //定义无符号字符

#define uint unsigned int //定义无符号整数

void delay(uint); //声明延时函数

void main(void)

{

uint i;

uchar temp;

while(1)

{

temp=0x01;

for(i=0;i《8;i++) //8个流水灯逐个闪动

{

P1=~temp;

delay(100); //调用延时函数

temp《《=1;

}

temp=0x80;

for(i=0;i《8;i++) //8个流水灯反向逐个闪动

{

P1=~temp;

delay(100); //调用延时函数

temp》》=1;

}

temp=0xFE;

for(i=0;i《8;i++) //8个流水灯依次全部点亮

{

P1=temp;

delay(100); //调用延时函数

temp《《=1;

}

temp=0x7F;

for(i=0;i《8;i++) //8个流水灯依次反向全部点亮

{

P1=temp;

delay(100); //调用延时函数

temp》》=1;

}

void delay(uint t) //定义延时函数

{

register uint bt;

for(;t;t--)

for(bt=0;bt《255;bt++);

}

扩展资料

51单片机流水灯的源代码如下

#include《reg51.h》

#include《intrins.h》

void delay(int a)

{

int i;

while(a--)for(i=0;i《110;i++);

}

main()

{

int i;

while(1)

{

P0=0xfe;

for(i=0;i《8;i++)

{

P0=_crol_(P0,1);

delay(500);

}

}

}

很简的51单片机C语言流水灯程序

1、51单片机C语言实现循环8个流水灯左移三次,后右移三次。
例程:

#include《reg51.h》  //51单片机头文件
#include 《intrins.h》 //包含有左右循环移位子函数的库
#define uint unsigned int    //宏定义
#define uchar unsigned char  //宏定义
sbit beep=P2^3;
void delay(uint z)  //延时函数,z的取值为这个函数的延时ms数,如delay(200);大约延时200ms.
{                    //delay(500);大约延时500ms.
    uint x,y;
    for(x=z;x》0;x--)
        for(y=110;y》0;y--);    
}
void main()            //主函数
{
    uchar a,i,j;
    while(1)        //大循环
    {
        a=0xfe;     //赋初值
        for(j=0;j《3;j++) for(i=0;i《8;i++)   //左移三次
        {
            P1=a;       //点亮小灯
            beep=0;     //开启蜂鸣器
            delay(50); //延时50毫秒
            beep=1;     //关闭蜂鸣器
            delay(50);  //再延时50毫秒
            a=_crol_(a,1); //将a变量循环左移一位
        }
        a=0x7f;
       for(j=0;j《3;j++) for(i=0;i《8;i++)  //右移三次
        {
            P1=a;       //点亮小灯
            beep=0;     //开启蜂鸣器
            delay(50); //延时50毫秒
            beep=1;     //关闭蜂鸣器
            delay(50);   //再延时50毫秒
            a=_cror_(a,1); //将a变量循环右移一位
        }        
    }
}


2、51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8031单片机,后来随着Flash rom技术的发展,8031单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。

大家帮忙找一些51单片机的基本C语言程序例子,最好带说明,谢啦

中断控制程序:
#include 《AT89X52.H》
#define uchar unsigned char
#define uint unsigned int
#define port_count P2 //P2接8LED接口
//将计数器的二进制值用8个LED显示出来
uchar count;//计数器(存储中断次数)
void main(void)
{
count=0; //清零计数器
port_count=~count;//清零P2口
IT0=1; //INT0设为边沿触发方式�IT0=0则为电平触发方式
EX0=1; //开INT0中断
EA=1; //开系统中断
while(1); //等待中断处理
}
//INT0中断处理函数
void int0_interrupt() interrupt 0 //INT0中断号0
{
count++;
port_count=~count; //当达到255时,溢出,又从0开始
}
I/O控制程序:
#include 《AT89X52.H》
#include 《intrins.h》
#define uchar unsigned char
#define uint unsigned int
#define flowlight P2
void delay10ms()
{uchar a,b;
for(a=200;a》0;a--)
for(b=225;b》0;b--);
}
void main()
{
uchar flag=0;//判断移动方向 flag==0 左移 flag==1 右移
uchar port_state=0x01;
flowlight=~port_state;
while(1)
{
delay10ms();
if(port_state==0X80&&flag==0)
{
flag=1; //流水灯左移到第八位又移回来 ~1000 0000
}
else
if(port_state==0X01&&flag==1)
{
flag=0; //流水灯右移到第1位又移回来 ~0000 0001
}
if(flag==0)
{
port_state=port_state《《1;
flowlight=~port_state;
}
else
{
port_state=port_state》》1;
flowlight=~port_state;
}
}
串口通信程序:
主机程序:
#include 《AT89X52.H》
#define NODE_ADDR 3 //目的节点地址
#define COUNT 10 //发送缓冲区buffer大小
typedef unsigned char uchar;
uchar buffer; //定义buffer
int pt; //设置指针
main()//////////////////////////////////////////发送程序
{
//buffer初始化
pt=0;
while(pt《COUNT)
{
buffer 0X33........
pt++;
}
////初始化串口和T1(波特率发生器)/////////PCON缺省为0
PCON=0X00;
SCON=0Xc0; //SCON=1100 0000B,置串口为方式3, SM2=0,REN=0,主机不接收地址帧
TMOD=0X20; //20H=0010 0000B,置T1为方式2,TR1控制T1的开关,定时器方式
TH1=253;TL1=253; //方式2为自动重装///f(bps)=9600bps (f(osc)=11.0592MHZ)
TR1=1; //启动T1
ET1=0; //关T1中断 由于自动重装
ES=1; //开串口中断
EA=1; //开系统中断
pt=0;
///////////////发送地址帧
TB8=1; //地址帧标志
SBUF=NODE_ADDR; //发送目的节点地址
while(pt《COUNT); //等待发送完全部数据
while(1);//不执行任何操作
} //end main
/////发送完中断函数
void send()interrupt 4
{
TI=0; //清发送中断标志
if(pt《COUNT)
{
//发送一帧数据
TB8=0;//数据帧标志
SBUF=buffer; //启动发送
pt++;//指针指向下一单元
}

else
{
ES=0; //关串口中断
EA=0; //关系统中断
return; //若发送完则停止发送并返回
}

}
接收程序:
#include《reg52.h》
#define uchar unsigned char
#define NODE_ADDR 3 //本机节点地址
#define COUNT 10 //定义接收缓冲区buffer大小
uchar buffer; //定义buffer
int pt; //当前位置指针
void send_char_com(unsigned char ch); //向串口发送一个字符的函数声明
void delay(void);
main() ////////////////串行异步从机接收程序
{
PCON=0X00; //初始化串口和T1(波特率发生器)/////////PCON缺省为0
SCON=0XF0; //SCON=1111 0000B,方式3,SM2=1,REN=1,允许接收地址帧
TMOD=0X20; //20H=0010 0000B,置T1为方式2,TR1控制T1的开关,定时器方式
TH1=253;TL1=253; //方式2为自动重装///f(bps)=9600bps (f(osc)=11.0592MHZ)
TR1=1; //启动T1
ET1=0; //关T1中断 由于自动重装
ES=1; //开串口中断
EA=1; //开系统中断
pt=0;
while(pt《COUNT); //等待接收地址帧和全部数据帧
delay() ;
//接收完后返回数据
SCON=0XC0; //SCON=1100 0000B,置串口为方式3, SM2=0,REN=0,主机不接收地址帧
EA=0;
for(pt=0;pt《COUNT;pt++)
{
send_char_com(buffer);
}
while(1);
} //end main
///////////串口接收中断函数
void receive()interrupt 4 using 3
{
RI=0; //清除接收中断标志
if(RB8==1) //地址帧
{//若为本机地址,则置SM2=0,以便接收数据
if(SBUF==NODE_ADDR)
{
SM2=0;
}

}
/////RB8=0,数据帧
else if(RB8==0)
{buffer=SBUF; //数据帧送buffer
pt++;
if(pt》=COUNT)
SM2=1; //若接收完全部数据帧,则通信结束;置SM2=1,准备下一次通信
}

}
//向串口发送一个字符
void send_char_com(unsigned char ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}
///////////////////////////////////////////////////////////////////////////////////
void delay(void)
{uchar i=100;
while(i--);
}

求基于51单片机的电子密码锁的C语言程序急!!!!

//实例80:矩阵式键盘实现的电子密码锁
#include《reg51.h》 //包含51单片机寄存器定义的头文件
sbit P14=P1^4; //将P14位定义为P1.4引脚
sbit P15=P1^5; //将P15位定义为P1.5引脚
sbit P16=P1^6; //将P16位定义为P1.6引脚
sbit P17=P1^7; //将P17位定义为P1.7引脚
sbit sound=P3^7; //将sound位定义为P3.7
unsigned char keyval; //储存按键值
/**************************************************************
函数功能:延时输出音频
**************************************************************/
void delay(void)
{
unsigned char i;
for(i=0;i《200;i++)
;
}
/**************************************************************
函数功能:软件延时子程序
**************************************************************/
void delay20ms(void)
{
unsigned char i,j;
for(i=0;i《100;i++)
for(j=0;j《60;j++)
;
}
/**************************************************************
函数功能:主函数
**************************************************************/
void main(void)
{
unsigned char D={0,8,0,8,7,4,11}; //设定密码
EA=1; //开总中断
ET0=1; //定时器T0中断允许
TMOD=0x01; //使用定时器T0的模式1
TH0=(65536-500)/256; //定时器T0的高8位赋初值
TL0=(65536-500)%256; //定时器T0的高8位赋初值
TR0=1; //启动定时器T0
keyval=0xff; //按键值初始化

while(keyval!=D) //第一位密码输入不正确,等待
;
while(keyval!=D) //第二位密码输入不正确,等待
;
while(keyval!=D) //第三位密码输入不正确,等待
;
while(keyval!=D) //第四位密码输入不正确,等待
;
while(keyval!=D) //第五位密码输入不正确,等待
;
while(keyval!=D) //第六位密码输入不正确,等待
;
while(keyval!=D) //没有输入“OK”,等待
;
P3=0xfe; //P3.0引脚输出低电平,点亮LED
}
/**************************************************************
函数功能:定时器0的中断服务子程序,进行键盘扫描,判断键位
**************************************************************/
void time0_interserve(void) interrupt 1 using 1 //定时器T0的中断编号为1,使用第一组寄存器
{
unsigned char i;
TR0=0; //关闭定时器T0
P1=0xf0; //所有行线置为低电平“0”,所有列线置为高电平“1”
if((P1&0xf0)!=0xf0) //列线中有一位为低电平“0”,说明有键按下
delay20ms(); //延时一段时间、软件消抖
if((P1&0xf0)!=0xf0) //确实有键按下
{
P1=0xfe; //第一行置为低电平“0”(P1.0输出低电平“0”)
if(P14==0) //如果检测到接P1.4引脚的列线为低电平“0”
keyval=1; //可判断是S1键被按下
if(P15==0) //如果检测到接P1.5引脚的列线为低电平“0”
keyval=2; //可判断是S2键被按下
if(P16==0) //如果检测到接P1.6引脚的列线为低电平“0”
keyval=3; //可判断是S3键被按下
if(P17==0) //如果检测到接P1.7引脚的列线为低电平“0”
keyval=4; //可判断是S4键被按下
P1=0xfd; //第二行置为低电平“0”(P1.1输出低电平“0”)
if(P14==0) //如果检测到接P1.4引脚的列线为低电平“0”
keyval=5; //可判断是S5键被按下
if(P15==0) //如果检测到接P1.5引脚的列线为低电平“0”
keyval=6; //可判断是S6键被按下
if(P16==0) //如果检测到接P1.6引脚的列线为低电平“0”
keyval=7; //可判断是S7键被按下
if(P17==0) //如果检测到接P1.7引脚的列线为低电平“0”
keyval=8; //可判断是S8键被按下

P1=0xfb; //第三行置为低电平“0”(P1.2输出低电平“0”)
if(P14==0) //如果检测到接P1.4引脚的列线为低电平“0”
keyval=9; //可判断是S9键被按下
if(P15==0) //如果检测到接P1.5引脚的列线为低电平“0”
keyval=0; //可判断是S10键被按下
if(P16==0) //如果检测到接P1.6引脚的列线为低电平“0”
keyval=11; //可判断是S11键被按下
if(P17==0) //如果检测到接P1.7引脚的列线为低电平“0”
keyval=12; //可判断是S12键被按下

P1=0xf7; //第四行置为低电平“0”(P1.3输出低电平“0”)
if(P14==0) //如果检测到接P1.4引脚的列线为低电平“0”
keyval=13; //可判断是S13键被按下
if(P15==0) //如果检测到接P1.5引脚的列线为低电平“0”
keyval=14; //可判断是S14键被按下
if(P16==0) //如果检测到接P1.6引脚的列线为低电平“0”
keyval=15; //可判断是S15键被按下
if(P17==0) //如果检测到接P1.7引脚的列线为低电平“0”
keyval=16; //可判断是S16键被按下
for(i=0;i《200;i++) //让P3.7引脚电平不断取反输出音频
{
sound=0;
delay();
sound=1;
delay();
}
}
TR0=1; //开启定时器T0
TH0=(65536-500)/256; //定时器T0的高8位赋初值
TL0=(65536-500)%256; //定时器T0的高8位赋初值
}

求51单片机的c语言程序

#include《stc89.h》
#include《intrins.h》
#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,
0x00};
uchar led={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0x00,0xFF};
sbit adrd=P3^7;
sbit adwr=P3^6;
sbit dula=P2^6;
sbit wela=P2^7;
uchar date1=0;
uchar date2=50;
uchar date3=100;
uchar date4=150;
uchar date5=200;
uchar date6=255;
uchar a,sz;
void init();
void delay(uint z);
uchar adchushihua();
void shumaguan(uint shu);
void processing();
void main()
{
init();
while(1)
{

sz=adchushihua();
for(a=10;a》0;a--)
{
shumaguan(sz);
processing();
}
}
}
void init()
{
P0=0x7f;

}
void delay(uint z)
{
uint x,y;
for(x=z;x》0;x--)
for(y=110;y》0;y--);
}
uchar adchushihua()
{
uchar shuzhi;
adwr=1;
_nop_();
adwr=0;
_nop_();
adwr=1;

P1=0xff;

adrd=1;
_nop_();
adrd=0;
_nop_();
shuzhi=P1;
adrd=1;
return shuzhi;
}
void shumaguan(uint shu)
{
uchar bai,shi,ge;
bai=shu/100;
shi=shu%100/10;
ge=shu%10;
dula=1;
P0=table;
dula=0;
P0=0xff;
wela=1;
P0=0x7e;
wela=0;
delay(5);
dula=1;
P0=table;
dula=0;
P0=0xff;
wela=1;
P0=0x7d;
wela=0;
delay(5);
dula=1;
P0=table;
dula=0;
P0=0xff;
wela=1;
P0=0x7b;
wela=0;
delay(5);
}
void processing()
{
if((sz》=date1)&&(sz《=date2))
{
P1=0xfe;
}
else if((sz》=date2)&&(sz《=date3))
{
P1=0xfd;
}
else if((sz》=date3)&&(sz《=date4))
{
P1=0xfb;
}
else if((sz》=date4)&&(sz《=date5))
{
P1=0xf7;
}
else if((sz》=date5)&&(sz《date6))
{
P1=0xef;
}
else if(sz==date6)
{
P1=~P1;
delay(20);
}
}
这个是我刚刚写的 根据你的需要 反正闲来无事 我写的比较笼统 需要你自己根据 自己的实际情况来判断确定 我只是利用AD简单的处理 成数码管显示的数字 你要是 转换成电压 那就把里面的变量 修改一下 我写的那个控制LED灯亮就不要动了 只是修改一下他前面定义的数字就可以 最后那个是我自己加上去的有点趣味性 希望对你有帮助

51单片机 ,用C语言编程 通过独立按键控制蜂鸣器和静态数码管,

1.数码管前三位显示一个跑表,从000到999之间以1%秒速度运行,当按下一个独立键盘时跑表停止,松开手后跑表继续运行。(用定时器设计表)。
code:
#include《reg52.h》
#define uchar unsigned char
#define uint unsigned int
sbit key1 = P3^4;
sbit dula = P2^6;
sbit wela = P2^7;
uchar code table={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uint num;
uchar bai, shi, ge, flag = 0,t0 = 0;
void delay(uchar z);
void display(void);
void main(void)
{
num = 0;
P3 = 0xff;
TMOD = 0x01;
TH0 = (65536-10000) / 256;
TL0 = (65536-10000) % 256;
EA = 1;
ET0 = 1;
TR0 = 1;
while(1) {
if(key1 == 0) {
delay(5);
if(key1 == 0) {
flag = 1;
}
while(!key1);
delay(5);
while(!key1);
}
display();
}
}
void display(void)
{
dula = 1;
P0 = table;
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfe;
wela = 0;
delay(1);
dula = 1;
P0 = table;
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfd;
wela = 0;
delay(1);
dula = 1;
P0 = table;
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfb;
wela = 0;
delay(1);
}
void delay(uchar z)
{
uchar

51单片机C语言编程

// 51单片机C语言编程,这个时钟+秒表可以参考一下。

#include《reg51.h》

#define uchar unsigned char

#define uint unsigned int

sbit qingling=P1^0;  //清零

sbit tiaofen=P1^1;  //调分

sbit tiaoshi=P1^2;  //调时

sbit sounder=P1^7;  //naozhong

uint a,b;

uchar hour,minu,sec,   //时钟

hour0,minu0,sec0,//秒表

hour1,minu1,sec1;

h1,h3,m1,m2,s1,s2,//显示位

k,s;//状态转换标志  

uchar code select={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

uchar code table= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

/*****************函数声明***********************/

void keyscan();

void init();

void delay(uchar z);

void display(uchar,uchar,uchar);

void sounde();

/*****************主函数*************************/  

void main()

{

init();

while(1)

{      

while(TR1)

{

keyscan();  //扫描函数

while(s==1) //s是状态标志,当s=0时,闹钟取消。s=1时,设定闹钟时间(也是通过调时,调分函数);

{  //s=2时,闹钟工作,时间与设定时刻一致时,闹钟响(一分钟后自动关闭,可手动关闭)。再次切换,s=0.

keyscan();   //s状态切换(0-》1-》2-》0)通过外部中断1实现。

display(hour1,minu1,sec1); //闹钟时刻显示

}

display(hour0,minu0,sec0);//时钟表显示   

while(k)  /*k是秒表状态(0-》1-》2-》0)通过外部中断0实现。0秒表关;1秒表从零计时;2秒表停,显示计时时间*/

{

display(hour,minu,sec); //秒表显示   

}      

}

}

}

/*****************初始化函数***********************/

void init()

{

a=0;

b=0;

k=0;

s=0;

hour0=0;

minu0=0;

sec0=0;

hour=0;

minu=0;

sec=0;

hour1=0;

minu1=0;

sec1=0;

TMOD=0x11;      //定时器0,1工作于方式1;赋初值

TH0=(65536-5000)/256;

TL0=(65536-5000)%256;

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

EA=1;

EX0=1;   //秒表中断

EX1=1;   //闹钟设定中断

ET0=1;

ET1=1;

IT0=1;    //边沿触发方式

IT1=1;

PX0=1;

PX1=1;

TR0=0;     //初始,秒表不工作

TR1=1;    //时钟一开始工作 

}

/*****************定时器0中断*************/

void timer0_int() interrupt 1 //秒表

{

TH0=(65536-5000)/256;

TL0=(65536-5000)%256;

a++;

if(a==2)

{

a=0;

sec++;

if(sec==100)

{

sec=0;  //毫秒级

minu++;

if(minu==60)

{

minu=0;   //秒

hour++;

if(hour==60)   //分

{

hour=0;

}

}

}

} 

}

/*************外部中断0中断函数************/

void ex0_int() interrupt 0

{  

k++;

if(k==3)

k=0;

if(k==1)

{

TR0=~TR0;

if(TR0==1)

{     

hour=0;

minu=0;

sec=0;  

}

}

if(k==2)

{

TR0=~TR0;

}   

}

/*************外部中断1中断函数************/

void ex1_int() interrupt 2

{

s++;

if(s==3)

s=0;

}

/*************定时器1中断****************/

void timer1_int() interrupt 3   //控制时钟工作

{

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

if(s==2)

{

if(hour1==hour0 && minu0==minu1)

sounde();

}

b++;

if(b==20)

{

b=0;

sec0++;

if(sec0==60)

{  

sec0=0;

minu0++;

if(minu0==60)

{

minu0=0;

hour0++;

if(hour0==24)

hour0=0;                        

}

}

}

}

/*************键盘扫描****************/

void keyscan()

{

if(s==1)

{

if(qingling==0)

{

delay(10);

if(qingling==0)

{

sec1=0;

minu1=0;

hour1=0;

}

}

if(tiaofen==0)

{

delay(10);

if(tiaofen==0)

{

minu1++;

if(minu1==60)

{

minu1=0;

}

while(!tiaofen);

}

}

if(tiaoshi==0)

{

hour1++;

if(hour1==24)

{

hour1=0;

}

while(!tiaoshi);   

}

}

else      //调整时钟时间

{

if(qingling==0)

{

delay(10);

if(qingling==0)

{

sec0=0;

minu0=0;

hour0=0;

}

}

if(tiaofen==0)

{

delay(10);

if(tiaofen==0)

{

minu0++;

if(minu0==60)

{

minu0=0;

}

while(!tiaofen);  

}

}

if(tiaoshi==0)

{

hour0++;

if(hour0==24)

{

hour0=0;

}

while(!tiaoshi);   

}

} 

}

/*************显示函数****************/

void display(uchar hour,uchar minu,uchar sec)

{

h1=hour/10;

h3=hour%10;

m1=minu/10;

m2=minu%10;

s1=sec/10;

s2=sec%10;

P0=0xff;

P2=table;

P0=select;

delay(5);

P0=0xff;

P2=table;

P0=select;

delay(5);

P0=0xff;

P2=0x40;;

P0=select;

delay(5);

P0=0xff;

P2=table;

P0=select;

delay(5);

P0=0xff;

P2=table;

P0=select;

delay(5);

P0=0xff;

P2=0x40;

P0=select;

delay(5);

P0=0xff;

P2=table;

P0=select;

delay(5);

P0=0xff;

P2=table;

P0=select;

delay(5);

}

/*************闹钟函数****************/

void sounde()

{

sounder=~sounder; 

}

/*************延时函数****************/

void delay(uchar z)

{

int x,y;

for(x=z;x》0;x--)

for(y=110;y》0;y--);

}

c51单片机c语言交通灯的程序

Proteus仿真原理图:

程序如下:

#include 《reg51.h》

#define uchar unsigned char

#define uint  unsigned int

uchar data buf;

uchar data sec_dx=20;//东西数默认

uchar data sec_nb=30;//南北默认值

uchar data set_timedx=20;

uchar data set_timenb=30;

int n;

uchar data b;//定时器中断次数

sbit  k1=P1^6;//定义5组开关

sbit  k2=P1^7;

sbit  k3=P2^7;

sbit  k4=P3^0;

sbit  k5=P3^1;

sbit Yellow_nb=P2^5;       //南北黄灯标志

sbit Yellow_dx=P2^2;       //东西黄灯标志

sbit Green_nb=P2^4;

sbit Green_dx=P2^1;

sbit Buzz=P3^7;

bit Buzzer_Indicate;

bit time=0;//灯状态循环标志

bit   set=1;//调时方向切换键标志

uchar code table={       //共阴极字型码

0x3f,  //--0

0x06,  //--1

0x5b,  //--2

0x4f,  //--3

0x66,  //--4

0x6d,  //--5

0x7d,  //--6

0x07,  //--7

0x7f,  //--8

0x6f,  //--9

0x00   //--NULL

};

//函数的声明部分

void delay(int ms);//延时子程序

void key();//按键扫描子程序

void key_to1();//键处理子程序

void key_to2();

void key_to3();

void display();//显示子程序

void logo();   //开机LOGO

void Buzzer();

//主程序

void main()

{

TMOD=0X01;    

TH0=0XD8;

TL0=0XF0;

EA=1;

ET0=1;

TR0=1;

EX0=1;

EX1=1;

logo();

P2=0Xc3;// 开始默认状态,东西绿灯,南北黄灯

sec_nb=sec_dx+5;

while(1)

{       

key(); //调用按键扫描程序

display(); //调用显示程序

Buzzer();

}     

}

//函数的定义部分

void key()    //按键扫描子程序

{

if(k1!=1)

{

delay(10);

if(k1!=1)

{

while(k1!=1)

{

key_to1();

for(n=0;n《40;n++)

{ display();}

}

}

}

if(k2!=1)

{

delay(10);

if(k2!=1)

{

while(k2!=1)

{

key_to2();

for(n=0;n《40;n++)

{ display();}

}

}

}

if(k3!=1)

{     

TR0=1;   //启动定时器

Buzzer_Indicate=0;

sec_nb=set_timenb;  //从中断回复,仍显示设置过的数值

sec_dx=set_timedx;

if(time==0)

{ P2=0X99;sec_nb=sec_dx+5; }

else { P2=0xC3;sec_dx=sec_nb+5; }

}       

if(k4!=1)

{

delay(5);

if(k4!=1)

{ 

while(k4!=1);

set=!set;

}

}

if(k5!=1)

{

delay(5);

if(k5!=1)

{

while(k5!=1)    

key_to3();

}

}

}

void display() //显示子程序

{    

buf=sec_dx/10; //第1位 东西秒十位

buf=sec_dx%10; //第2位 东西秒个位

buf=sec_nb/10; //第3位 南北秒十位

buf=sec_nb%10; //第4位 南北秒个位       

P1=0xff;                                // 初始灯为灭的

P0=0x00;

P1=0xfe;                              //片选LCD1

P0=table;

delay(1);

P1=0xff;

P0=0x00;

P1=0xfd;                           //片选LCD2

P0=table;

delay(1);

P1=0xff;

P0=0x00;

P1=0Xfb;              //片选LCD3

P0=table;

delay(1);

P1=0xff;

P0=0x00;

P1=0Xf7;

P0=table;               //片选LCD4  

delay(1);

}

void time0(void) interrupt 1 using 1  //定时中断子程序

{

b++;

if(b==19)                        // 定时器中断次数

{      b=0;

sec_dx--;

sec_nb--;

if(sec_nb《=5&&time==0)  //东西黄灯闪       

{  Green_dx=0;Yellow_dx=!Yellow_dx;}                                     

if(sec_dx《=5&&time==1)  //南北黄灯闪       

{  Green_nb=0;Yellow_nb=!Yellow_nb;}                                                     

if(sec_dx==0&&sec_nb==5)

sec_dx=5;

if(sec_nb==0&&sec_dx==5)

sec_nb=5;

if(time==0&&sec_nb==0)

{ P2=0x99;time=!time;sec_nb=set_timenb;sec_dx=set_timenb+5;}

if(time==1&&sec_dx==0)

{P2=0Xc3;time=!time;sec_dx=set_timedx;sec_nb=set_timedx+5;}

}    

}

void key_to1()    //键盘处理子程序之+

{

TR0=0;          //关定时器  

if(set==0)

set_timenb++;    //南北加1S

else

set_timedx++;    //东西加1S

if(set_timenb==100)

set_timenb=1;

if(    set_timedx==100)

set_timedx=1;   //加到100置1

sec_nb=set_timenb ;    //设置的数值赋给东西南北

sec_dx=set_timedx;  

}

void key_to2()       //键盘处理子程序之-

{

TR0=0;         //关定时器

if(set==0)

set_timenb--;  //南北减1S

else

set_timedx--;  //东西减1S

if(set_timenb==0)

set_timenb=99;  

if(    set_timedx==0 )

set_timedx=99;   //减到1重置99

sec_nb=set_timenb ;    //设置的数值赋给东西南北

sec_dx=set_timedx;  

}

void key_to3()   //键盘处理之紧急车通行

{

TR0=0;

P2=0Xc9;

sec_dx=00;

sec_nb=00;

Buzzer_Indicate=1;

}

void int0(void) interrupt 0 using 1  //只允许东西通行

{

TR0=0;

P2=0Xc3;

Buzzer_Indicate=0;

sec_dx=00;

sec_nb=00;

}

void int1(void) interrupt 2 using 1       //只允许南北通行

{

TR0=0;

P2=0X99;

Buzzer_Indicate=0;

sec_nb=00;

sec_dx=00;

}

void logo()//开机的Logo  "- - - -"

{ for(n=0;n《50;n++)

{

P0=0x40;

P1=0xfe;

delay(1);

P1=0xfd;

delay(1);

P1=0Xfb;

delay(1);

P1=0Xf7;

delay(1);

P1 = 0xff;

}

}

void Buzzer()

{

if(Buzzer_Indicate==1)

Buzz=!Buzz;

else Buzz=0;

}

void delay(int ms)            //延时子程序

{

uint j,k;

for(j=0;j《ms;j++)

for(k=0;k《124;k++);

}


用五一单片机c语言编程,p1口控制八个发光二极管,实现每隔一秒,两两点亮,并循环

一、#include《reg51.h》

void delay(unsigned char Xms)//延时Xms

{

int i,j;

for(X = i; X》0; X--)

for(j=110;j》0;j--);

}

void main()

{

P0 = 0x00; //P0.0~P0.7分别接八个发光二极管,刚开始全灭

while(1)

{

delay(1000);

P0 = 0xc0;//点亮前两个发光二极管P0.0和P0.1;

delay(1000);//延时1秒

P0 = 0x30;//点亮第三个和第四个LED

delay(1000);

P0 = 0x0c;

delay(1000);

P0 = 0x03;

}

}

二、

#include 《reg52.h》

#include 《intrins.h》

#define uchar unsigned char

#define uint unsigned int

uchar temp, t0, t1;

bit t2;

sbit P10 = P1^0;

void main()

{

P10 = 1;

temp = 0xfe;

P0 = temp;

P2 = 0xff;

TMOD = 0x01;

TH0 = (65536 - 50000) / 256;

TL0 = (65536 - 50000) % 256;

ET0 = 1;

EA = 1;

TR0 = 1;

while(1);

}

void timer0() interrupt 1

{

TH0 = (65536 - 50000) / 256;

TL0 = (65536 - 50000) % 256;

t0++;

if(t0 == 10) {

t0 = 0;

t1++;

if(t1 == 8) {t1 = 0; t2 = ~t2; P10 = t2;}

temp = _crol_(temp, 1);

if(t2) {P0 = temp; P2 = 255;}

else {P2 = temp; P0 = 255;}

}

}

扩展资料:

例如:a = 3,b = 5,现交换a,b的值,这个问题就好像交换两个杯子里面的水,这当然要用到第三个杯子,假如第三个杯子是c,那么正确的程序为:c = a; a = b; b = c;执行结果是a = 5,b = c = 3如果改变其顺序,写成:a = b; c = a; b =c;则执行结果就变成a = b = c = 5,不能达到预期的目的,初学者最容易犯这种错误。

顺序结构可以独立使用构成一个简单的完整程序,常见的输入、计算、输出三步曲的程序就是顺序结构,例如计算圆的面积,其程序的语句顺序就是输入圆的半径r,计算s = 3.14159*r*r,输出圆的面积s。

如果你还想了解更多这方面的信息,记得收藏关注本站。

51单片机c语言编程100例(单片机流水灯C语言程序(8个灯,依次点亮每个灯,延时500MS))

本文编辑:admin

更多文章:


热刺vs马赛比赛(热刺赛程比分)

热刺vs马赛比赛(热刺赛程比分)

大家好,如果您还对热刺vs马赛比赛不太了解,没有关系,今天就由本站为大家分享热刺vs马赛比赛的知识,包括热刺赛程比分的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

2026年10月15日 09:10

开心厨房游戏下载(我的拿手菜游戏高速下载)

开心厨房游戏下载(我的拿手菜游戏高速下载)

本篇文章给大家谈谈开心厨房游戏下载,以及我的拿手菜游戏高速下载对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

2026年10月15日 08:40

iphone模拟器(iphone12模拟器怎么设置默认桌面)

iphone模拟器(iphone12模拟器怎么设置默认桌面)

大家好,关于iphone模拟器很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于iphone12模拟器怎么设置默认桌面的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮

2026年10月15日 08:10

雷速和即嗨哪个好用?即嗨体育怎么看不到指数

雷速和即嗨哪个好用?即嗨体育怎么看不到指数

大家好,关于即嗨体育很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于雷速和即嗨哪个好用的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

2026年10月15日 07:20

酷狗音乐并安装下载(比亚迪秦怎么下载酷狗音乐)

酷狗音乐并安装下载(比亚迪秦怎么下载酷狗音乐)

“酷狗音乐并安装下载”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看酷狗音乐并安装下载(比亚迪秦怎么下载酷狗音乐)!

2026年10月15日 05:50

电脑qq打不开(Win10系统打不开腾讯QQ怎么办Win10系统打不开的两种解决方法)

电脑qq打不开(Win10系统打不开腾讯QQ怎么办Win10系统打不开的两种解决方法)

“电脑qq打不开”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看电脑qq打不开(Win10系统打不开腾讯QQ怎么办Win10系统打不开的两种解决方法)!

2026年10月15日 04:30

电脑上的金山毒霸(如何卸载电脑金山毒霸)

电脑上的金山毒霸(如何卸载电脑金山毒霸)

各位老铁们好,相信很多人对电脑上的金山毒霸都不是特别的了解,因此呢,今天就来为大家分享下关于电脑上的金山毒霸以及如何卸载电脑金山毒霸的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

2026年10月15日 04:10

可以自由捏脸捏身材的游戏(我的御剑日记能捏脸吗)

可以自由捏脸捏身材的游戏(我的御剑日记能捏脸吗)

各位老铁们好,相信很多人对可以自由捏脸捏身材的游戏都不是特别的了解,因此呢,今天就来为大家分享下关于可以自由捏脸捏身材的游戏以及我的御剑日记能捏脸吗的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

2026年10月15日 04:00

中国志愿app下载(苹果手机下载不了中国志愿)

中国志愿app下载(苹果手机下载不了中国志愿)

“中国志愿app下载”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看中国志愿app下载(苹果手机下载不了中国志愿)!

2026年10月15日 02:50

50个wifi常用密码排行(谁给我常用的WIFI密码)

50个wifi常用密码排行(谁给我常用的WIFI密码)

本篇文章给大家谈谈50个wifi常用密码排行,以及谁给我常用的WIFI密码对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

2026年10月15日 02:20

最近更新

热刺vs马赛比赛(热刺赛程比分)
2026-10-15 09:10:01 浏览:0
热门文章

标签列表