问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

单片机控制十字路口交通灯程序设计

发布网友 发布时间:2023-06-22 01:14

我来回答

1个回答

热心网友 时间:2024-03-17 16:51

如果一个单位时间为1秒,这里设定的十字路*通灯按如下方式四个步骤循环工作:
�8�5 60个单位时间,南北红,东西绿;
�8�5 10个单位时间,南北红,东西黄;
�8�5 60个单位时间,南北绿,东西红;
�8�5 10个单位时间,南北黄,东西红;
解:用P1端口的6个引脚控制交通灯,高电平灯亮,低电平灯灭。
代码
#include <at89x52.h>
//sbit用来定义一个符号位地址,方便编程,提高可读性,和可移植性
sbit SNRed =P1^0; //南北方向红灯
sbit SNYellow =P1^1; //南北方向黄灯
sbit SNGreen =P1^2; //南北方向绿灯
sbit EWRed =P1^3; //东西方向红灯
sbit EWYellow =P1^4; //东西方向黄灯
sbit EWGreen =P1^5; //东西方向绿灯
/* 用软件产生延时一个单位时间 */
void Delay1Unit( void )
{
unsigned int i, j;
for( i=0; i<1000; i++ )
for( j<0; j<1000; j++ ); //通过实测,调整j循环次数,产生1ms延时
//还可以通过生成汇编程序来计算指令周期数,结合晶体频率来调整j循环次数,接近1ms
}
/* 延时n个单位时间 */
void Delay( unsigned int n ){ for( ; n!=0; n-- ) Delay1Unit(); }
void main( void )
{
while( 1 )
{
SNRed=0; SNYellow=0; SNGreen=1; EWRed=1; EWYellow=0; EWGreen=0; Delay( 60 );
SNRed=0; SNYellow=1; SNGreen=0; EWRed=1; EWYellow=0; EWGreen=0; Delay( 10 );
SNRed=1; SNYellow=0; SNGreen=0; EWRed=0; EWYellow=0; EWGreen=1; Delay( 60 );
SNRed=1; SNYellow=0; SNGreen=0; EWRed=0; EWYellow=1; EWGreen=0; Delay( 10 );
}
}
第四节:数码管驱动
显示“12345678”
P1端口接8联共阴数码管SLED8的段极:P1.7接段h,…,P1.0接段a
P2端口接8联共阴数码管SLED8的段极:P2.7接左边的共阴极,…,P2.0接右边的共阴极
方案说明:晶振频率fosc=12MHz,数码管采用动态刷新方式显示,在1ms定时断服务程序中实现
代码
#include <at89x92.h>
unsigned char DisBuf[8]; //全局显示缓冲区,DisBuf[0]对应右SLED,DisBuf[7]对应左SLED,
void DisplayBrush( void )
{ code unsigned char cathode[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //阴极控制码
Code unsigned char Seg7Code[16]= //用十六进数作为数组下标,可直接取得对应的七段编码字节
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
static unsigned char i=0; // (0≤i≤7) 循环刷新显示,由于是静态变量,此赋值只做一次。
P2 = 0xff; //显示消隐,以免下一段码值显示在前一支SLED
P1 = Seg7Code[ DisBuf[i] ]; //从显示缓冲区取出原始数据,查表变为七段码后送出显示
P2 = cathode[ i ]; //将对应阴极置低,显示
if( ++i >= 8 ) i=0; //指向下一个数码管和相应数据
}
void Timer0IntRoute( void ) interrupt 1
{
TL0 = -1000; //由于TL0只有8bits,所以将(-1000)低8位赋给TL0
TH0 = (-1000)>>8; //取(-1000)的高8位赋给TH0,重新定时1ms
DisplayBrush();
}
void Timer0Init( void )
{ TMOD=(TMOD & 0xf0) | 0x01; //初始化,定时器T0,工作方式1
TL0 = -1000; //定时1ms
TH0 = (-1000)>>8;
TR0 = 1; //允许T0开始计数
ET0 = 1; //允许T0计数溢出时产生中断请求
}
void Display( unsigned char index, unsigned char dataValue ){ DisBuf[ index ] = dataValue; }
void main( void )
{
unsigned char i;
for( i=0; i<8; i++ ){ Display(i, 8-i); } //DisBuf[0]为右,DisBuf[7]为左
Timer0Init();
EA = 1; //允许CPU响应中断请求
While(1);
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
win7窗口淡入淡出慢 iPhone 小技巧:如何将 Safari 浏览器中的网页添加到桌面? 锰粉是什么颜色的金属 铁精粉的常见颜色是什么 烟花爆竹中的金属粉末如何使其呈现绚丽色彩? 金粉有哪些种类 灰土每层回填最大厚度 灰土基础简史 如何让一个喜欢你的女孩讨厌你! 西环里新区基本资料 spss怎么做sarima 时间序列分析 红绿灯有掉头标志要过亭子线掉吗?都是黄实线 经常使用的时间序列分析法不包括 季节性不明显的季节时间序列如何建模 代替cd650的材料 小说里怎么描写男女主角牵手在风中奔跑的场景,唯美一点,不过是男主单... 高速公路拉白鳝你能免过路费吗 问一道 初三数学的题目...好难..不会做.. 几道初一的数学题,要用方程做,最好是二元一次的 初中数学甲、乙两列火车均长220m 某人沿河逆流游泳而上,途中不慎将矿泉水失落,水壶顺流而下,10分钟... 一列长120米的火车,以每小时36千米的速度向西驶去。某一时刻火车追上... 匀速前进的火车,从他进入320米长的隧道到完全通过隧道经历18秒,隧道... 正月初九吃什么吉利食物 亩产税30万需要做多少产值 产量对于总产值的影响绝对数 星座日期农历还是阳历?星座的日期查询表 万年历查询20090609是什么星座 星座表十二星座表万年历,万年历农历查询 如何办理车辆解押手续 网上下载了一个用Delphi软件做的医院挂号系统程序,有哪位大侠帮忙教一些... ...人参乌龙茶)有谁明白,给我推荐一下买哪个牌子的最好啊。之前喝过是... 高粱剪饼吃着有点苦什么原因 请教两句粤语“逆”点读“打唔系问题,够姜就出来” 陕西有产茶叶吗? 先谢谢了 甲烷氯化物甲醇及液氯消耗 甲醇1300一吨的纯度是多少? 陈升山河普洱茶是用什么料制作而成的? 刘宝和普洱茶的关系 甲钴胺治耳鸣好用吗? 耳鸣的人吃甲钴胺可以好吗? 甲钴胺胶囊能不能治耳鸣 耳鸣为什么吃甲钴胺会加重? qq炫舞手游名字上有一横 六驾马车精选干红葡萄酒2017怎么样 谁知道咱们赣州都有什么特产啊?? 登高作业的高度是多少米 甘蔗需要人工撇叶吗? 登高多少米算登高作业 雷沃904托拉机后桥半轴怎么拆