#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit E=P2^7; //1602使能引脚
sbit RW=P2^6; //1602读写引脚
sbit RS=P2^5; //1602数据/命令选择引脚
sbit key1=P3^2;
sbit key2=P3^4;
uchar time=0,cnt=0;
/**********************************************************/
void delay1(int ms)
{
unsigned char y;
while(ms--)
{
for(y = 0; y<250; y++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/********************************************************************
* 名称: delay2()
* 功能: 延时,延时时间大概为140US。
* 输入: 无
* 输出: 无
***********************************************************************/
void Delay2()
{
int i,j;
for(i=0; i<=10; i++)
for(j=0; j<=2; j++) ;
}
/********************************************************************
* 名称: enable(uchar del)
* 功能: 1602命令函数
* 输入: 输入的命令值
* 输出: 无
***********************************************************************/ void enable(uchar del)
{
P0 = del;
RS = 0;
RW = 0;
E = 0;
Delay2();
E = 1;
Delay2();
}
/********************************************************************
* 名称: write(uchar del)
* 功能: 1602写数据函数
* 输入: 需要写入1602的数据
* 输出: 无
***********************************************************************/
void write(uchar del)
{
P0 = del;
RS = 1;
RW = 0;
E = 0;
Delay2();
E = 1;
Delay2();
}/******************************************************************** * 名称: L1602_init()
* 功能: 1602初始化,请参考1602的资料
* 输入: 无
* 输出: 无
***********************************************************************/ void L1602_init(void)
{
enable(0x01);
enable(0x38);
enable(0x0c);
enable(0x06);
enable(0xd0);
}
/********************************************************************
* 名称: L1602_char(uchar hang,uchar lie,char sign)
* 功能: 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下L1602_char(1,5,'b')
* 输入: 行,列,需要输入1602的数据
* 输出: 无
***********************************************************************/
void L1602_char(uchar hang,uchar lie,char sign)
{
uchar a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
enable(a);
write(sign);
}
/********************************************************************
* 名称: L1602_string(uchar hang,uchar lie,uchar *p)
* 功能: 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
L1602_string(1,5,"ab cd ef;")
* 输入: 行,列,需要输入1602的数据
* 输出: 无
***********************************************************************/
void L1602_string(uchar hang,uchar lie,uchar *p)
{
uchar a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
enable(a);
while(1)
{
if(*p == '\0') break;
write(*p);
p++;
}
}
/*******************************************************************
主函数
********************************************************************/
void main(void)
{
uchar night=0,urgent=0,temp=0xff;
L1602_init(); //初始化LCD TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
if(key1==0)
{
L1602_init();
while(key1==0);
urgent++;
if(urgent==2)
urgent=0;
}
if(key2==0)
{
L1602_init();
while(key2==0);
night++;
if(night==2)
night=0;
}
if(urgent==1)
{
TR0=0;
L1602_init();
L1602_string(1,1,"urgent");
P0=0x3f;
delay1(100);
}
if(night==1)
{
TR0=0;
L1602_init();
L1602_string(1,1,"night");
if(temp==0xff)
temp=0xcf;
else
temp=0xff;
P0=temp;
delay1(150);
}
if(urgent==0 && night==0)
TR0=1;
}
}
/***************************************** 定时中断
******************************************/ void t0(void) interrupt 1
{
uchar a;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
cnt++;
if(cnt==100)
{
cnt=0;
time++;
if(time==60)
time=0;
if(time>=0 && time<25)
{
a=24-time;
L1602_string(1,1," green");
L1602_char(1,7,a/10+48);
L1602_char(1,8,a%10+48);
P0=0x1b;
}
if(time>=25 && time<30)
{
P0=0x6f;
}
if(time>=30 && time<55)
{
a=54-time;
L1602_string(1,1,"green");
L1602_char(1,7,a/10+48);
L1602_char(1,8,a%10+48);
P0=0xb7;
}
if(time>=55 && time<60)
{
P0=0x9f;
}
}
}
本文档为【单片机 交通灯课程设计 代码】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。