历史上的今天
今天是:2024年12月29日(星期日)
2020年12月29日 | 智能交通灯控制系统单片机课程设计
2020-12-29 来源:51hei

图15 紧急车
4、心得体会
这次交通灯的制作是我学会了不少的东西,首先是proteus和keil的使用。单片机程序的编写和原理图的仿真都是在这两个软件的运行下才可以进行的。这个实验最重要的是让我对51系列的单片机有了更深层次的了解,这一学期开始接触单片机的时候觉得这是一门极其高深的课程,老师讲的什么基本完全不懂,课后看仍旧是一头雾水。通过交通灯的学习和制作,对单片机有了初步的了解,知道了它的组成、工作原理等等。
在软件编写这一块,开始时遇到了很大的难题,因为两百行的程序,哪怕有一个错误,修改起来也不是十分方便。时常没有心思去寻找和改正错误,所以软件这一块花了很大的一部分时间。几次调试后总算出现“0 warning”和“0 error”的字样。
除了学会很多东西以为,也发现了自己的不足。由于自己在这一方面只是的短缺,所以很多问题都需要查阅资料或者向别的同学请教。比如说proteus和keil的使用方法,都是看着别人操作几遍之后才慢慢学会。另外,由于时间问题,没能做到真正的实物实现,没有接触到焊接工作,这一点是十分遗憾的,相信如果做了实物实现,可能还会遇到更多的问题,学习到更多的实践知识。
庆幸设计模拟结果是成功的,模拟出了交通灯的功能,各个按键的功能也和模拟时一致,看着数字的跳动自己信息也感到十分开心。虽然想过在这个交通灯里加入一些额外的功能,但终究由于自己知识的局限性而放弃,有点遗憾,不过能够学到东西就好。此次试验增长了自己的单片机知识外也让我知道实践和理论学习的差别。实践过程中学到的知识自己记得会更加牢固一些,不容易忘记。总的来说,单片机的制作让我收获不小。
附件2 原理图

#include #define uchar unsigned char #define uint unsigned int uchar data buf[4]; uchar data sec_dx = 20;//东西数默认 uchar data sec_nb = 30;//南北默认值 uchar data set_timedx = 20; uchar data set_timenb = 30; int n; uchar data b;//定时器中断次数 sbit k1 = P1 ^ 6;//++ sbit k2 = P1 ^ 7; //-- sbit k3 = P2 ^ 7; //确定 sbit k4 = P3 ^ 0; //切换方向 sbit k5 = P3 ^ 1; //紧急车 sbit Yellow_nb = P2 ^ 5; //南北黄灯标志 sbit Yellow_dx = P2 ^ 2; //东西黄灯标志 sbit Green_nb = P2 ^ 4; sbit Green_dx = P2 ^ 1; sbit Red_nb = P2 ^ 6; sbit Red_dx = P2 ^ 3; sbit Buzz = P3 ^ 7; bit Buzzer_Indicate; bit time = 0;//灯状态循环标志 bit set = 1;//调时方向切换键标志 uchar code table[11] = { //共阴极字型码 0x3f, //--0 0x06, //--1 0x5b, //--2 0x4f, //--3 0x66, //--4 0x6d, //--5 0x7d, //--6 0x07, //--7 0x7f, //--8 0x6f, //--9 0x00 //--NULL }; //函数的声明部分 void delay(int ms);//延时子程序 void key();//按键扫描子程序 void key_to1();//键处理子程序 void key_to2(); void key_to3(); void display();//显示子程序 void logo(); //开机LOGO void Buzzer(); //主程序 void main() { TMOD = 0X01; /*TH0 = 0XD8; TL0 = 0XF0;*/ TH0 = 0X3C; //1101 1000 50ms TL0 = 0XB0; EA = 1; ET0 = 1; TR0 = 1; //开始 EX0 = 1; //外部中断0请求标志 允许 EX1 = 1; logo(); P2 = 0Xc3;// 开始默认状态,东西绿灯,南北黄灯 sec_nb = sec_dx + 5; while (1) { key(); //调用按键扫描程序 display(); //调用显示程序 //Buzzer(); } } //函数的定义部分 void key() //按键扫描子程序 { if (k1 != 1) { delay(10); if (k1 != 1) { while (k1 != 1) { key_to1(); //时间增加 for (n = 0; n < 40; n++) { display(); } } } } if (k2 != 1) { delay(10); if (k2 != 1) { while (k2 != 1) { key_to2(); //时间减少 for (n = 0; n < 40; n++) { display(); } } } } if (k3 != 1) { TR0 = 1; //启动定时器 Buzzer_Indicate = 0; sec_nb = set_timenb; //从中断回复,仍显示设置过的数值 sec_dx = set_timedx; if (time == 0) { P2 = 0X99; sec_nb = sec_dx + 5; } else { P2 = 0xC3; sec_dx = sec_nb + 5; } } if (k4 != 1) { //切换方向 delay(5); if (k4 != 1) { while (k4 != 1); set = !set; } } if (k5 != 1) { delay(5); if (k5 != 1) { while (k5 != 1) //紧急车 key_to3(); } } } void display() //显示子程序 { buf[1] = sec_dx / 10; //第1位 东西秒十位 buf[2] = sec_dx % 10; //第2位 东西秒个位 buf[3] = sec_nb / 10; //第3位 南北秒十位 buf[0] = sec_nb % 10; //第4位 南北秒个位 P1 = 0xff; // 初始灯为灭的 P0 = 0x00; P1 = 0xfe; //片选LCD1 P0 = table[buf[1]]; delay(1); P1 = 0xff; P0 = 0x00; P1 = 0xfd; //片选LCD2 P0 = table[buf[2]]; delay(1); P1 = 0xff; P0 = 0x00; P1 = 0Xfb; //片选LCD3 P0 = table[buf[3]]; delay(1); P1 = 0xff; P0 = 0x00; P1 = 0Xf7; P0 = table[buf[0]]; //片选LCD4 delay(1); } void time0(void) interrupt 1 using 1 //定时中断 定时器0 子程序 { Buzz = 1; b++; if (b == 20) // 定时器中断次数 { Buzz = 0; b = 0; sec_dx--; sec_nb--; if (sec_nb <= 5 && time == 0) //东西黄灯闪
史海拾趣
|
由于编程的需要,采用Double型存储数据,可是,在调试的时候,Memory观察窗中发现Double型会自动将后面几位截取,进而用指数来表示,不知道这只是显示的问题,还是它存储的数据就是截掉末尾几位的了?… 查看全部问答> |
|
用vga640480这程序 实现一个HS里包含800个CLK 1个VS里包含525个HS library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity vga640480 is port (clk :in std_logic; ...… 查看全部问答> |
|
写了一个字符设备的驱动,但用的是驱动模型框架,用的是platform_driver_register接口注册的,然后在probe里注册一个字符设备驱动,现在驱动已经加载上了,用lsmod |grep xxx, cat /procmodules | grep xxx, ls /sys/modules/xxx都已经有相关信息, ...… 查看全部问答> |
|
The process of changing an EXE or DLL program file after it has been loaded to reflect the actual load address is called “fixing up”. 哪位朋友能帮我解释下这个fix up的意思么? 还有这样一句: kernel.dll is also ‘fixed up’ by ...… 查看全部问答> |
|
Altium 对于 Atmel Touch Controls 的支持 (中) 使用 SmallQTouchSlider 器件来实现一个小型slider传感器。这是一个自电容,一维,立体内插式传感器。它有三个独立通道直接连接到Atmel QTouch 感应控制器。相应的sensor模板在PCB中是由简单的矩形电极组成。这个模板包含2个完 ...… 查看全部问答> |
|
请教一下大家,我用的是cycloneIII 的EP3C25E144I7N,很奇怪的是芯片能正常用JTAG和AS口加载,但测试管脚输出频率不对。最后发现用示波器测量晶振的输出频率及波形均正常,但从quartus观测FPGA内部并没有接收到该信号,这是为什么,请大家指教。 P ...… 查看全部问答> |




