📄 shuzi.lst
字号:
C51 COMPILER V8.05a SHUZI 03/11/2008 21:28:39 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE SHUZI
OBJECT MODULE PLACED IN shuzi.OBJ
COMPILER INVOKED BY: c:\Keil\C51\BIN\C51.EXE shuzi.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*
2 ID:bawgijfd
3 作者:剑圣
4 日期:2007/10/16
5 欢迎加入proteus技术仿真小组:
6
7 http://group.ednchina.com/306/
8
9 小组公告
10
11 如果你没有钱买实验板,那就跟着我来吧,保证实现你的梦想,学单片机将是一件轻松好玩的事,出发吧!!!
12
13 prtoeus仿真QQ群:
14
15 29946422
16
17 欢迎你的加入。
18
19 所有的实例都是精挑细选的,本人亲手调试通过,并且附带完整的源程序代码和proteus仿真图。
20
21
22
23 */
24 #include <reg51.H>
25 #include "intrins.h"
26
27
28 #define uint unsigned int
29 #define uchar unsigned char
30
31 //ADC0832的引脚
32 sbit ADCS =P2^0; //ADC0832 chip seclect
33 sbit ADDI =P3^7; //ADC0832 k in
34 sbit ADDO =P3^7; //ADC0832 k out
35 sbit ADCLK =P3^6; //ADC0832 clock signal
36
37 unsigned char dispbitcode[8]={0xf7,0xfb,0xfd,0xfe,0xef,0xdf,0xbf,0x7f}; //位扫描
38 unsigned char dispcode[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff}; //共阳数码管字段码
39 unsigned char dispbuf[4];
40 uint temp;
41 uchar getdata; //获取ADC转换回来的值
42
43
44 void delay_1ms(void) //12mhz delay 1.01ms
45 {
46 1 unsigned char x,y;
47 1 x=3;
48 1 while(x--)
49 1 {
50 2 y=40;
51 2 while(y--);
52 2 }
53 1 }
54 void display(void) //数码管显示函数
55 {
C51 COMPILER V8.05a SHUZI 03/11/2008 21:28:39 PAGE 2
56 1 char k;
57 1 for(k=0;k<4;k++)
58 1 {
59 2
60 2 P1 = dispbitcode[k];
61 2 P0 = dispcode[dispbuf[k]];
62 2 if(k==1) //加上数码管的dp小数点
63 2 P0&=0x7f;
64 2 delay_1ms();
65 2 }
66 1 }
67
68 /************
69 读ADC0832函数
70 ************/
71
72 //采集并返回
73 unsigned int Adc0832(unsigned char channel) //AD转换,返回结果
74 {
75 1 uchar i=0;
76 1 uchar j;
77 1 uint dat=0;
78 1 uchar ndat=0;
79 1
80 1 if(channel==0)channel=2;
81 1 if(channel==1)channel=3;
82 1 ADDI=1;
83 1 _nop_();
84 1 _nop_();
85 1 ADCS=0;//拉低CS端
86 1 _nop_();
87 1 _nop_();
88 1 ADCLK=1;//拉高CLK端
89 1 _nop_();
90 1 _nop_();
91 1 ADCLK=0;//拉低CLK端,形成下降沿1
92 1 _nop_();
93 1 _nop_();
94 1 ADCLK=1;//拉高CLK端
95 1 ADDI=channel&0x1;
96 1 _nop_();
97 1 _nop_();
98 1 ADCLK=0;//拉低CLK端,形成下降沿2
99 1 _nop_();
100 1 _nop_();
101 1 ADCLK=1;//拉高CLK端
102 1 ADDI=(channel>>1)&0x1;
103 1 _nop_();
104 1 _nop_();
105 1 ADCLK=0;//拉低CLK端,形成下降沿3
106 1 ADDI=1;//控制命令结束
107 1 _nop_();
108 1 _nop_();
109 1 dat=0;
110 1 for(i=0;i<8;i++)
111 1 {
112 2 dat|=ADDO;//收数据
113 2 ADCLK=1;
114 2 _nop_();
115 2 _nop_();
116 2 ADCLK=0;//形成一次时钟脉冲
117 2 _nop_();
C51 COMPILER V8.05a SHUZI 03/11/2008 21:28:39 PAGE 3
118 2 _nop_();
119 2 dat<<=1;
120 2 if(i==7)dat|=ADDO;
121 2 }
122 1 for(i=0;i<8;i++)
123 1 {
124 2 j=0;
125 2 j=j|ADDO;//收数据
126 2 ADCLK=1;
127 2 _nop_();
128 2 _nop_();
129 2 ADCLK=0;//形成一次时钟脉冲
130 2 _nop_();
131 2 _nop_();
132 2 j=j<<7;
133 2 ndat=ndat|j;
134 2 if(i<7)ndat>>=1;
135 2 }
136 1 ADCS=1;//拉低CS端
137 1 ADCLK=0;//拉低CLK端
138 1 ADDO=1;//拉高数据端,回到初始状态
139 1 dat<<=8;
140 1 dat|=ndat;
141 1 return(dat); //return ad k
142 1 }
143
144
145 void main(void)
146 {
147 1 while(1)
148 1 { unsigned int temp;
149 2 float press;
150 2 getdata=Adc0832(0);
151 2 if(14<getdata<243) //当压力值介于15kpa到115kpa之间时,遵循线性变换
152 2 {
153 3 int vary=getdata; //y=(115-15)/(243-13)*X+15kpa
154 3 press=((10.0/23.0)*vary)+9.3; //测试时补偿值为10
155 3
156 3 temp=(int)(press*10); //放大10倍,便于后面的计算
157 3
158 3
159 3 dispbuf[3]=temp/1000; //取压力值百位
160 3 dispbuf[2]=(temp%1000)/100; //取压力值十位
161 3 dispbuf[1]=((temp%1000)%100)/10; //取压力值个位
162 3 dispbuf[0]=((temp%1000)%100)%10; //取压力值十分位
163 3 display();
164 3 }
165 2
166 2 }
167 1 }
168
169
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 384 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 26 8
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
C51 COMPILER V8.05a SHUZI 03/11/2008 21:28:39 PAGE 4
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -