找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

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

查看数: 3214 | 评论数: 2 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2019-3-27 22:58

正文摘要:

希望好心人帮帮我- - 下面是源代码 #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; u ...

回复

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. }
复制代码



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

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

Powered by 单片机教程网

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