📄 51
字号:
C51 COMPILER V8.18 超蒧波显示 01/07/2010 23:31:15 PAGE 1
C51 COMPILER V8.18, COMPILATION OF MODULE 超蒧波显示
OBJECT MODULE PLACED IN 超声波显示.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 超声波显示.C BROWSE DEBUG OBJECTEXTEND
line level source
1 //超声波模块显示程序
2 #include <reg52.h> //包括一个52标准内核的头文件
3 #include<intrins.h> //包含_nop_()函数定义的头文件
4 #define uchar unsigned char //定义一下方便使用
5 #define uint unsigned int
6 #define ulong unsigned long
7 sbit Tx = P3^3; //产生脉冲引脚
8 sbit Rx = P3^2; //回波引脚
9 sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚
10 sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚
11 sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚
12 sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚
13 unsigned char code string[ ]= {"CHAO SHENG BO"};
14 //unsigned char code string1[ ]={"QUICK STUDY MCU"};
15 unsigned char code digit[ ]={"0123456789"}; //定义字符数组显示数字
16 //uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管0-9
17 uint distance[4]; //测距接收缓冲区
18 uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,i; //自定义寄存器
19 bit succeed_flag; //测量成功标志
20 //********函数声明
21 void conversion(uint temp_data);
22 void delay_20us();
23 void pai_xu();
24
25
26 /*****************************************************
27 函数功能:延时1ms
28 (3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
29 ***************************************************/
30 void delay1ms()
31 {
32 1 unsigned char i,j;
33 1 for(i=0;i<10;i++)
34 1 for(j=0;j<33;j++)
35 1 ;
36 1 }
37 /*****************************************************
38 函数功能:延时若干毫秒
39 入口参数:n
40 ***************************************************/
41 void delay(unsigned char n)
42 {
43 1 unsigned char i;
44 1 for(i=0;i<n;i++)
45 1 delay1ms();
46 1 }
47 /*****************************************************
48 函数功能:判断液晶模块的忙碌状态
49 返回值:result。result=1,忙碌;result=0,不忙
50 ***************************************************/
51 unsigned char BusyTest(void)
52 {
53 1 bit result;
54 1 RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态
55 1 RW=1;
C51 COMPILER V8.18 超蒧波显示 01/07/2010 23:31:15 PAGE 2
56 1 E=1; //E=1,才允许读写
57 1 _nop_(); //空操作
58 1 _nop_();
59 1 _nop_();
60 1 _nop_(); //空操作四个机器周期,给硬件反应时间
61 1 result=BF; //将忙碌标志电平赋给result
62 1 E=0; //将E恢复低电平
63 1 return result;
64 1 }
65 /*****************************************************
66 函数功能:将模式设置指令或显示地址写入液晶模块
67 入口参数:dictate
68 ***************************************************/
69 void WriteInstruction (unsigned char dictate)
70 {
71 1 while(BusyTest()==1); //如果忙就等待
72 1 RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令
73 1 RW=0;
74 1 E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
75 1 // 就是让E从0到1发生正跳变,所以应先置"0"
76 1 _nop_();
77 1 _nop_(); //空操作两个机器周期,给硬件反应时间
78 1 P0=dictate; //将数据送入P0口,即写入指令或地址
79 1 _nop_();
80 1 _nop_();
81 1 _nop_();
82 1 _nop_(); //空操作四个机器周期,给硬件反应时间
83 1 E=1; //E置高电平
84 1 _nop_();
85 1 _nop_();
86 1 _nop_();
87 1 _nop_(); //空操作四个机器周期,给硬件反应时间
88 1 E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
89 1 }
90 /*****************************************************
91 函数功能:指定字符显示的实际地址
92 入口参数:x
93 ***************************************************/
94 void WriteAddress(unsigned char x)
95 {
96 1 WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"
97 1 }
98 /*****************************************************
99 函数功能:将数据(字符的标准ASCII码)写入液晶模块
100 入口参数:y(为字符常量)
101 ***************************************************/
102 void WriteData(unsigned char y)
103 {
104 1 while(BusyTest()==1);
105 1 RS=1; //RS为高电平,RW为低电平时,可以写入数据
106 1 RW=0;
107 1 E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
108 1 // 就是让E从0到1发生正跳变,所以应先置"0"
109 1 P0=y; //将数据送入P0口,即将数据写入液晶模块
110 1 _nop_();
111 1 _nop_();
112 1 _nop_();
113 1 _nop_(); //空操作四个机器周期,给硬件反应时间
114 1 E=1; //E置高电平
115 1 _nop_();
116 1 _nop_();
117 1 _nop_();
C51 COMPILER V8.18 超蒧波显示 01/07/2010 23:31:15 PAGE 3
118 1 _nop_(); //空操作四个机器周期,给硬件反应时间
119 1 E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
120 1 }
121 /*****************************************************
122 函数功能:对LCD的显示模式进行初始化设置
123 ***************************************************/
124 void LcdInitiate(void)
125 {
126 1 delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间
127 1 WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口
128 1 delay(5); //延时5ms ,给硬件一点反应时间
129 1 WriteInstruction(0x38);
130 1 delay(5);
131 1 WriteInstruction(0x38); //连续三次,确保初始化成功
132 1 delay(5);
133 1 WriteInstruction(0x0c); //显示模式设置:显示开,无光标,光标不闪烁
134 1 delay(5);
135 1 WriteInstruction(0x06); //显示模式设置:光标右移,字符不移
136 1 delay(5);
137 1 WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清除
138 1 delay(5);
139 1 }
140
141
142
143
144
145
146
147
148
149 void main(void) // 主程序
150 { uint distance_data,a,b;
151 1 uchar CONT_1;
152 1 uchar k; //定义变量i指向字符串数组元素
153 1 LcdInitiate(); //调用LCD初始化函数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -