?? 0831.lst
字號(hào):
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測(cè)電壓;并用數(shù)碼管顯示電壓的數(shù)值***/
2 /****注意:測(cè)量的電壓范圍:0-5V********************/
3 #include <reg51.h>
4 #include <intrins.h>
5
6 sbit CLK=P1^3; //CLK--7腳 //時(shí)鐘I/O端口
7 sbit DO=P1^4; //DO---6腳 //數(shù)據(jù)I.O端口
8 sbit CS=P1^6; //CS---1腳 //片選I/O端口
9 sbit RST = P1^5;// DS1302片選,因這兩芯片采用同一數(shù)據(jù)腳(SDA,SCL),所以我們要定義它,將DS1302片選關(guān)掉,否
-則發(fā)生沖突
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};//共陰數(shù)碼管顯示數(shù)的組成是 "0-9""0-9有小數(shù)點(diǎn)的"
-"-" "U" "空 表"
13
14 unsigned char l_tmpdate[]={0,0,0,0}; //定義數(shù)組變量
15 void delay(); //延時(shí)子函數(shù),5個(gè)空指令
16 void display(unsigned char *lp,unsigned char lc);//數(shù)字的顯示函數(shù);lp為指向數(shù)組的地址,lc為顯示的個(gè)數(shù)
17 unsigned char ad0831read(void); //定義該函數(shù)為讀取ADC0831的數(shù)據(jù)
18
19 void main(void) //主函數(shù);
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) //這里為循環(huán)255個(gè)周期讀取一次0831,因CPU運(yùn)行比較快,沒(méi)必要每次循環(huán)都去讀取
27 2 {
28 3 tmp=ad0831read()*100; //這里乘上100的意思是保留兩位小數(shù)
29 3 tmp=tmp/51; //這里為什么除以51呢,分析如下:模數(shù)轉(zhuǎn)換IC是8位ADC,轉(zhuǎn)換回來(lái)的數(shù)值是0-255
30 3 //0V時(shí)是0,5V時(shí)是255,他相應(yīng)的倍數(shù)就是255/5=51,因此,我們的將轉(zhuǎn)換回來(lái)的
31 3 //數(shù)除以51,就得到相應(yīng)的電壓值了,
32 3 i=0;
33 3 l_tmpdate[0]=tmp/100; //得到百位,其實(shí)是個(gè)位,因?yàn)槲覀儎偛懦松?00了
34 3 l_tmpdate[0]+=10; //這里是加上小數(shù)點(diǎn),帶小數(shù)點(diǎn)的數(shù)在表中是后10位
35 3 tmp=tmp%100;
36 3 l_tmpdate[1]=tmp/10; //十位 即小數(shù)點(diǎn)后第一位
37 3 l_tmpdate[2]=tmp%10; //個(gè)位 //即小數(shù)點(diǎn)后第二位
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,對(duì)應(yīng)138譯門輸入腳,全0為第一位數(shù)碼管
48 1 for(i=0;i<lc;i++){ //循環(huán)顯示
49 2 P2=table[lp[i]]; //查表法得到要顯示數(shù)字的數(shù)碼段
50 2 delay(); //延時(shí)5個(gè)空指令
51 2 if(i==7) //檢測(cè)顯示完8位否,完成直接退出,不讓P1口再加1,否則進(jìn)位影響到第四位數(shù)據(jù)
52 2 break;
53 2 P2=0; //清0端口,準(zhǔn)備顯示下位
C51 COMPILER V8.05a 0831 04/09/2009 19:29:20 PAGE 2
54 2 P1++; //下一位數(shù)碼管
55 2 }
56 1 }
57 void delay(void) //空5個(gè)指令
58 {
59 1 _nop_();_nop_();_nop_();_nop_();_nop_();
60 1 }
61
62 unsigned char ad0831read(void)//請(qǐng)先了解ADC0831模數(shù)轉(zhuǎn)換器的串口協(xié)議,再來(lái)讀本函數(shù),主要是對(duì)應(yīng)時(shí)序圖來(lái)理解
63 { //本函數(shù)是模擬0831的串口協(xié)議進(jìn)行的,當(dāng)你了解用軟件去模擬一個(gè)端口的協(xié)議
64 1 //以后,對(duì)于一個(gè)硬件這樣的端口就簡(jiǎn)單多了
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)
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -