仿真图:
芯片/模块的特点:
AT89C52简介:
AT89C52是一款经典的8位单片机,是意法半导体(STMicroelectronics)公司生产的一系列单片机之一。它基于8051内核,并具有许多与其兼容的特性。
AT89C52的主要特点如下:
内部存储器:AT89C52具有8KB的闪存(Flash)存储器,可用于存储用户程序和数据。这些存储器的内容可以通过编程器进行编程和擦除。
RAM存储器:AT89C52配备了256字节的随机存取存储器(RAM),用于暂存数据和程序的变量。
外部扩展性:AT89C52支持多种外部扩展设备的连接,包括外部存储器(如RAM、EEPROM)和外设(如ADC、LCD、UART等),通过外部硬件连接,可以扩展单片机的功能和应用。
通用I/O引脚:AT89C52拥有32个可编程的通用输入/输出引脚,可用于连接外部设备和与其他芯片进行通信。
定时器/计数器:AT89C52内置了3个16位定时器/计数器和一个可编程的串行定时器/计数器。这些计时器/计数器可用于实现定时功能、生成脉冲信号、测量时间间隔等。0
串行通信:AT89C52支持串行通信接口,包括UART(串行异步通信)和SPI(串行外设接口),便于与其他设备进行数据通信和交互。
低功耗模式:AT89C52具有多种低功耗模式,如空闲模式和电源下模式,在不需要执行任务的时候可以将CPU进入低功耗状态以节省能量。
宽电源电压范围:AT89C52的工作电压范围通常为4.0V至5.5V,可以满足大多数应用需求。
主程序:
#include<reg51.h>
#include<intrins.h> //包含库文件
sbit smg1=P3^6; //定义南北方向数码管低位
sbit smg2=P3^7; //定义南北方向数码管高位
sbit N_green=P2^0; //定义北向绿灯端口
sbit N_red=P2^1; //定义北向红灯端口
sbit N_yellow=P2^2; //定义北向黄灯端口
sbit S_green=P2^7; //定义南向绿灯端口
sbit S_red=P2^6; //定义南向红灯端口
sbit S_yellow=P2^5; //定义南向黄灯端口
sbit W_green=P1^0; //定义西向绿灯端口
sbit W_red=P1^1; //定义西向红灯端口
sbit W_yellow=P1^2; //定义西向黄灯端口
sbit E_green=P1^7; //定义东向绿灯端口
sbit E_red=P1^6; //定义东向红灯端口
sbit E_yellow=P1^5; //定义东向黄灯端口
int js=0,djs=30; //初始倒计时时间
int table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x40}; //共阴极数码管段值
/************以下为函数声明*************/
void jtd();
void jtda();
void jtdb();
void djsxs();
void yj();
void jj();
void jtday();
void jtdby();
/*****************************************************/
/* 函数名:delayms */
/* 功能:产生毫秒级延时 */
/*****************************************************/
void delayms(int x)
{
char i;
while(x--)
{
for(i=150;i>0;i--);
}
}
/*****************************************************/
/* 函数名:Timer0_init() */
/* 功能:定时器0初始化 */
/*****************************************************/
void Timer0_init()
{
js=0;
TMOD=0x01; //定义定时器0工作模式
TH0=0x4c; //赋初值高位
TL0=0x00; //赋初值低位
TR0=1; //启动定时器
ET0=1; //开中断
EA=1; //开全局中断
}
/*****************************************************/
/* 函数名:timer0() interrupt 1 using 1 */
/* 功能:定时器0中断服务函数 */
/*****************************************************/
void timer0() interrupt 1 using 1
{
TF0=0;
TH0=0x4c;
TL0=0x00; //重新赋高地位初值
js++;
if(js==22)
{ js=0;
djs--;
}
}
/*****************************************************/
/* 函数名:djsxs11() */
/* 功能:数码管动态显示 */
/*****************************************************/
void djsxs11() //此函数注视同djsxs22()
{ int b1,b2;
b1=djs/10; //将倒计时时间的高位赋予b1
b2=djs%10; //将倒计时时间的低位赋予b2
P0=table[b1];
smg1=0;
delayms(3);
smg1=1; //显示b1
P0=table[b2];
smg2=0;
delayms(3);
smg2=1; //显示b2
}
/*****************************************************/
/* 函数名:qm() */
/* 功能:使所有的交通信号灯全部熄灭 */
/*****************************************************/
void qm()
{
N_green=1;
N_red=1;
N_yellow=1;
S_green=1;
S_red=1;
S_yellow=1;
W_green=1;
W_red=1;
W_yellow=1;
E_green=1;
E_red=1;
E_yellow=1;
}
/*****************************************************/
/* 函数名:jtdb() */
/* 功能:交通灯东西方向绿灯亮,红灯灭 */
/* 交通灯南北方向红灯亮,绿灯灭 */
/*****************************************************/
void jtdb()
{
qm(); //所有信号灯灭
W_green=0; //西向绿灯亮
E_green=0; //东向绿灯亮
N_red=0; //北向红灯亮
S_red=0; //南向红灯亮
while(1)
{
if(djs>5) //当倒计时时间大于5秒时,执行
{
djsxs11(); //数码管时间显示
}
if(djs<=5) //当倒计时时间小于5秒时,执行
{
jtdby(); //调用函数
}
}
}
/*****************************************************/
/* 函数名:jtdby() */
/* 功能:交通灯东西方向黄灯亮,红灯灭 */
/* 交通灯南北方向红灯亮,绿灯灭 */
/*****************************************************/
void jtdby()
{
qm(); //所有信号灯全灭
W_green=1; //西向绿灯灭
E_green=1; //东向绿灯灭
W_yellow=0; //西向黄灯亮
E_yellow=0; //东向黄灯亮
N_red=0; //北向红灯灭
S_red=0; //南向红灯灭
while(1)
{
djsxs11(); //数码管时间显示
if(djs<0) //当倒计时时间小于0秒时,执行
{
djs=30;
jtda(); //调用jtda()函数
}
}
}
/*****************************************************/
/* 函数名:jtda() */
/* 功能:交通灯南北方向绿灯亮,红灯灭 */
/* 交通灯东西方向红灯亮,绿灯灭 */
/*****************************************************/
void jtda()
{
qm(); //所有信号灯灭
N_green=0; //北向绿灯亮
S_green=0; //南向绿灯亮
W_red=0; //西向红灯亮
while(1)
{
if(djs>5) //当倒计时时间大于5秒时,执行
{
djsxs11(); //数码管时间显示
}
if(djs<=5) //当倒计时时间小于5秒时,执行
{
jtday(); //调用函数
}
}
}
/*****************************************************/
/* 函数名:jtday() */
/* 功能:交通灯南北方向黄灯亮,红灯灭 */
/* 交通灯东西方向红灯亮,绿灯灭 */
/*****************************************************/
void jtday()
{
qm(); //所有信号灯全灭
N_green=1; //北向绿灯灭
S_green=1; //南向绿灯灭
N_yellow=0; //北向黄灯亮
S_yellow=0; //南向黄灯亮
W_red=0; //西向红灯亮
E_red=0; //东向红灯亮
while(1)
{
djsxs11(); //数码管时间显示
if(djs<0) //当倒计时时间小于0秒时,执行
{
djs=30;
jtdb(); //调用jtdb()函数
}
}
}
/*****************************************************/
/* 函数名:main() */
/* 功能: 主函数 */
/*****************************************************/
void main()
{
Timer0_init(); //定时器0初始化
jtda(); //调用jtda()函数
}
设计文件: