找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1429|回复: 2
打印 上一主题 下一主题
收起左侧

萌新在搞智能台灯设计,论坛找到的仿真运行不了,数码管显示也有问题,有没有大佬...

[复制链接]
跳转到指定楼层
楼主
245黑币
代码如下
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/*uchar code table[]=
{
0x3F,0x06,0x66,0x4F,            
0x66,0x6D,0x7D,0x07,            
0x7F,0x6F,0x77,0x7C,            
0x39,0x5E,0x79,0x71,         
0x76,0x38,0x37,0x3E,           
0x73,0x5C,0x40,0x00,  
};*/
char code table[] = {0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,
    0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0x02};
uchar WE[] = {0xef,0xdf,0xbf,0x7f,0xfe,0xfd,0xfb,0xf7};
uchar Ly_Dis[4],Time1[3],Time2[3];
uchar dat, temp;
uint scale,num,num1,num2=990,num3;
bit CH,flag;
sbit CLK = P2^5;
sbit DI = P2^4;
sbit DO = P2^6;
sbit CS = P2^7;
sbit RELAY = P3^5;
sbit LED = P3^3;
sbit K1=P2^3;
sbit key2=P2^2;
sbit key3=P2^1;
sbit key4=P2^0;
void DelayMs(uint ms)
{
uint i, j;
for(i = ms; i > 0; i --)
  for(j = 110; j > 0; j --);
}
uchar Adc0832(uchar CH)
{
uchar i, test, adval;
adval  = 0x00;
test = 0x00;
CLK = 0;
DI = 1;
_nop_();
CS = 0;
_nop_();
CLK = 1;
_nop_();

if(CH == 0)
{
  CLK = 0;
  DI = 1; _nop_();
  CLK = 1; _nop_();
  CLK = 0;
  DI = 0; _nop_();
  CLK = 1; _nop_();
}
else
{
  CLK = 0;
  DI = 1; _nop_();
  CLK = 1; _nop_();
  CLK = 0;
  DI = 1; _nop_();
  CLK = 1; _nop_();
}
CLK = 0;
DI = 1;

for(i = 0; i < 8; i ++)
{
  _nop_();
  adval <<= 1;
  CLK = 1; _nop_();
  CLK = 0;
  if(DO)
   adval |= 0x01;
  else
   adval |= 0x00;
}

for(i = 0; i < 8; i ++)
{
  test >>= 1;
  if(DO)
   test |= 0x80;
  else
   test |= 0x00;
  _nop_();
  CLK = 1; _nop_();
  CLK = 0;
}

if(test == adval)
  dat = test;
_nop_();
CS = 1;
DO= 1;
CLK = 1;
return dat;
}
void Display(uchar num)
{
  uint i;
for(i = 0; i < 3; i ++)
{
  Ly_Dis[2 - i] = num % 10;
  num = num / 10;
}
Ly_Dis[3] = 0;

  P0 = WE[0];
  P1 = table[Ly_Dis[0]];
  DelayMs(4);
  
  P0 = WE[1];
  P1 = table[Ly_Dis[1]];
  DelayMs(4);
  
  P0 = WE[2];
  P1 = table[Ly_Dis[2]];
  DelayMs(4);
  
  P0 = WE[3];
  P1 = table[Ly_Dis[3]];
  DelayMs(4);
}
void Display1()
{
Time1[0]=num1/100;
Time1[1]=num1%100/10;
Time1[2]=num1%10;

P0 = WE[5];
P1 = table[Time1[0]];
DelayMs(4);

P0 = WE[6];
P1 = table[Time1[1]];
DelayMs(4);

P0 = WE[7];
P1 = table[Time1[2]];
DelayMs(4);
}
Display2()
{
Time2[0]=num2/100;
Time2[1]=num2%100/10;
Time2[2]=num2%10;

P0 = WE[5];
P1 = table[Time2[0]];
DelayMs(4);

P0 = WE[6];
P1 = table[Time2[1]];
DelayMs(4);

P0 = WE[7];
P1 = table[Time2[2]];
DelayMs(4);
}
void Relay()
{
if(temp >= 125&&temp!=0)
{
  RELAY = 0;
}
else
{
  if(temp!=0)
  RELAY = 1;
}
}
void Init()
{
RELAY = 1;
LED = 0;
TMOD=0x12;
TH0=0x06;
TL0=0x06;
TR0=1;
ET0=1;
EA=1;
TH1=(65536-50000)/256;   
TL1=(65536-50000)%256;
ET1=1;
TR1=1;
}
void KeyScan()
{
  if(K1 == 0)
  {
   DelayMs(10);
   if(K1 == 0)
   {
    scale++;
    if(scale==10)
     scale=0;
   }
   while(!K1);
  }
  
  if(key2==0)
{
  DelayMs(10);
  if(key2==0)
  {
   flag=~flag;
  }
  while(!key2);
}

if(key3==0)
{
  DelayMs(10);
  if(key3==0)
  {
   num2+=10;
   if(num2==990)
    num2=0;
  }
  while(!key3);
}

if(key4==0)
{
  DelayMs(10);
  if(key4==0)
  {
   num2-=10;
   if(num2==0)
    num2=990;
  }
  while(!key4);
}
}
void main()
{
uint i;
Init();
while(1)
{
  temp = Adc0832(1);
  i ++;
  if(i == 50)
  {
   if(temp != 0)
   //Display(temp);
   //DelayMs(100);
   i = 0;
  }
  Relay();
  KeyScan();
  
   if(flag==0)
   Display1();
  else
   Display2();
  if(num1==num2)
  {
   LED=1;
   while(!key2);
  }
}
}
void timer0() interrupt 1
{
static uint tt;
tt++;
if(tt==10)
{
  tt=0;
  LED=0;
}
if(scale==tt)
LED=1;
}
void Timer1() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
num++;
if(num==20)
{
  num=0;
  num3++;
   if(num3==60)
   {
    num3=0;
    num1++;
    if(num1==990)
     num1=0;
   }
}
}


捕获2.PNG (174.79 KB, 下载次数: 56)

捕获2.PNG

捕获1.PNG (168.68 KB, 下载次数: 52)

捕获1.PNG
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:267719 发表于 2020-6-6 23:30 | 只看该作者
楼主的硬件电路只能在仿真里做做,做成实物会
1:程序跑不起来,因为EA接了VCC,没接地;
2:三极管Q1,Q3会烧毁,单片机可能会烧毁;因为三极管基极没有电阻,低电平时,电源对地等效接二极管短路。
3:D10-D25发光二极管会烧毁,因为没有限流电阻;
4:数码管可能会烧毁,也是因为没有限流电阻;
5:继电器驱动不起来;因为串联220欧电阻能否驱动,要看你继电器的选型了;

软件方面:
1:你注释掉的译码是对的;
2:
if(key3==0)
{
  DelayMs(10);
  if(key3==0)
  {
   num2+=10;
   if(num2==990)
    num2=0;
  }
  while(!key3);
}
边界有问题。刚开始你是uint scale,num,num1,num2=990,num3;
按了key3,结果num2+10=1000;1000!=990,所以num2不会被变为0。结果就是1000,超过了990.
key4存在同样问题,当num变为0后,按了key4键,num=65526。。。
4:如果单片机时钟是12MHz,12T,那定时器1定时周期50ms,被num分频20,就是1000ms,被num3分频60,就是1分钟。意味着num1要等1分钟才会变一次。仿真显示你有没有等一分钟后看过结果?

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:332444 发表于 2020-6-7 06:50 | 只看该作者
学些新的数码管动态知识,可参http://www.51hei.com/bbs/dpj-189201-1.html,有代码有示例工程下载。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表