找回密码
 立即注册

QQ登录

只需一步,快速开始

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

智能温控风扇单片机仿真设计,想知道为什么仿真的时候数码管不两 不显示数字

[复制链接]
跳转到指定楼层
楼主
10黑币

希望好心人帮帮我- - 下面是源代码
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P1^7;
sbit key1=P1^3;
sbit key2=P1^4;
sbit dianji=P3^1;
float ff;
uint y3;
uchar shi,ge,xiaoshu,sheding=20,gaonum,dinum;
uchar code dispcode[]={  //段码
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar code tablel[]={  //带小数点的段码
0xbf,0x86,0xdb,0xcf,
0xe6,0xed,0xfd,
0x87,0xff,0xef};
uchar dispbitcode[]={ //位选
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
uchar dispbuf[8]={0,0,0,0,0,0,0,0};
void Delay(uint num)// 延时函数
{
while( --num );
}
void digitalshow(uchar a4,uchar a3,uchar a2,uchar a1,uchar a0)
{
dispbuf[0]=a0;
dispbuf[1]=a1;
dispbuf[2]=a2;
dispbuf[3]=a3;
dispbuf[4]=a4;
P2=0xff;
P0=dispcode[dispbuf[0]];
P2=dispbitcode[5];
Delay(1);
P2=0xff;
P0=dispcode[dispbuf[1]];
P2=dispbitcode[4];
Delay(1);
P2=0xff;
P0=dispcode[dispbuf[2]];
P2=dispbitcode[2];
Delay(1);
P2=0xff;
P0=tablel[dispbuf[3]];
P2=dispbitcode[1];
Delay(1);
P2=0xff;
P0=dispcode[dispbuf[4]];
P2=dispbitcode[0];
Delay(1);
}
void dmsec(uint count)
{
uint i; // 1ms 延时
while(count--)
{
for(i=0;i<125;i++){}
}
}
void tmreset(void)
{
DQ=0;
Delay(90); // 精确延时 大于 480us
DQ=1;
Delay(4); // 90,4 可以小范围变化
}
void tmpre(void)
{
while(DQ);
while(~DQ);
Delay(4);
}
bit tmrbit(void)
{
uint i;
bit dat;
DQ=0;
i++; // i++;大概 1us
DQ=1;
i++;
i++;
dat=DQ;
Delay(8);
return(dat);
}
uchar tmrbyte(void) //读一个比特
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmrbit();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
void tmwbyte(uchar dat) //写一个比特
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1; // 从低位开始
if(testb) // Write 1
{
DQ=0; // 先拉低
i++;
i++; // >1us
DQ=1;
Delay(4);
}
else // Write 0
{
DQ=0;
Delay(4);
DQ=1;
i++;
i++; // 再拉高
}
}
}
void tmstart(void) //ds1820 开始转换
{
dmsec(1);
tmreset();
tmpre();
dmsec(1);
tmwbyte(0xcc); // skip rom
tmwbyte(0x44); // 转换
}
uchar tmrtemp(void) //读取温度
{
uchar a,b;
tmreset();
tmpre();
dmsec(1);
tmwbyte(0xcc); // skip rom
tmwbyte(0xbe); // 转换
a=tmrbyte(); // LSB 低 8 位
b=tmrbyte(); // MSB 高 8 位
y3=b;
y3<<=8;
y3=y3|a;
ff=y3*0.0625;
y3=ff*10+0.5;
return(y3);
}
void keyscan(void)
{
if(key1==0)
{
dmsec(5);
if(key1==0)
{
sheding++;
if(sheding==100)
sheding=20;
}
while(!key1);
}
else if(key2==0)
{
dmsec(5);
if(key2==0)
{
sheding--;
if(sheding==0)
sheding=20;
}
while(!key2);
}
}
void deal(uint tmp) //温度处理
{
if(tmp<=sheding)
{
gaonum=0;
dinum=4;
}
else if((tmp>sheding)&&(tmp<=(sheding+5)))
{
gaonum=1;
dinum=3;
}
else if((tmp>(sheding+5))&&(tmp<=(sheding+10)))
{
gaonum=2;
dinum=2;
}
else if((tmp>(sheding+10))&&(tmp<=(sheding+15)))
{
gaonum=3;
dinum=1;
}
else
{
gaonum=4;
dinum=0;
}
}
void dianjik() //电机控制
{
uchar q,i;
for(q=0;q<dinum;q++)
{
dianji=0;
digitalshow(shi,ge,xiaoshu,sheding/10,sheding%10);
for(i=255;i>0;i--)
{
digitalshow(shi,ge,xiaoshu,sheding/10,sheding%10);
}
}
for(q=0;q<gaonum;q++)
{
dianji=1;
digitalshow(shi,ge,xiaoshu,sheding/10,sheding%10);
for(i=255;i>0;i--)
{
digitalshow(shi,ge,xiaoshu,sheding/10,sheding%10);
}
}
}
void main(void)
{
uint last;
dianji=0;
tmstart();
dmsec(450); // 初始化 ds18b20
while(1)
{
tmstart(); // ds1820 开始转换
dmsec(2);
last=tmrtemp()+256; // 读取温度
shi=last/100;
ge=(last%100)/10;
xiaoshu=(last%100)%10;
keyscan();
dmsec(2);
deal(last/10);
dianjik();
}
}

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

使用道具 举报

沙发
ID:96682 发表于 2019-3-28 11:55 | 只看该作者
LZ 共阴的却用共阳接法,电路图有误程序上有瑕疵还不匹配
回复

使用道具 举报

板凳
ID:213173 发表于 2019-3-28 17:33 | 只看该作者
你这程序大量采用dmsec()软件延时,哪能正常工作?给你改好了,你试试。 智能温控风扇单片机仿真设计+仿真.zip (118.09 KB, 下载次数: 24)


  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit DS=P1^6;
  6. sbit key1=P3^6;
  7. sbit key2=P3^7;
  8. sbit dianji=P1^0;
  9. uchar code smgdu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9数码管段码
  10. uchar code smgwei[]={0xef,0xdf,0xbf,0x7f};       //1~4数码管位码
  11. uchar TempData[4];//温度显示值缓存
  12. uchar TempData1[3];//设定显示值缓存
  13. uchar set=25;                //设定值变量
  14. uint  count=0;                //显示设定值计数延时变量
  15. bit Flag=0;        //读时间标志
  16. bit Allow=0;//设置状态标志
  17. void delay_us(uchar us)//约2us延时函数
  18. {
  19.         while(--us);
  20. }
  21. void delay(uchar z)//约1ms延时函数
  22. {
  23.         while(z--)
  24.         {
  25.                 delay_us(245);
  26.                 delay_us(245);
  27.         }
  28. }

  29. void display() //4个数码管显示
  30. {
  31.         static uchar i;
  32.         P0=0x00;                        //消隐
  33.         if(Allow==1)
  34.         {
  35.                 switch(i)        //显示设定值
  36.                 {
  37.                         case 0: i++; break;
  38.                         case 1: P2=smgwei[i];P0=TempData1[i];i++; break;
  39.                         case 2: P2=smgwei[i];P0=TempData1[i];i=0; break;
  40.                 }
  41.         }
  42.         else
  43.         {
  44.                 switch(i)        //显示温度值
  45.                 {
  46.                         case 0: P2=smgwei[i];P0=TempData[i];i++; break;
  47.                         case 1: P2=smgwei[i];P0=TempData[i];i++; break;
  48.                         case 2: P2=smgwei[i];P0=TempData[i];i++; break;
  49.                         case 3: P2=smgwei[i];P0=TempData[i];i=0; break;
  50.                 }
  51.         }
  52. }
  53. //读一个字节
  54. uchar read_byte()
  55. {
  56.         uchar i,dat;
  57.         for(i=0;i<8;i++)
  58.         {
  59.                 DS=0;
  60.                 dat>>=1;
  61.                 DS=1;
  62.                 if(DS)
  63.                 dat|=0x80;
  64.                 delay_us(25);
  65.         }
  66.         return (dat);
  67. }  
  68. //写一个字节
  69. void write_byte(uchar dat)
  70. {
  71.         uchar i;
  72.         for(i=0;i<8;i++)
  73.         {
  74.                 DS=0;
  75.                 DS=dat&0x01;
  76.                 delay_us(25);
  77.                 DS=1;
  78.                 dat>>=1;
  79.         }
  80. }
  81. //单总线初始化时序         
  82. bit ds_init()
  83. {
  84.         bit i;
  85.         DS=1;
  86.         delay_us(5);
  87.         DS=0;
  88.         delay_us(200);
  89.         delay_us(200);
  90.         DS=1;
  91.         delay_us(50);
  92.         i=DS;
  93.         delay_us(25);
  94.         return (i);
  95. }
  96. uint ReadTemperature()
  97. {
  98.         uint H,i;
  99.         uchar L;
  100.         ds_init();//初始化温度传感器
  101.         write_byte(0xcc);//发送跳跃ROM指令
  102.         write_byte(0x44);//发送温度转换指令
  103.         delay(10);
  104.         ds_init();//初始化温度传感器
  105.         write_byte(0xcc);//发送跳跃ROM指令
  106.         write_byte(0xbe);//读取温度传感器暂存器的值
  107.         L=read_byte();
  108.         H=read_byte();
  109.         H<<=8;
  110.         i=L+H;
  111.         return(i);
  112. }
  113. /*************************
  114.           按键扫描程序
  115. *************************/
  116. void key_scan()
  117. {
  118.         static bit key1_sign,key2_sign;                        //按键自锁标志变量
  119.         static uint count1,count2;                                //消抖计数变量                       

  120.         if(!key1)                                                        //检测按键1按下
  121.         {
  122.                 if((++count1>=100)&&(key1_sign==0))//检测消抖计数与按键1自锁标志
  123.                 {                       
  124.                         key1_sign=1;                        //按键1自锁标志置1
  125.                         Allow=1;                                        //显示设定值
  126.                         count=0;                                        //显示设定值计数延时清0
  127.                         if(set<90)
  128.                                 set++;                                //调整设定值变量自+1
  129.                         TempData1[1]=smgdu[set/10];
  130.                         TempData1[2]=smgdu[set%10];
  131.                 }
  132.         }
  133.         else
  134.         {
  135.                 key1_sign=0;                                //按键1自锁标志清0
  136.                 count1=0;                                        //消抖计数count1清0
  137.         }
  138.         if(!key2)                                                        //检测按键2按下
  139.         {
  140.                 if((++count2>=100)&&(key2_sign==0))//检测消抖计数与按键1自锁标志
  141.                 {                       
  142.                         key2_sign=1;                        //按键1自锁标志置1
  143.                         Allow=1;                                        //显示设定值
  144.                         count=0;                                        //显示设定值计数延时清0
  145.                         if(set>20)
  146.                                 set--;                                //调整设定值变量自-1
  147.                         TempData1[1]=smgdu[set/10];
  148.                         TempData1[2]=smgdu[set%10];
  149.                 }
  150.         }
  151.         else
  152.         {
  153.                 key2_sign=0;                                //按键1自锁标志清0
  154.                 count2=0;                                        //消抖计数count1清0
  155.         }
  156. }
  157. void Timer0Init()             //2毫秒@12.000MHz
  158. {
  159.         TMOD= 0x01;                //设置定时器模式
  160.         TL0 = 0x30;                //设置定时初值
  161.         TH0 = 0xF8;                //设置定时初值
  162.         TR0 = 1;                //定时器0开始计时
  163.         EA=1;
  164.         ET0=1;
  165. }
  166. void main()
  167. {        
  168.         uint  temp;
  169.         uchar TempH,TempL;
  170.         bit   negative;//负数标志
  171.        
  172.         Timer0Init();   //初始化定时器   
  173.         while(1)           
  174.         {
  175.                 if(Flag==1)         
  176.                 {
  177.                         Flag=0;
  178.                         temp=ReadTemperature();//读取温度
  179.                         if(temp&0x8000)
  180.                         {
  181.                                 negative=1;                //负号标志
  182.                                 temp=~temp;                //取反加1
  183.                                 temp +=1;
  184.                         }
  185.                         else negative=0;        //正数
  186.        
  187.                         TempH=temp>>4;                //分解为整数
  188.                         TempL=temp&0x0F;        //分解为小数
  189.                         TempL=TempL*6/10;        //保留一位小数
  190.        
  191.                         if(negative==1)
  192.                         TempData[0]=0x40;//显示负号
  193.                         else if(TempH/100==0)//小于100
  194.                         TempData[0]=0;             //百位消隐
  195.                         else
  196.                         TempData[0]=smgdu[TempH/100]; //显示百位温度
  197.        
  198.                         if((TempH/100==0)&&((TempH%100)/10==0))
  199.                         TempData[1]=0;              //十位消隐
  200.                         else
  201.                         TempData[1]=smgdu[(TempH%100)/10];        //显示十位温度
  202.                         TempData[2]=smgdu[(TempH%100)%10]|0x80;//显示个位温度,带小数点
  203.                         TempData[3]=smgdu[TempL];      //显示小数温度1位        
  204.                 }
  205.                 if(TempH>=set)          //温度超过设定温度,电机启动
  206.                         dianji=0;
  207.                 else dianji=1;        

  208.                 key_scan();
  209.         }
  210. }
  211. void timer0int() interrupt 1 //定时器,定时2ms
  212. {
  213.         static uchar num;
  214.         TL0 = 0x30;                //设置定时初值
  215.         TH0 = 0xF8;                //设置定时初值
  216.         display();
  217.         if(++num>=250)   //延时500ms读温度数值
  218.         {
  219.                 num=0;
  220.                 Flag=1;
  221.         }        
  222.         if(Allow==1)       
  223.         {
  224.                 if(++count>=1000)        //显示设定值计数延时
  225.                 {
  226.                         Allow=0;                        //恢复正常显示
  227.                         count=0;                        //计数清0
  228.                 }
  229.         }
  230. }
复制代码



回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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