打印

c语言程序问题

[复制链接]
1832|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
面包超人|  楼主 | 2013-4-13 21:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
通过8051和max7291控制两个共阴极四段数码管,一个四段数码管显示输入的速度值,另一个显示测得的速度值,详细电路图在道客巴巴中搜(基于单片机超速报警器中),但是该论文程序有问题,在仿真时按下按键数码管数字没变化,是什么问题呢?求各位武林高手指教
有问题的程序如下:
#ifndef _Max7219_H_   
#define _Max7219_H_
#include<intrins.h>
#include<reg51.h>
#define uchar unsigned char
#define uint  unsigned int
#define  DECODE_MODE   0x09 //译码方式
#define  INTENSITY     0x0A //亮度寄存器
#define SCAN_LIMIT    0x0B //扫描位数寄存器
#define  SHUT_DOWN     0x0C //低功耗模式寄存器
#define  DISPLAY_TEST  0x0D //显示测试寄存器
#define    delay1us        _nop_();//定义一微秒时间
#define    delay2us     {delay1us; delay1us ;}
#define    delay4us        {delay2us; delay2us ;}
#define    delay5us        {delay4us; delay1us ;}
#define delay12us    {delay4us; delay4us ; delay4us;}
sbit din=P2^0; //MAX7219串行数据输入,位操作,p2口0位
sbit load=P2^1;//MAX7219显示数据锁存控制
sbit clk=P2^2;//MAX7219串行时钟
void Max7219_Wr_byte(uchar wrdat);//写一个字节,
void Max7219_Wr_data(uchar addr,uchar dat);//写一个数据(2个参数)
void Init_Max7219(void);
void Disp_speed(uint speed);
void Disp_set_speed(uint set_speed);//初始化MAX7219
void Max7219_Init(void)
{
Max7219_Wr_data(SHUT_DOWN, 0x01);
Max7219_Wr_data(DISPLAY_TEST, 0x00);  
Max7219_Wr_data (DECODE_MODE, 0xff);
Max7219_Wr_data (SCAN_LIMIT, 0x07);
Max7219_Wr_data (INTENSITY, 0x0a);
}
void Max7219_Wr_byte (uchar wrdat)
{
bit dat;
uchar i;
for(i=0;i<8;i++)  
{  
clk=0;  //P2.2口打开
dat=(bit)(wrdat&0x80);//取最高位,并强制转化  ?????????????
if(dat)
din=1;
else
din=0;
wrdat<<=1; //左移
clk=1; //P2.2关闭
}
}
void Max7219_Wr_data(uchar addr,uchar dat)
{
load=0; //P2.1口打开
Max7219_Wr_byte ( addr );  //传递一个地址
Max7219_Wr_byte(dat);    //传递一个数据
load=1;//P2.1口关闭
}
void Disp_speed (uint speed)
{   
  uchar speed_buf [4];
uchar i;
speed_buf[0]=speed%10;
speed_buf[1]=speed/10%10|0x80 ;
speed_buf[2]=speed/100%10;
speed_buf[3]=speed/1000;
if(0==speed_buf[3])
{
  speed_buf[3]=0x0f;
  if(0==speed_buf[2])
  speed_buf[2]=0x0f;
  }
for(i=1;i<=4;i++)
  {
   Max7219_Wr_data (i, speed_buf [i-1]);
  }
}
void Disp_set_speed (uint set_speed)
{
uchar speed_buf[4];
uchar i;
speed_buf[0]=set_speed%10;
speed_buf[1]=set_speed/10%10|0x80;
speed_buf[2]=set_speed/100%10;
speed_buf[3]=set_speed/1000;
if(0==speed_buf[3])
{
  speed_buf[3]=0x0f;
  if(0==speed_buf[2])
  speed_buf[2]=0x0f;
  }   
  for(i=1;i<=4;i++)
  {
   Max7219_Wr_data (i+4, speed_buf [i-1]);
  }
}
#endif   //结束条件编译,编译时与前面最近的#if、#ifdef或#ifndef作
#include <reg51.h>
sbit KEY0=P2^3;
sbit KEY1=P2^4;
sbit KEY2=P2^5;
sbit KEY3=P2^6;
sbit SPK=P2^7;
sbit LED_GREEN=P1^6;
sbit LED=P1^7;
uint set_speed;
uint speed;
uchar sec_cnt;
void Init_8051(void);
void Delay(uchar time);
uint Get_key(void);
void Warn_ring(void);
void main(void)
{
Init_8051 ( );
Max7219_Init ( );
while (1)   
  {
set_speed=Get_key();//按键数据放入设定速度
Disp_speed(speed);
Disp_set_speed (set_speed);
Warn_ring ( );
}
}
void Delay(uchar time)
{
uchar t1,t2;
for(t1=time;t1>0;t1--)
for(t2=248;t2>0;t2--);
}
//初始化
void Init_8051(void)
{
EA=0;//关总中断  TCON=0x00;//定时器控制寄存器
TMOD=0x51;//设定工作方式,16位计数器方式
TL0=0xe0;    //定时20ms
TH0=0xb1;     
TL1=0xf3;   //定时器1装入初值,T1计数13个脉冲
TH1=0xff;
ET0=1;//   打开定时器         ???????????????????????????????????????
TR1=1;//打开计数器
IE=0x8a;//总中断,定时器0 ,1均打开
SPK=0;
LED=0;  //红灯关
LED_GREEN=1;//点亮绿灯   
}
//定时器0函数,定时50*20ms=1s
void Timer0_speed(void) interrupt 1
{
ET0=0;
TR0=0;
TL0=0xe0;
TH0=0xb1;
TR0=1;
sec_cnt++;
ET0=1;
}
//计数中断 计数10次  半径d=20cm
//speed=0.2*60*10/sec_cnt*36 km/h
void Counter_speed(void) interrupt 3
{   float a=6250;
ET1=0;
TR1=0;
TL1=0xf3;
TH1=0xff;
TR1=1;
speed=4.52*a/sec_cnt;
sec_cnt=0;
ET1=1;
}
//键盘处理函数
uint Get_key(void)
{
static uint  key_value;   
  if(!KEY0)
{
  Delay(40); //延时
  if(!KEY0)
  {
   while (KEY3)
   {
    if(!KEY1)
    {
     Delay(40);
     if(0==KEY1)
     {
      while (0==KEY1)
      {
       Disp_set_speed (key_value);
      }
      key_value+=10;
      if(key_value==9999)
        key_value=0;
     }
    }
    if(!KEY2)
    {
     Delay(40);//延时
     if(0==KEY2)
     {
      while (0==KEY2)
      {
       Disp_set_speed(key_value);
      }
key_value=10;
if(key_value==0)
;key_value=9999;
     }
    }
  }
  }
}
return (key_value);
}
//报警函数
void Warn_ring(void)
{
if(speed > set_speed)
{
  LED=1;//点亮红灯
  SPK=0;
  Delay(1);
  SPK=1;//speak报警
}
else
  LED=0;
}

相关帖子

沙发
rgh111| | 2013-4-13 22:53 | 只看该作者
这个作业最好楼主自已做, 然后发表纠错感言.
我觉得在二姨大家应该多交流技术问题, 而不能成为一味的布置作业的平台. :L

使用特权

评论回复
板凳
dirtwillfly| | 2013-4-14 09:34 | 只看该作者
同意楼上。需要交作业的学生朋友们,建议还是尽量自己做作业

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

6

帖子

1

粉丝