📄 0831.lst
字号:
C51 COMPILER V8.05a 0831 04/09/2009 19:29:20 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE 0831
OBJECT MODULE PLACED IN 0831.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 0831.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /****使用ADC0831测电压;并用数码管显示电压的数值***/
2 /****注意:测量的电压范围:0-5V********************/
3 #include <reg51.h>
4 #include <intrins.h>
5
6 sbit CLK=P1^3; //CLK--7脚 //时钟I/O端口
7 sbit DO=P1^4; //DO---6脚 //数据I.O端口
8 sbit CS=P1^6; //CS---1脚 //片选I/O端口
9 sbit RST = P1^5;// DS1302片选,因这两芯片采用同一数据脚(SDA,SCL),所以我们要定义它,将DS1302片选关掉,否
-则发生冲突
10
11 code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,
12 0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x40,0x3e,0x00};//共阴数码管显示数的组成是 "0-9""0-9有小数点的"
-"-" "U" "空 表"
13
14 unsigned char l_tmpdate[]={0,0,0,0}; //定义数组变量
15 void delay(); //延时子函数,5个空指令
16 void display(unsigned char *lp,unsigned char lc);//数字的显示函数;lp为指向数组的地址,lc为显示的个数
17 unsigned char ad0831read(void); //定义该函数为读取ADC0831的数据
18
19 void main(void) //主函数;
20 {
21 1 unsigned int i=254,tmp;
22 1 RST=0;
23 1 while(1)
24 1 {
25 2 i++;
26 2 if(i==255) //这里为循环255个周期读取一次0831,因CPU运行比较快,没必要每次循环都去读取
27 2 {
28 3 tmp=ad0831read()*100; //这里乘上100的意思是保留两位小数
29 3 tmp=tmp/51; //这里为什么除以51呢,分析如下:模数转换IC是8位ADC,转换回来的数值是0-255
30 3 //0V时是0,5V时是255,他相应的倍数就是255/5=51,因此,我们的将转换回来的
31 3 //数除以51,就得到相应的电压值了,
32 3 i=0;
33 3 l_tmpdate[0]=tmp/100; //得到百位,其实是个位,因为我们刚才乘上100了
34 3 l_tmpdate[0]+=10; //这里是加上小数点,带小数点的数在表中是后10位
35 3 tmp=tmp%100;
36 3 l_tmpdate[1]=tmp/10; //十位 即小数点后第一位
37 3 l_tmpdate[2]=tmp%10; //个位 //即小数点后第二位
38 3 l_tmpdate[3]=21; //加上单位U,伏
39 3 }
40 2 display(l_tmpdate,4); //输出显示
41 2 }
42 1 }
43 void display(unsigned char *lp,unsigned char lc)//显示
44 {
45 1 unsigned char i; //定义变量
46 1 P2=0; //端口2为输出
47 1 P1=P1&0xF8; //将P1口的前3位输出0,对应138译门输入脚,全0为第一位数码管
48 1 for(i=0;i<lc;i++){ //循环显示
49 2 P2=table[lp[i]]; //查表法得到要显示数字的数码段
50 2 delay(); //延时5个空指令
51 2 if(i==7) //检测显示完8位否,完成直接退出,不让P1口再加1,否则进位影响到第四位数据
52 2 break;
53 2 P2=0; //清0端口,准备显示下位
C51 COMPILER V8.05a 0831 04/09/2009 19:29:20 PAGE 2
54 2 P1++; //下一位数码管
55 2 }
56 1 }
57 void delay(void) //空5个指令
58 {
59 1 _nop_();_nop_();_nop_();_nop_();_nop_();
60 1 }
61
62 unsigned char ad0831read(void)//请先了解ADC0831模数转换器的串口协议,再来读本函数,主要是对应时序图来理解
63 { //本函数是模拟0831的串口协议进行的,当你了解用软件去模拟一个端口的协议
64 1 //以后,对于一个硬件这样的端口就简单多了
65 1 unsigned char i=0,tmp=0;
66 1 DO=1;
67 1 CS=0;
68 1 _nop_();
69 1 _nop_();
70 1 CLK=0;
71 1 _nop_();
72 1 _nop_();
73 1 CLK=1;
74 1 _nop_();
75 1 _nop_();
76 1 CLK=0;
77 1 _nop_();
78 1 _nop_();
79 1 CLK=1;
80 1 _nop_();
81 1 _nop_();
82 1 CLK=0;
83 1 _nop_();
84 1 _nop_();
85 1 for(i=0;i<8;i++)
86 1 {
87 2 tmp<<=1;
88 2 if(DO) //使DO端输出加入temp中
89 2 tmp++;
90 2 CLK=1;
91 2 _nop_();
92 2 _nop_();
93 2 CLK=0;
94 2 _nop_();
95 2 _nop_();
96 2 }
97 1 CS=1;
98 1 return tmp;
99 1 }
100
101
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 244 ----
CONSTANT SIZE = 23 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 7
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -