找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3349|回复: 4
收起左侧

求助51单片机写的交通灯。有程序和仿真

[复制链接]
ID:121777 发表于 2016-6-28 11:45 | 显示全部楼层 |阅读模式
为什么数码管不能正常显示倒数?求大神指点

交通灯.zip

86.03 KB, 下载次数: 46

回复

使用道具 举报

ID:111634 发表于 2016-6-28 15:41 | 显示全部楼层
本帖最后由 zl2168 于 2016-6-28 15:42 编辑

实例29  模拟交通灯


Proteus仿真一下,确认有效。
实例29 模拟交通灯.rar (35.12 KB, 下载次数: 23)
回复

使用道具 举报

ID:111634 发表于 2016-6-28 15:42 | 显示全部楼层
本帖最后由 zl2168 于 2016-6-28 15:44 编辑

带限行时间显示模拟交通灯.jpg 实例30  带限行时间显示的模拟交通灯


Proteus仿真一下,确认有效。
实例30 带限行时间显示模拟交通灯.rar (40.64 KB, 下载次数: 39)
回复

使用道具 举报

ID:125378 发表于 2016-6-28 16:03 | 显示全部楼层
// /******************************************************************************* * 实验名                           : 动态显示数码管实验 * 使用的IO             :  * 实验效果       : 数码管显示76543210。 *        注意                                         :当位选用P1口的时候注意可能会有一位不亮,那么调整J21 *******************************************************************************/ #include<reg51.h>  //--定义使用的IO口--// #define GPIO_DIG   P0 #define GPIO_PLACE P1  #define GPIO_TRAFFIC P2  sbit RED10   = P2^0;   //上人行道红灯 sbit GREEN10 = P2^1;   //上人行道绿灯 sbit RED11   = P2^2; sbit YELLOW11= P2^3; sbit GREEN11 = P2^4;  sbit RED00   = P3^0;        //右人行道红灯 sbit GREEN00 = P3^1;        //右人行道绿灯 sbit RED01   = P2^5; sbit YELLOW01= P2^6; sbit GREEN01 = P2^7;  //--定义全局变量--// unsigned char code DIG_PLACE[8] = { 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制   查表的方法控制 unsigned char code DIG_CODE[17] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码 unsigned char DisplayData[8]; //用来存放要显示的8位数的值 unsigned char Time, Second;                  //用来存放定时时间  //--声明全局函数--// void DigDisplay(); //动态显示函数 void Timer0Cofig(void);  /******************************************************************************* * 函 数 名         : main * 函数功能                   : 主函数 * 输    入         : 无 * 输    出         : 无 *******************************************************************************/  void main(void) {         Second = 1;          Timer0Cofig();          while(1)         {                 if(Second == 70)                 {                         Second = 1;                 }                  //--宝田路通行,30秒--//                 if(Second < 31)                 {                         DisplayData[0] = 0x00;                         DisplayData[1] = 0x00;                         DisplayData[2] = DIG_CODE[(30 - Second) % 100 / 10];                         DisplayData[3] = DIG_CODE[(30 - Second) %10];                         DisplayData[4] = 0x00;                         DisplayData[5] = 0x00;                         DisplayData[6] = DisplayData[2];                         DisplayData[7] = DisplayData[3];                         DigDisplay();                          //--宝田路通行--//                          GPIO_TRAFFIC = 0xFF;  //将所有的灯熄灭                         RED00 = 1;                         GREEN00 = 1;                          GREEN11 = 0;    //宝田路绿灯亮                                                 GREEN10        = 0;    //宝田路人行道绿灯亮                          RED01 = 0;      //前进路红灯亮                         RED00 = 0;      //前进路人行道红灯亮                 }                  //--黄灯等待切换状态,5秒--//                 else if(Second < 36)                  {                         DisplayData[0] = 0x00;                         DisplayData[1] = 0x00;                         DisplayData[2] = DIG_CODE[(35 - Second) % 100 / 10];                         DisplayData[3] = DIG_CODE[(35 - Second) %10];                         DisplayData[4] = 0x00;                         DisplayData[5] = 0x00;                         DisplayData[6] = DisplayData[2];                         DisplayData[7] = DisplayData[3];                         DigDisplay();                          //--黄灯阶段--//                          GPIO_TRAFFIC = 0xFF;  //将所有的灯熄灭                         RED00 = 1;                         GREEN00 = 1;                          YELLOW11 = 0;    //宝田路黄灯亮                                                 RED10        = 0;     //宝田路人行道红灯亮                          YELLOW01 = 0;    //前进路红灯亮                         RED00 = 0;       //前进路人行道红灯亮                 }                  //--前进路通行--//                 else if(Second < 66)                  {                         DisplayData[0] = 0x00;                         DisplayData[1] = 0x00;                         DisplayData[2] = DIG_CODE[(65 - Second) % 100 / 10];                         DisplayData[3] = DIG_CODE[(65 - Second) %10];                         DisplayData[4] = 0x00;                         DisplayData[5] = 0x00;                         DisplayData[6] = DisplayData[2];                         DisplayData[7] = DisplayData[3];                         DigDisplay();                          //--黄灯阶段--//                          GPIO_TRAFFIC = 0xFF;  //将所有的灯熄灭                         RED00 = 1;                         GREEN00 = 1;                          RED11 = 0;       //宝田路红灯亮                                                 RED10 = 0;       //宝田路人行道红灯亮                          GREEN01 = 0;     //前进路绿灯亮                         GREEN00 = 0;     //前进路人行道绿灯亮                 }                  //--黄灯等待切换状态,5秒--//                 else                  {                         DisplayData[0] = 0x00;                         DisplayData[1] = 0x00;                         DisplayData[2] = DIG_CODE[(70 - Second) % 100 / 10];                         DisplayData[3] = DIG_CODE[(70 - Second) %10];                         DisplayData[4] = 0x00;                         DisplayData[5] = 0x00;                         DisplayData[6] = DisplayData[2];                         DisplayData[7] = DisplayData[3];                         DigDisplay();                          //--黄灯阶段--//                          GPIO_TRAFFIC = 0xFF;  //将所有的灯熄灭                         RED00 = 1;                         GREEN00 = 1;                          YELLOW11 = 0;    //宝田路黄灯亮                                                 RED10        = 0;     //宝田路人行道红灯亮                          YELLOW01 = 0;    //前进路红灯亮                         RED00 = 0;       //前进路人行道红灯亮                 }         }                                 }  /******************************************************************************* * 函 数 名         : DigDisplay * 函数功能                   : 使用数码管显示 * 输    入         : 无 * 输    出         : 无 *******************************************************************************/  void DigDisplay() {         unsigned char i;         unsigned int j;           for(i=0; i<8; i++)         {                 GPIO_PLACE = DIG_PLACE[i];           //发送位选                 GPIO_DIG = DisplayData[i];     //发送段码                 j = 10;                                                   //扫描间隔时间设定                 while(j--);                         GPIO_DIG = 0x00;               //消隐         } }  /******************************************************************************* * 函 数 名         : Timer0Cofig * 函数功能                   : 配置定时器 * 输    入         : 无 * 输    出         : 无 *******************************************************************************/  void Timer0Cofig(void) {         TMOD = 0x01;     //定时器0选择工作方式1     TH0  = 0x3C;         //设置初始值,定时50MS     TL0  = 0xB0;      EA   = 1;             //打开总中断     ET0  = 1;                 //打开定时器0中断     TR0  = 1;                 //启动定时器0         }  /******************************************************************************* * 函 数 名         : Timer0 * 函数功能                   : 定时器0中断函数 * 输    入         : 无 * 输    出         : 无 *******************************************************************************/                     void Timer0() interrupt 1 {         TH0 = 0x3C;         //设置初始值         TL0 = 0xB0;         Time++;         if(Time == 20)         {                 Second ++;                 Time = 0;         } }
回复

使用道具 举报

ID:352862 发表于 2018-6-21 22:52 | 显示全部楼层
zl2168 发表于 2016-6-28 15:42
实例30  带限行时间显示的模拟交通灯

有电路和程序设计吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表