关于单片机的问题急需要解决

已锁定

小珠

  • 帖子

    3
  • 精华

    0
  • 被关注

    0

论坛等级:新手

注册时间:2004-12-02

普通 普通 如何晋级?

关于单片机的问题急需要解决

487

1

2005-01-18 18:27:44

我是一名即将毕业的学生,我所从事的是关于自动化方面工作,在以前的学习中我主要使用到的是PLC系列,然而最近有一个涉及单片机的问题让我头疼了很长一段时间,现在急需要解决,如果哪位大侠能够在这个星期五之前给我答复我真是感激不尽.

程序需实现以下内容:
A、B口输出
0、1、2三盏灯(对应绿黄红三盏交通灯)
程序至0为亮,至1为熄.
一个周期顺序为:
0号灯亮12秒,LED计数器(8位晶体管)倒计时(11、10、09、08……00)
倒计时到5秒时,0号灯照常亮,1号灯开始闪动,(每秒闪动一次,共闪动5次)
倒计时到00时,0号、1号灯熄灭,2号灯亮,亮12秒,LED计数器(8位晶体管)倒计时(11、10、09、08……00)
不停循环;
使用的是 ATMEGA16L 芯片单片机
Code Vision AVR软件C语言编程



程序
#include
#include
#define uchar unsigned char
#include "d:\wsl\jtdsy\7219.c"


uchar t[8]={15,15,15,15,15,15,0,0};
char x=16;
unsigned int s=12;
unsigned int m=0;
char h=0;
// Timer 2 output compare interrupt service routine
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
if(s==0)
s=12;

for(h=0;h<8;h++)
spi_xie(h+1,t[h]);

x--;
if(x==8)
{
m++;
PORTA.0=0;
PORTA.1=1;
PORTA.2=1;

x=16;
}
if(m==2)
{
m=0;
s--;
if(s<=5)PORTA.1=!PORTA.1;
if(s==0)
{
PORTA.0=1;
PORTA.1=1;
PORTA.2=0;

}


t[6]=(uchar)(s/10%10);
t[7]=(uchar)(s%10);
}

}


// Declare your global variables here

void main(void)
{

// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=Out Func1=Out Func0=Out
// State7=T State6=T State5=T State4=T State3=T State2=0 State1=0 State0=0
PORTA=0x00;
DDRA=0x07;



ASSR=0x00;
TCCR2=0x0F;
TCNT2=0x00;
OCR2=0xF5;


MCUCR=0x00;
MCUCSR=0x00;


TIMSK=0x80;

ACSR=0x80;
SFIOR=0x00;

// Global enable interrupts
#asm("sei")
spi_7219c();

while (1)
{

// Place your code here

};
}



(7219)程序
#include
#define uchar unsigned char
#define uint unsigned int
void spi_xie(uchar i,uchar j)
{
DDRB=0xBF; //PB.7(SCK)、PB.5(MOSI)、PB.4(/SS)为输出,
//PB.6(MISO)为输入,PB.3-PB.0未使用设为输出
SPCR=0x5e; //SPI设置:SPI使能、禁止中断,数据传送高位在前,
//数据传送频率为系统频率的64分频即62.5KHz
PORTB.4=0; //load_7219=0,选通7219
SPDR=i; //传送数据i
while(SPSR.7==0){}; //等待SPI发送完
SPDR=j; //传送数据j
while(SPSR.7==0){};
PORTB.4=1; //load_7219=1,装载所传送的数据并结束对7219的传送
}
/* 7219显示芯片初始化子程序 */
void spi_7219c(void)
{
spi_xie(0x0b,0x07); //显示8位
spi_xie(0x0a,0x08); //亮度调节
spi_xie(0x09,0xff); //每位BCD输入
spi_xie(0x0c,0x01); //工作状态
spi_xie(0x0f,0x00); //非测试
}
/* 无符号整数显示子程序,n为小数点的位置 */
void u_canshu_7219(uint y,uchar n)
{
uchar led[8];
uchar j;
led[0]=15;
led[1]=15;
led[2]=15;
led[3]=(char)(y/10000); //取万位数字
led[4]=(char)(y/1000%10); //取千位数字
led[5]=(char)(y/100%10); //取百位数字
led[6]=(char)(y/10%10); //取十位数字
led[7]=(char)(y%10); //取个位数字
for(j=0;j<8;j++)
{if(n==j) led[j]=led[j]+0x80; //小数点的处理
spi_xie(j+1,led[j]);}
}

/* 有符号整数显示子程序,n为小数点的位置 */
void canshu_7219(int y,uchar n)
{
uchar led[8];
uchar j;
if((y&0x8000)==0)led[2]=15; //符号的处理
else{y=~y+1;
led[2]=10;}
led[0]=15;
led[1]=15;
led[3]=(uchar)(y/10000); //取万位数字
led[4]=(uchar)(y/1000); //取千位数字
led[5]=(uchar)(y/100); //取百位数字
led[6]=(uchar)(y/10); //取十位数字
led[7]=(uchar)(y%10); //取个位数字
for(j=0;j<8;j++)
{if(n==j)led[j]=led[j]+0x80; //小数点的处理
spi_xie(j+1,led[j]);}
}

/* 多参数显示,前两位显示参数编号,后6位显示整型参数,小数点设在第n+1位 */
void xunce_7219(uchar i,int y,uchar n)
//把i送到显示器的第一、二位,把y送到第三至八位,n为小数点所在位
{ uchar led[8];
uchar j;
n=n&7;
led[0]=i/10;
led[1]=i%10;
if ((y&0x8000)==0) led[2]=15; //符号处理
else{y=~y+1;
led[2]=10;
}
led[3]=(uchar)(y/10000%10);
led[4]=(uchar)(y/1000%10);
led[5]=(uchar)(y/100%10);
led[6]=(uchar)(y/10%10);
led[7]=(uchar)(y%10);
for (j=0;j<8;j++)
{if(n==j) led[j]=led[j]+0x80; //加入小数点
spi_xie(j+1,led[j]); //送显示数据到7219
}
}

我遇到的问题是当我把这些程序设计出来以后运行发现,当1号灯(黄灯)闪过五次之后,2号灯(红灯)仅一闪就灭了!而没有达到延时12秒,计数器同时计时的要求!仅接着又是0号灯亮,好象程序又重新开始了一次.我研究了很长时间,想在后面加上delay_ms(12000)指令强制延时,可是这样子2号灯虽然延时亮了12秒钟,可是计数器却停了,等12秒钟以后,程序走完,又重新运行时,才又恢复先前0号灯亮计数器计时的状态.程序一定是有地方出了错误,可是凭我个人的能力无法找到问题,希望您能帮助我解决,谢谢。
关于单片机的问题急需要解决 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

谈天说地

共有13243条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。