找回密码
 立即注册

QQ登录

只需一步,快速开始

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

1602液晶显示的电压表程序

  [复制链接]
跳转到指定楼层
楼主
ID:70976 发表于 2014-12-26 21:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 daniu 于 2014-12-26 21:31 编辑

STC12C5406AD 晶振频率为12MHz 指令周期:本程序取:1.0us/6倍。

本程序已调试完成:

功能说明:STC12C5406AD+74HC164+1602液晶显示的电压表。
测量电压:采用10位AD测量,测量结果非常准确。


  1. #include "stc12c5410ad.h"//头文件
  2. #include "intrins.h"
  3. #define uchar unsigned char//宏定义
  4. #define uint unsigned int//宏定义

  5. sbit RS=P3^4;//定义I/O的硬件接口
  6. sbit E=P3^7;

  7. sbit A_B=P3^2;
  8. sbit CP=P3^3;

  9. sbit Simulation=P1^7;//模拟电压输入

  10. uint temp;


  11. uchar code DispTab_1[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};//1602:0-9 数字
  12. uchar code DispTab_2[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//温度符号
  13. uchar DispBuf[6]; //6字节的显示缓冲区
  14. char char_char_1[]={" www#mdizi#com "};//定义字符串

  15. void delay(uint z)//1ms延时
  16. {
  17. uchar x,x1;
  18. for(;z>0;z--)
  19. {
  20. for(x=0;x<114;x++)
  21. {
  22. for(x1=0;x1<1;x1++);
  23. }
  24. }
  25. }

  26. void delay1()//经精准计算,该段程序1次延时时间为 19.53us;多次调用需要重新计算。
  27. {
  28. _nop_();
  29. _nop_();
  30. _nop_();
  31. }


  32. void write_Directive(uchar a)//写指令
  33. {
  34. uchar i,temp;
  35. for(i=0;i<8;i++)
  36. {
  37. temp=a;
  38. temp&=0x80;
  39. if(temp==0x80)
  40. A_B=1;
  41. else
  42. A_B=0;
  43. a=a<<1;
  44. delay1();
  45. CP=0;
  46. delay1();
  47. CP=1;
  48. delay1();
  49. CP=0;
  50. }

  51. RS=0;
  52. delay(3);
  53. E=0;
  54. delay(3);
  55. E=1;
  56. delay(3);
  57. E=0;
  58. delay(3);
  59. }

  60. void write_Data(uchar a)//写数据
  61. {
  62. uchar i,temp;
  63. for(i=0;i<8;i++)
  64. {
  65. temp=a;
  66. temp&=0x80;
  67. if(temp==0x80)
  68. A_B=1;
  69. else
  70. A_B=0;
  71. a=a<<1;
  72. delay1();
  73. CP=0;
  74. delay1();
  75. CP=1;
  76. delay1();
  77. }

  78. RS=1;
  79. delay(3);
  80. E=0;
  81. delay(3);
  82. E=1;
  83. delay(3);
  84. E=0;
  85. delay(3);

  86. }

  87. void init()//初始化
  88. {
  89. uchar i;
  90. CP=1;
  91. A_B=1;
  92. delay(15);
  93. write_Directive(0x38);
  94. delay(5);
  95. write_Directive(0x38);
  96. delay(5);
  97. write_Directive(0x38);
  98. write_Directive(0x01);
  99. write_Directive(0x02);///初始化后数据地址为0x80;即第一行,第一个位置
  100. write_Directive(0x0c);
  101. write_Directive(0x80+0x40);//第二行第一位地址
  102. for(i=0;i<16;i++)
  103. {
  104. write_Data(char_char_1[ i]);//显示字符串" wwwmdizicom "
  105. }

  106. }

  107. void Temperature_symbol()//温度符号
  108. {
  109. uchar i;
  110. for(i=0;i<8;i++)
  111. {
  112. write_Directive(0x40+i);//写入温度符号
  113. write_Data(DispTab_2[ i]);
  114. }
  115. }

  116. void write_Data_String()//显示时间函数
  117. {
  118. uchar i;
  119. unsigned int mm;
  120. DispBuf[0]=temp/10000;//显示百位
  121. mm=temp%10000;

  122. DispBuf[1]=mm/1000;//显示十位
  123. mm=mm%1000;

  124. DispBuf[2]=mm/100;//显示个位
  125. mm=mm%100;

  126. DispBuf[3]=mm/10;//显示小数点:0.001
  127. DispBuf[4]=mm%10;//显示小数点:0.0001


  128. i=DispBuf[0];
  129. DispBuf[0]=DispTab_1[ i];//查表,取字符
  130. i=DispBuf[1];
  131. DispBuf[1]=DispTab_1[ i];
  132. i=DispBuf[2];
  133. DispBuf[2]=DispTab_1[ i];
  134. i=DispBuf[3];
  135. DispBuf[3]=DispTab_1[ i];
  136. i=DispBuf[4];
  137. DispBuf[4]=DispTab_1[ i];

  138. write_Directive(0x80+0x04);//第一行,第五个位置地址

  139. write_Data(DispBuf[0]);//第一行,第五个位置

  140. write_Data('.');//第一行,第六个位置

  141. write_Data(DispBuf[1]);//第一行,第七个位置
  142. write_Data(DispBuf[2]);//第一行,第八个位置

  143. write_Data(DispBuf[3]);//第一行,第九个位置

  144. write_Data(DispBuf[4]);//第一行,第十个位置

  145. write_Data('V');

  146. }

  147. void I_O_init()
  148. {
  149. P1M1=0x80;
  150. P1M0=0x80;
  151. }


  152. void ADC_Conversion()//ADC开始转
  153. {
  154. ADC_CONTR=0x87;
  155. delay(1);
  156. ADC_CONTR=0x8f;
  157. delay(1);
  158. //while((ADC_CONTR==0x8f));
  159. ADC_CONTR=0x87;
  160. delay(1);
  161. }

  162. void ADC_Calculated()//ADC计算
  163. {

  164. float temp1;
  165. float temp2;
  166. uint temp3;

  167. temp=ADC_DATA;//高8位
  168. temp1=temp;
  169. temp=temp1/256*5*10000;//高8位计算

  170. temp3=ADC_LOW2;//低2位
  171. temp2=temp3;
  172. temp3=temp2/256*5*10000;//低2位计算

  173. temp=temp+temp3;//高8位的计算值+低2位的计算值=实际值


  174. }

  175. void main()
  176. {
  177. init();
  178. I_O_init();//I/O口初始化
  179. Temperature_symbol();//写入温度符号
  180. while(1)
  181. {
  182. ADC_Conversion();//ADC开始转
  183. ADC_Calculated();//ADC计算
  184. write_Data_String();//显示温度
  185. delay(1000);
  186. }
  187. }

复制代码



评分

参与人数 1黑币 +5 收起 理由
荣荣大帅哥 + 5 很给力!

查看全部评分

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

使用道具 举报

沙发
ID:72947 发表于 2015-1-31 20:30 来自手机 | 只看该作者
谢谢楼主分享!!!
回复

使用道具 举报

板凳
ID:81953 发表于 2015-6-4 21:12 | 只看该作者
谢谢楼主的程序,本人最近正在学习STC的单片机,准备做一个电动三轮车的电压表和速度表
回复

使用道具 举报

地板
ID:83507 发表于 2015-6-20 15:58 | 只看该作者
有电路图吗
回复

使用道具 举报

5#
ID:66287 发表于 2015-6-24 09:56 | 只看该作者
一个很规范的C51程序,顶一个!
回复

使用道具 举报

6#
ID:112243 发表于 2016-4-4 22:28 | 只看该作者
请问楼主能给出电路图吗?
回复

使用道具 举报

7#
ID:113418 发表于 2016-4-11 10:15 | 只看该作者
同求电路图
回复

使用道具 举报

8#
ID:163956 发表于 2017-4-15 15:59 | 只看该作者
没电路图等于没用啊
回复

使用道具 举报

9#
ID:102702 发表于 2017-4-15 16:26 | 只看该作者
是的,请楼主附上电路图吧
回复

使用道具 举报

10#
ID:189923 发表于 2017-4-15 18:59 | 只看该作者
谢谢楼主分享!!!
回复

使用道具 举报

11#
ID:189923 发表于 2017-4-15 18:59 | 只看该作者
谢谢楼主分享!!!,请楼主附上电路图吧
回复

使用道具 举报

12#
ID:124995 发表于 2018-1-19 21:35 | 只看该作者

谢谢楼主分享!!!,请楼主附上电路图吧
回复

使用道具 举报

13#
ID:380389 发表于 2018-9-16 18:11 来自手机 | 只看该作者
最大多少伏?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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