找回密码
 立即注册

QQ登录

只需一步,快速开始

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

用单片机+lm331来设计数字电压表,为什么proteus中LCD显示一直不停的两个值直接跳动?

[复制链接]
跳转到指定楼层
楼主
一直这样跳动,稳定不了一个值。为什么啊发了程序和仿真


单片机源程序如下:
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit lcdrs=P2^0;  //液晶控制引脚
  5. sbit lcden=P2^1;
  6. unsigned long v = 0;
  7. unsigned int T0count;         //计数器计满次数,计满一次对应的脉冲数为65536个
  8. unsigned int timecount;         //定时器定时1秒的变量,每次对应为50ms,计20次对应就是1秒,然后计算一秒内的计数器脉冲个数
  9. bit flag;                                 //计时到1秒时该标志位置1,进行脉冲数的运算,得出结果送显示,然后该位清零,重新开始脉冲计数
  10. unsigned long x;                 //计算脉冲的数据范围一般比较大,所以用无符号长整形变量定义该变量
  11. uchar code table1[]="FREQ TO VOL TEST";        //初始化显示字符
  12. uchar code table2[]="              v ";        //初始化显示字符
  13. void delay(uint xms)         //延时函数
  14. {
  15.         int a,b;
  16.         for(a=xms;a>0;a--)
  17.                 for(b=110;b>0;b--);
  18. }
  19. void write_com(uchar com)        //写命令函数
  20. {
  21.         lcdrs=0;
  22.         P0=com;       
  23.         delay(1);
  24.         lcden=1;
  25.         delay(1);                                                                           
  26.         lcden=0;
  27. }

  28. void write_date(uchar date)        //写数据函数
  29. {
  30.         lcdrs=1;
  31.         P0=date;
  32.         delay(1);
  33.         lcden=1;
  34.         delay(1);
  35.         lcden=0;
  36. }
  37. void init_lcd()                                        //初始化函数
  38. {
  39.         uchar i;                                                                  
  40.         lcden=0;                                        //默认开始状态为关使能端,见时序图  
  41.         write_com(0x0f);
  42.         write_com(0x38);                        //显示模式设置,默认为0x38,不用变。
  43.         write_com(0x01);                        //显示清屏,将上次的内容清除,默认为0x01.
  44.         write_com(0x0c);                        //显示功能设置0x0f为开显示,显示光标,光标闪烁;0x0c为开显示,不显光标,光标不闪
  45.         write_com(0x06);                        //设置光标状态默认0x06,为读一个字符光标加1.
  46.         write_com(0x80);                        //设置初始化数据指针,是在读指令的操作里进行的
  47.         for(i=0;i<16;i++)                           //显示初始化
  48.         {
  49.                 write_date(table1[i]);                   //显示第一行字符
  50.         }
  51.         write_com(0x80+0x40);                           //选择第二行
  52.         for(i=0;i<16;i++)
  53.         {
  54.                 write_date(table2[i]);                   //显示第二行字符
  55.         }
  56. }

  57. void f_to_vol()
  58. {
  59. unsigned long Rt,RL,Rs;
  60. float Ct;
  61. Ct=4.7;
  62. Rt=10;
  63. RL=360;
  64. Rs=36;
  65. v=(2.09*Ct*Rt*RL*x)/Rs;                 
  66. }

  67. void display()                                                 //显示函数
  68. {
  69.         write_com(0x80+0x40+8);
  70.         write_date(v/1000%10+0x30);
  71.         write_date('.');
  72.         write_date(v/100%10+0x30);
  73.         write_date((v/10%10)+0x30);
  74.         write_date((v%10)+0x30);
  75. }
  76. void main(void)                                                   //主函数
  77. {
  78.         TMOD=0x15;                                                  //定义T1为定时模式,T0位计数模式
  79.         TH0=0;
  80.         TL0=0;                                                                   //计数器清零
  81.         TH1=0x3c;
  82.         TL1=0xb0;                                                           //定时器赋值(定时50ms)
  83.         TR1=1;                                                                   //打开定时器T1
  84.         TR0=1;                                                                   //打开计数器T0
  85.         ET0=1;                                                                   //打开中断允许
  86.         ET1=1;                                                                  //打开中断允许
  87.         EA=1;                                                                   //打开中断总开关
  88.         init_lcd();
  89.         while(1)                                                           //进入循环,因为括号内为常数1,不会变化,所以该表达式一直成立,又称死循环
  90.         {       
  91.                 f_to_vol();
  92.                 display();                                                  //调用显示函数
  93.                 if(flag)                                                   //判断1秒时间是否到
  94.                 {
  95.                         flag=0;                                           //标志位清零,计算完脉冲数后重新开始计时计数
  96.                         x=T0count*65536+TH0*256+TL0;  //读取1秒时间内的计数个数(T0count为每次计数超过65536时进入计数中断加1)
  97.                         T0count=0;                                           //计数器中断次数清零
  98.                         TH0=0;
  99.                         TL0=0;                                                   //计数器清零
  100.                         TR0=1;
  101.                         TR1=1;                                                  //重新打开定时计数器
  102.                 }
  103.         }
  104. }
  105.   
  106. void t0() interrupt 1                                          //计数器中断函数
  107. {
  108.   T0count++;                                                           //计数超过65536,就产生一次中断
  109. }
  110.   
  111. void t1() interrupt 3                                          //定时器中断函数
  112. {
  113.   TH1=0x3c;
  114.   TL1=0xb0;                                                           //50ms进入一次中断,进入中断后要重新赋初值
  115.   timecount++;                                                           //每进一次中断就是50ms,该变量加一
  116.   if(timecount==20)                                           //该变量加到20次时,代表1秒到了
  117.     {
  118.       TR0=0;                                                          //关闭计数器
  119.           TR1=0;                                                           //关闭定时器
  120.       timecount=0;                                                   //计时变量清零,准备下次定时
  121.       flag=1;                                                           //一秒时间到,该标志位置1,主函数中执行脉冲数运算与显示函数
  122.     }
  123. }
复制代码

所有资料51hei附件下载:
仿真程序.7z (103.65 KB, 下载次数: 14)


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

使用道具 举报

沙发
ID:301191 发表于 2022-3-27 18:10 | 只看该作者
顶一下
回复

使用道具 举报

板凳
ID:883242 发表于 2022-3-27 18:49 | 只看该作者
仿真不要太当真,能工作就行了。到底跳不跳只能用实物。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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