产品概述

51单片机 ea 51单片机学习26-小设计之交通灯

小编 2024-10-12 产品概述 23 0

51单片机学习26-小设计之交通灯

从这篇开始,用之前已经出现过的LED灯,数码管,按键,LCD1602,蜂鸣器等元件做几个小设计,这篇是交通灯,学51的交通灯这个设计一般都会做。

有正常模式和夜间模式的切换。

有正常模式和东西紧急模式和南北紧急模式的切换。

仿真图:

程序:

源代码:

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char

uchar num;//定时器T0计数变量

uchar num1;//定时器T1计数变量

uchar key1num;

uchar key2num;

uchar key3num;

uchar temp; //南北时间变量

uchar temp1;//东西时间变量

//uchar flagS1; //状态一标志位

uchar flagS2; //状态二标志位

uchar flagS3; //状态三标志位

uchar flagS4; //状态四标志位

uchar key1flag;

uchar key2flag;

uchar key3flag;

uchar flag;

uchar flag1;

disp[]={11,3,8}; //南北显示时间数值

disp1[]={14,5,3}; //东西显示时间数值

uchar i;

uchar code smg_dm[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71,};//数码管段码数组

uchar code smg_wm[]={

0x0f,0x1f,0x2f,0x3f,

0x4f,0x5f,0x6f,0x7f,}; //数码管位码数组

////////指示灯 位定义//////////////

sbit NS_R=P0^0; //南北走向 红灯

sbit NS_Y=P0^1; //南北走向 黄灯

sbit NS_G=P0^2; //南北走向 绿灯

sbit EW_R=P0^3; //东西走向 红灯

sbit EW_Y=P0^4; //东西走向 黄灯

sbit EW_G=P0^5; //东西走向 绿灯

sbit key3=P3^2;//设置键

sbit key2=P3^3;//紧急键 切换正常 南北紧急 东西紧急三种状态

sbit key1=P3^4;//模式切换键 切换正常模式 夜间模式

/////////子函数声明//////////////

void init(); //初始化

void delay_ms(uint z); //延时ms级

void smg();//数码管显示

void key();//按键函数

void S0(); //初始状态

void S1(); //状态1函数

void S2(); //状态2函数

void S3(); //状态3函数

void S4(); //状态4函数 构成一个正常显示的循环

//////////////////////////////////

void yejian();

void zhengchang();

void naibeijinji();

void dongxijinji();

////////////主程序///////////////

void main()

{

init();

//flagS1=1; //进入状态下

temp=disp[i]; //取初值

temp1=disp1[i];//取初值

S0();

TR0=1;

while(1)

{

key();

if(flag==1)

{

if(key2flag==1)

{

naibeijinji();

TR0=0;

num=0;

}

else if (key2flag==2)

{

dongxijinji();

TR0=0;

num=0;

}

else

{

TR0=1;

NS_R=0; NS_Y=0; NS_G=0;

EW_R=0; EW_Y=0; EW_G=0;

zhengchang();

}

}

else if(flag1==1)

{

if(key3flag==1)

{

yejian();

TR0=0;

num=0;

}

else

{

TR0=1;

NS_R=0; NS_Y=0; NS_G=0;

EW_R=0; EW_Y=0; EW_G=0;

zhengchang();

}

}

else

{

zhengchang();

}

}

}

void yejian()

{

NS_R=0; NS_Y=1; NS_G=0;

EW_R=0; EW_Y=1; EW_G=0;

delay_ms(500); //////////延时太长 按键切换会不灵敏

NS_R=0; NS_Y=0; NS_G=0; /////////////调试

EW_R=0; EW_Y=0; EW_G=0;

delay_ms(500);

}

void zhengchang()

{

if(flagS2==1)

S2();

else if(flagS3==1)

S3();

else if(flagS4==1)

S4();

else

S1();

}

void naibeijinji()//南北绿灯,东西红灯

{

NS_R=0; NS_Y=0; NS_G=1;

EW_R=1; EW_Y=0; EW_G=0;

}

void dongxijinji()//东西绿灯,南北红灯

{

NS_R=1; NS_Y=0; NS_G=0;

EW_R=0; EW_Y=0; EW_G=1;

}

void key()

{

if(key2==0)

{

delay_ms(10);

if(key2==0)

{

flag=1;

flag1=0;

key2num++;

key2num=key2num%3;

switch(key2num)

{

case 0:key2flag=0;break; //正常模式

case 1:key2flag=1;break; //南北紧急

case 2:key2flag=2;break; //东西紧急

}

}

while(!key2);

}

if(key3==0)

{

delay_ms(10);

if(key3==0)

{

flag=0;

flag1=1;

key3num++;

key3num=key3num%2;

switch(key3num)

{

case 0:key3flag=0;break; //正常模式

case 1:key3flag=1;break; //夜间模式

}

}

while(!key3);

}

}

void S0()

{

NS_R=1; NS_Y=1; NS_G=1;

EW_R=1; EW_Y=1; EW_G=1;

delay_ms(2000);

NS_R=0; NS_Y=0; NS_G=0;

EW_R=0; EW_Y=0; EW_G=0;

}

void S1()

{

NS_G=1;//南北绿灯亮

EW_R=1;//东西红灯亮

if(num==20)

{

num=0;

temp=temp-1;

temp1=temp1-1;

}

if(temp==0)

{

flagS2=1;

NS_G=0;//南北绿灯灭

EW_R=1;//东西红灯亮

i=i+1; //1

temp=disp[i]; //3

temp1=temp1;

// flagS1=0;

}

smg();

}

void S2()

{

NS_Y=1;//南北黄灯亮

EW_R=1;//东西红灯亮

//temp=3;

if(num==20)

{

num=0;

temp=temp-1;

temp1=temp1-1;

}

if(temp==0)

{

flagS2=0;

flagS3=1;

NS_Y=0;

EW_R=0;

i=i+1; //2

temp=disp[i]; //8

temp1=disp1[i-1];//5

}

smg();

}

void S3()

{

NS_R=1;//南北红灯亮

EW_G=1;//东西绿灯亮

if(num==20)

{

num=0;

temp=temp-1;

temp1=temp1-1;

}

if(temp1==0)

{

flagS3=0;

flagS4=1;

NS_R=1;

EW_G=0;

i=i+1;

temp=temp;

temp1=disp1[i-1];

}

smg();

}

void S4()

{

NS_R=1;//南北红灯亮

EW_Y=1;//

if(num==20)

{

num=0;

temp=temp-1;

temp1=temp1-1;

}

if(temp==0)

{

flagS4=0;

NS_R=0;

EW_Y=0;

i=i+1;

if(i>2)

{i=0;}

temp=disp[i];

temp1=disp1[i];

}

smg();

}

void smg()

{

P2=smg_wm[0];

P1=smg_dm[temp%10];

delay_ms(5);

P1=0X00;

P2=smg_wm[1];

P1=smg_dm[temp/10];

delay_ms(5);

P1=0X00;

P2=smg_wm[2];

P1=smg_dm[temp1%10];

delay_ms(5);

P1=0X00;

P2=smg_wm[3];

P1=smg_dm[temp1/10];

delay_ms(5);

P1=0X00;

}

void init()

{

TMOD=0X01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

EA=1;

ET0=1;

}

void time0() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

num++;

}

void delay_ms(uint z)

{

uint x;

uchar y;

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

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

}

仿真结果:

正常模式

夜间模式

南北紧急

东西紧急

pic单片机与51单片机的对比,附pic单片机命名规则

pic单片机是当前最实用工具之一,而对于pic单片机的探讨往往与其他类型单片机相联系。本文中,将讨论pic单片机和51单片机谁更易于学习,以此帮助大家增进对pic单片机的理解。

51好学一些,但是PIC也没比51难多少。首先,PIC比51多个配置位,这个基本上看看就懂了。然后,PIC的端口要配置成输入或者输出,51单片机则不用。PIC的中断没有优先级,需要软件判断。最后,PIC比51多许多寄存器,你要使用PIC的各种功能,都需要去初始化寄存器。

再说说PIC相比与51单片机有哪些优点:

1:相同的晶振情况下,PIC比51速度快,PIC4个时钟周期为一个指令周期,51是12个。

2:PIC比51功能强大许多,比如自带AD转换,自带PWM,内置弱上拉(需设置)LCD接口等。。这样,你在用到许多功能的时候就很方便啦,不用去接很多外围电路。

3:PIC的驱动能力比51强,PIC可直接驱动数码管,51有些吃力哦。

4:PIC的抗干扰能力比51好,这个我们公司做过试验的。

综合上述,小编建议你学习PIC。

51单片机概述

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

51单片机的主要功能

·8位CPU·4kbytes程序存储器(ROM)(52为8K)

·256bytes的数据存储器(RAM)(52有384bytes的RAM)

·21个专用寄存器

·2个可编程定时/计数器·5个中断源,2个优先级(52有6个)

·一个全双工串行通信口

·外部数据存储器寻址空间为64kB

·外部程序存储器寻址空间为64kB

·逻辑操作位寻址功能·双列直插40PinDIP封装

·单一+5V电源供电

CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器;

RAM:用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;

ROM:用以存放程序、一些原始数据和表格;

I/O口:四个8位并行I/O口,既可用作输入,也可用作输出;

T/C:两个定时/记数器,既可以工作在定时模式,也可以工作在记数模式;

五个中断源的中断控制系统;

一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信;

片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。最高振荡频率为12M。

PIC单片机特点或优势

1)PIC最大的特点是不搞单纯的功能堆积,而是从实际出发,重视产品的性能与价格比,靠发展多种型号来满足不同层次的应用要求。就实际而言,不同的应用对单片机功能和资源的需求也是不同的。比如,一个摩托车的点火器需要一个I/O较少、RAM及程序存储空间不大、可靠性较高的小型单片机,若采用40脚且功能强大的单片机,投资大不说,使用起来也不方便。PIC系列从低到高有几十个型号,可以满足各种需要。其中,PIC12C508单片机仅有8个引脚,是世界上最小的单片机。

该型号有512字节ROM、25字节RAM、一个8位定时器、一根输入线、5根I/O线,市面售价在3-6元人人民币。这样一款单片机在象摩托车点火器这样的应用无疑是非常适合。PIC的高档型号,如PIC16C74(尚不是最高档型号)有40个引脚,其内部资源为ROM共4K、192字节RAM、8路A/D、3个8位定时器、2个CCP模块、三个串行口、1个并行口、11个中断源、33个I/O脚。这样一个型号可以和其它品牌的高档型号媲美。

2)精简指令使其执行效率大为提高。PIC系列8位CMOS单片机具有独特的RISC结构,数据总线和指令总线分离的哈佛总线(Harvard)结构,使指令具有单字长的特性,且允许指令码的位数可多于8位的数据位数,这与传统的采用CISC结构的8位单片机相比,可以达到2:1的代码压缩,速度提高4倍。

3)产品上市零等待(Zerotimetomarket)。采用PIC的低价OTP型芯片,可使单片机在其应用程序开发完成后立刻使该产品上市。

4)PIC有优越开发环境。OTP单片机开发系统的实时性是一个重要的指标,象普通51单片机的开发系统大都采用高档型号仿真低档型号,其实时性不尽理想。PIC在推出一款新型号的同时推出相应的仿真芯片,所有的开发系统由专用的仿真芯片支持,实时性非常好。就我个人的经验看,还没有出现过仿真结果与实际运行结果不同的情况。

5)其引脚具有防瞬态能力,通过限流电阻可以接至220V交流电源,可直接与继电器控制电路相连,无须光电耦合器隔离,给应用带来极大方便。

6)彻底的保密性。PIC以保密熔丝来保护代码,用户在烧入代码后熔断熔丝,别人再也无法读出,除非恢复熔丝。目前,PIC采用熔丝深埋工艺,恢复熔丝的可能性极小。

7)自带看门狗定时器,可以用来提高程序运行的可靠性。

8)睡眠和低功耗模式。虽然PIC在这方面已不能与新型的TI-MSP430相比,但在大多数应用场合还是能满足需要的。

PIC单片机命名规则

1.前缀: PIC MICROCHIP 公司产品代号,特别地:dsPIC为集成DSP功能的新型PIC单片机

2.系列号:10、12、16、18、24、30、33、32,其中

PIC10、PIC12、PIC16、PIC18为8位单片机

PIC24、dsPIC30、dsPIC33为16位单片机

PIC32为32位单片机

3.器件型号(类型):

C CMOS 电路

CR CMOS ROM

LC 小功率CMOS 电路

LCS 小功率保护

AA 1.8V

LCR 小功率CMOS ROM

LV 低电压

F 快闪可编程存储器

HC 高速CMOS

FR FLEX ROM

4.改进类型或选择

54A 、58A 、61 、62 、620 、621

622 、63 、64 、65 、71 、73 、74

42 、43 、44等

5.晶体标示:

LP 小功率晶体,

RC 电阻电容,

XT 标准晶体/振荡器

HS 高速晶体

6.频率标示:

-02 2MHZ,

-04 4MHZ,

-10 10MHZ,

-16 16MHZ

-20 20MHZ,

-25 25MHZ,

-33 33MHZ

7.温度范围:

空白 0℃至70℃,

I -45℃至85℃,

E -40℃至125℃

8.封装形式:

L PLCC 封装

JW 陶瓷熔封双列直插,有窗口

P 塑料双列直插

PQ 塑料四面引线扁平封装

W 大圆片

SL 14腿微型封装-150mil

JN 陶瓷熔封双列直插,无窗口

SM 8腿微型封装-207mil

SN 8腿微型封装-150 mil

VS 超微型封装8mm×13.4mm

SO 微型封装-300 mil

ST 薄型缩小的微型封装-4.4mm

SP 横向缩小型塑料双列直插

CL 68腿陶瓷四面引线,带窗口

SS 缩小型微型封装

PT 薄型四面引线扁平封装

TS 薄型微型封装8mm×20mm

TQ 薄型四面引线扁平封装

相关问答

STC 单片机51单片机 A 版,B版,C版之分,怎么区别啊?

如何识别A,B,C,D版见单片机表面文字最下面一行最后一个字母,例如有一款STC单片机上的文字如下89LE52RC40C-PLCC0632CT690800D最后一个字为D即为D版如何.....

51单片机 中erprom是什么?

在51单片机中,EPROM是一种可编程只读存储器。它是一种非易失性存储器,意味着当电源关闭时,存储在其中的数据不会丢失。EPROM的编程是通过使用特殊的编程设备...

51单片机 的寄存器有哪些?

单片机常用寄存器1、SCONSCON(SerialControlRegister)串行口控制寄存器,用于控制串行通信的方式选择、接收和发送,指示串口的状态。SCON既可以字节寻址,...

【关于 51单片机 +AD如何产生正弦波(20hz~20khz)我了解是把波...

[最佳回答]把波形细分成256份,准备出来256个数据,假设这些是适合于2KHz的.如果要输出20KHz,就从这256个数据中,隔10个,取出一个来输出,即可.把波形细分成256...

51单片机 写入累加寄存器ACC的数据由低到高位排列是ACC0-AC...

[最佳回答]1,是的2,假定ACC高到低为10011010,且CY=0,那么执行ACC=ACC>>1后ACC变为01001101,也就是右移1位,高位补0,这个式子经常用来做除2运算.3,右移后,...

si4606场效应管可以用于 51单片机 控制直流电机吗?

场效应管电流3A,电机驱动模块每路输出1.2A,并用能满足要求,但是电路结构要更改,因为驱动模块还有其它控制端,因此不能直接替换。是可以通过更改电路来控制空...

51单片机 中B寄存器?

你的是51单片机吧?现在学校都学这个,其实是比较差的一款。不多说,解释一下。寄存器A应该是指累加器A,寄存器B应该是通用寄存器B。寄存器A是专门用来放操作数...

51单片机 带几个ad?

51单片机现内部本身就含有AD模块了,一般有几路到几十路不等,要求精度高时才采用专业芯片。51单片机是对所有兼容Intel8031指令系统的单片机的统称。该系列单...

51单片机 idata怎么用?

data:固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。idata:固定指前面0x00-0xff的256个RAM,其中前128和dATa的128...

51单片机 16进制转ascii码方法?

这程序的功能就是把一字节十六进制数的低4位转换为一个ASCII码。例如0x0E转换为'E'、0x08转换为'8'。我估计你就是对内码不太熟悉吧。你翻一下ASCII码...

猜你喜欢