打印
[经验分享]

一个很简单的程序

[复制链接]
1996|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
guita|  楼主 | 2010-6-28 23:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
TE, ISP, se, ui, AI
本帖最后由 guita 于 2010-6-28 23:07 编辑

#include< reg52.h>
#include< intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code disp[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7f,0x39,0x3f,0x79,0x71};
//数码管显示十六进制,从0到f
uchar code select[]={7,6,5,4,3,2,1,0};
//位选数组,自左至右
uchar tt0,tt1;
uint temp1=0xfe;
uint temp=432;
void alllight();
void delay(uint z);
void init()   //初始化函数
{
TMOD=0x11;  //定时器0工作在方式一
TH0=(65536-50000)/256;  //装入初值
TL0=(65536-50000)%256;
TH1=(65536-50000)/256;  //装入初值
TL1=(65536-50000)%256;
EA=1;   //开总中断
ET0=1;   //开定时器0中断
ET1=1;
TR0=1;
TR1=1;   //计时开始
}
void Timer0() interrupt 1  //定时器0中断子程序
{
TH0=(65536-50000)/256;  //再次装入初值
TL0=(65536-50000)%256;
tt0++;
}
void Timer1() interrupt 3  //定时器1中断子程序
{
TH0=(65536-50000)/256;  //再次装入初值
TL0=(65536-50000)%256;
tt1++;
}

void display(uint temp)   //显示子程序
{
uint bai,shi,ge;
bai=temp/100;
shi=temp%100/10;
ge=temp%100%10;

if(bai!=0)    //此处的判断是为了消除重影,不然当没有到100时,百位上总会有一个0在隐隐约约的显示
  {
  P0=disp[bai];  //显示百位
  P2=select[2];
  delay(1);    //延时0.1s左右
  }
   
  P0=disp[shi];  //显示十位
  P2=select[1];
  delay(1);
  
  P0=disp[ge];  //显示个位
  P2=select[0];
  delay(1);
}

void delay(uint z)   //延时子函数,z为传递的参数,用来决定延时时间的长短,若z为1,延时时间大概为0.001s
{
uint x,y;
for(x=z;x>0;x--)
  for(y=10;y>0;y--);
}
void main()
{
init();

while(1)
{
  if(tt1!=2)   //数码管显示程序段
  {
   P0=disp[7];  //显示高三位的765
   P2=select[5];
   delay(1);
   P0=disp[6];
   P2=select[4];
   delay(1);
   P0=disp[5];
   P2=select[3];
   delay(1);
   display(temp);
  }
  else if(tt1==2)
  {
   
   tt1=0;
   if(temp==398)
   {
    TR1=0;
   }
   else
   {
    temp--;
   }
  }
  
  if(tt0==10)   //流水灯程序段
  {
   tt0=0;
   
   {
    if(temp==398)
     alllight();
   }
   temp1=_crol_(temp1,1);
   P1=temp1;
  }
}
}
void alllight()   //数码管停止后的动作
{
while(tt0<=60)
{
  temp1=0xff;  
  if(tt0%10==0)
  {
   P1=~temp1;
  }
  
  P0=disp[7];  //显示高三位的765
  P2=select[5];
  delay(1);
  P0=disp[6];
  P2=select[4];
  delay(1);
  P0=disp[5];
  P2=select[3];
  delay(1);
  display(temp);
}

while(1)
{
  P1=0xff;
  P0=0x76;  //显示字母H
  P2=3;
  delay(1);
  P0=0x79;  //显示字母E
  P2=4;
  delay(1);
  P0=0x38;  //显示字母L
  P2=5;
  delay(1);
  P0=0x38;  //显示字母L
  P2=6;
  delay(1);
  P0=0x3f;  //显示字母O
  P2=7;
  delay(1);
   
}
}
沙发
jimoxinl| | 2010-6-28 23:16 | 只看该作者
什么是重影?

使用特权

评论回复
板凳
guita|  楼主 | 2010-6-30 14:07 | 只看该作者
2# jimoxinl
没见过重影吗?就是图像不清楚,似乎有两个

使用特权

评论回复
地板
lu150| | 2010-6-30 14:31 | 只看该作者
明白说 就是被点亮的灯丝在瞬间熄灭时会有一个慢慢变暗的过程 这个过程很短 但是单片机点亮下组灯的时间小于这个变暗时间 所以就会产生重影。

使用特权

评论回复
5
lu150| | 2010-6-30 14:33 | 只看该作者
对了 这个还和人的视觉定视有关  !

使用特权

评论回复
6
lpydidi| | 2010-6-30 14:49 | 只看该作者
4楼这个解释不错

使用特权

评论回复
7
wangwo| | 2010-7-1 22:50 | 只看该作者
像是某些教科书上的风格

使用特权

评论回复
8
麻辣鸭脖子| | 2010-7-1 23:26 | 只看该作者
是哦,不过教科书上的一些程序在实际中根本不能用

使用特权

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

本版积分规则

0

主题

108

帖子

1

粉丝