五、软件设计
5.1 设计流程图
5.2 程序清单
#include
sbit ADDR3 = P1^3; sbit ENLED = P1^4;
unsigned char code LedChar[] = { //数码管显示字符转换表 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E };
unsigned char LedBuff[7] = { //数码管+独立LED显示缓冲区 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
bit flag1s = 1;
unsigned char T0RH = 0; unsigned char T0RL = 0;
void ConfigTimer0(unsigned int ms); void TrafficLight(); void main() {
TMOD = 0x01; TH0 = (65536 - DELAY) / 256; TL0 = (65536 - DELAY) % 256; EA = 1; //开总中断 ET0 = 1; TR0 = 1; P0=0xff;
P1=0x00; //设置定时器为中断工作模式 ENLED = 0; //使能数码管和LED ADDR3 = 1;
ConfigTimer0(1); //配置T0定时1ms
while(NSEMERGENCY&&EWEMERGENCY) { timeDisplay_Blue(); timeDisplay_Red(); if(flag) stateChange(); stateChange_Glint(); }
while (1) {
if (flag1s) //每秒执行一次交通灯刷新 {
flag1s = 0; TrafficLight(); } } }
void ConfigTimer0(unsigned int ms) {
unsigned long tmp; //临时变量
//紧急情况处理 tmp = 11059200 / 12; //定时器计数频率 tmp = (tmp * ms) / 1000; //计算所需的计数值 tmp = 65536 - tmp; //计算定时器重载值
tmp = tmp + 18; //补偿中断响应延时造成的误差
T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节 T0RL = (unsigned char)tmp;
TMOD &= 0xF0; //清零T0的控制位 TMOD |= 0x01; //配置T0为模式1 TH0 = T0RH; //加载T0重载值 TL0 = T0RL;
ET0 = 1; //使能T0中断 TR0 = 1; //启动T0 }
void TrafficLight() {
static unsigned char color = 2; static unsigned char timer = 0;
if(timer == 0) { switch(color) { case 0: color = 1; timer = 2; LedBuff[6] = 0xE7; break; case 1: color = 2; timer = 29; LedBuff[6] = 0xFC; break; case 2: color = 0; timer = 39; LedBuff[6] = 0x3F; break; default: break; } }
else { timer--; }
LedBuff[0] = LedChar[timer]; LedBuff[1] = LedChar[timer/10]; }
void LedScan() {
static unsigned char i = 0; //动态扫描索引
P0 = 0xFF; //关闭所有段选位,显示消隐 P1 = (P1 & 0xF8) | i; //位选索引值赋值到P1口低3位
P0 = LedBuff[i]; //缓冲区中索引位置的数据送到P0口 if (i < 6) //索引递增循环,遍历整个缓冲区 i++; else
i = 0; }
void InterruptTimer0() interrupt 1 {
static unsigned int tmr1s = 0; //1秒定时器
TH0 = T0RH; //重新加载重载值 TL0 = T0RL;
LedScan(); //LED扫描显示 tmr1s++; //1秒定时的处理 if (tmr1s >= 1000) {
tmr1s = 0;
flag1s = 1; //设置秒定时标志 } }
六、总结
经过三个星期的努力,终于完成了自己的计算机控制课程设计。虽说忙碌了点,但我觉得这样的生活充实且有成就感,当然,也获益匪浅。
通过这次交通灯的课程设计,让我提高了用专业知识、专业技能分析和解决现实问题的能力。使我在单片机的基本原理、单片机应用学习过程中,以及在常用编程设计思路技巧的掌握方面都能向前迈了一大步,课程设计让我把以前学习
到的知识得到巩固和进一步的提高认识,并且对已有知识有了更深层次的理解和认识。可以说在整个软件设计过程中,我不仅学会了延时的两种方法,即软件延时和硬件延时,还掌握数码管的两种显示方式(即动态显示与静态显示)及其如何选择。
在整个课程设计过程我还掌握了一下几点:
(1)掌握了电子系统设计的流程,熟悉了各种硬件电路以及软件编程方法。 (2)理解了最单片机的各部分组成及特性。 (3)熟练使用了各种计算机辅助设计工具完成设计,充分掌握了这些工具的使用。
通过本次的课程设计,充分意识到自己所学的东西还是非常有限的,不过通过设计,还是学到了一些书本上没有学到的东西,为自己以后的学习起了很大的帮助。就我个人而言,很深刻地体会到一点,那就是我们在设计过程中一定要有一个整体的清晰的思路,知道自己的设计的对象的基本功能和核心器件的适用及其作用,只要把握住这些主要方面,一些小问题都将围绕着这些主要问题而逐步得到解决。同时我也懂得,在整个设计过程中,生活中也一样,一定要意志坚定,克服自己的畏难情绪,这样才能将事情做好,才能干出一番成就。最后,对在这个课程设计过程中帮助我的所有同学和各位指导老师再次表示衷心的感谢!