交通灯 C语言源代 sbit yellowled_nb=P1^4; //南北黄灯 sbit yellowled_dx=P1^1; //东西黄灯 uchar code table[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; uchar data dig; //位选 uchar data led; //偏移量 uchar data buf[4]; uchar data sec_dx=39;//东西数码指示值 uchar data sec_nb=39;//南北数码指示值 uchar data set_timedx=39; uchar data set_timenb=39;//倒计时设置的键值保存 uchar data b;//定时器中断次数 bit time;//灯状态循环标志 bit int0_time;//中断强行标志 bit set;//调时方向切换键标志 void delay(int ms);//延时子程序 void key();//按键扫描子程序 void key_to1();//键处理子程序 void key_to2(); void display();//显示子程序 根据给定的文件标题“电子设计 交通灯源代码”及描述内容,本文将详细解析这份交通信号灯控制系统的C语言实现方式,并深入探讨其中的关键技术点。 ### 一、项目概述 本项目是一个基于单片机(Microcontroller Unit, MCU)的交通信号灯控制系统,主要采用C语言进行编程实现。其核心功能是通过四个按键控制交通信号灯的状态变化以及倒计时显示,从而模拟真实世界中的交通信号灯系统。系统中涉及的主要硬件资源包括:南北方向的红绿黄三色灯、东西方向的红绿黄三色灯、四位共阴极数码管以及四个用于设置和控制的按键。 ### 二、代码解读与分析 #### 1. 变量定义 - **宏定义与类型定义**:首先定义了宏`#define uchar unsigned char`和`#define uint unsigned int`,这有助于提高代码的可读性和可维护性。 - **特殊功能寄存器定义**:通过`sbit`关键字定义了各个LED灯和按键的引脚,如南北黄灯`yellowled_nb=P1^4`等。 - **数据结构定义**:定义了一系列的数据变量,如`uchar data buf[4];`用于存储数码管显示的数据;`uchar data sec_dx=39;`用于记录东西方向剩余的时间等。 - **中断标志定义**:例如`bit time;`用于表示灯状态循环的标志;`bit int0_time;`用于表示中断强行标志。 #### 2. 函数声明与定义 - **延时函数`void delay(int ms);`**:用于实现延时功能,保证程序运行的稳定性。 - **按键扫描函数`void key();`**:负责读取四个按键的状态并执行相应的操作。 - **按键处理函数`void key_to1();`**和`void key_to2();`:根据按键的不同状态执行不同的处理逻辑。 - **显示函数`void display();`**:用于更新数码管上的显示内容。 #### 3. 主函数`void main()`详解 - 初始化定时器和外部中断:`TMOD=0X01; TH0=0X3C; TL0=0XB0; EA=1; ET0=1; TR0=1; EX0=1; EX1=1;` - 初始化P1口:`P1=0Xf3;`,设置初始状态为全关闭。 - 主循环中调用按键扫描和显示函数:`while(1){ key(); display(); }` #### 4. 按键处理逻辑 - 对每个按键进行了防抖处理:`if(k1!=1){ delay(10); if(k1!=1){ ... } }` - 根据按键的不同状态执行不同的处理逻辑: - 设置方向切换键:`if(k4!=1){ ... set=!set; }` - 重置计时器和设置初始时间:`if(k3!=1&&int0_time==1){ TR0=1; sec_nb=59; sec_dx=59; int0_time=0; }` #### 5. 显示逻辑 - 更新数码管显示的内容:`buf[1]=sec_dx/10; buf[2]=sec_dx%10; buf[3]=sec_nb/10; buf[0]=sec_nb%10;` - 更新数码管显示:`P0=table[buf[led]]; delay(2); P2=dig; dig=_crol_(dig,1);` #### 6. 定时器中断处理 - 实现了定时器中断服务程序:`void time0(void) interrupt 1 using 1` - 在中断服务程序中,更新剩余时间,并根据剩余时间控制交通灯的状态变化。 ### 三、关键技术点解析 1. **定时器配置**:通过对定时器模式寄存器`TMOD`、定时器初值`TH0`和`TL0`、中断使能寄存器`EA`和`ET0`等进行配置,实现了定时器的功能,用于周期性的中断处理。 2. **外部中断配置**:通过对外部中断使能寄存器`EX0`和`EX1`进行配置,实现了外部中断功能,用于响应按键操作。 3. **数码管显示**:利用数组`table`存储了0-9的BCD码,通过计算得到需要显示的数字对应的BCD码,再通过循环和延时实现动态显示效果。 4. **按键去抖**:通过两次检测按键状态的方式实现去抖动处理,确保按键的有效性。 5. **交通灯状态控制**:通过判断剩余时间和状态标志,实现交通灯状态的变化控制,模拟真实世界中的交通灯规则。 ### 四、总结 本项目的实现涵盖了单片机系统中的多个关键环节,包括硬件资源的配置、定时器与外部中断的应用、按键处理与显示等功能模块的设计与实现。这些技术点不仅对于理解和掌握本项目的运作机制至关重要,也为进一步探索更复杂的嵌入式系统提供了坚实的基础。
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit k1=P1^6;
sbit k2=P1^7;
sbit k3=P2^7;
sbit k4=P3^0;
sbit yellowled_nb=P1^4; //南北黄灯
sbit yellowled_dx=P1^1; //东西黄灯
uchar code table[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
uchar data dig; //位选
uchar data led; //偏移量
uchar data buf[4];
uchar data sec_dx=39;//东西数码指示值
uchar data sec_nb=39;//南北数码指示值
uchar data set_timedx=39;
uchar data set_timenb=39;//倒计时设置的键值保存
uchar data b;//定时器中断次数
bit time;//灯状态循环标志
bit int0_time;//中断强行标志
bit set;//调时方向切换键标志
void delay(int ms);//延时子程序
void key();//按键扫描子程序
void key_to1();//键处理子程序
void key_to2();
void display();//显示子程序
void main()
TMOD=0X01;
TH0=0X3C;
TL0=0XB0;
EA=1;
ET0=1;
TR0=1;
EX0=1;
EX1=1;
P1=0Xf3;// 东西通行
while(1)
{
key(); //调用按键扫描程序
display(); //调用显示程序
}
}
void key() //按键扫描子程序
{
if(k1!=1)
{
delay(10);
if(k1!=1)
{
while(k1!=1);
key_to1();
剩余8页未读,继续阅读
- nlpeipei2013-05-29源码太简单 不是工程文件
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助