📄 ad.lst
字号:
C51 COMPILER V7.07 AD 11/26/2007 19:54:09 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE AD
OBJECT MODULE PLACED IN AD.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE AD.c BROWSE DEBUG OBJECTEXTEND TABS(8)
stmt level source
1 #include "reg51.h"
2 #include"intrins.h"
3 sbit data595=P0^2; /*74hc595的数据输入脚*/
4 sbit clk595=P0^0; /*74hc595的时钟输入脚*/
5 sbit str595=P0^1; /*74hc595的时钟状态脚*/
6 sbit Q0=P0^4; /*数码管片选脚Q0*/
7 sbit Q1=P0^5; /*数码管片选脚Q1*/
8 sbit Q2=P0^6; /*数码管片选脚Q2*/
9 sbit Q3=P0^7; /*数码管片选脚Q3*/
10 sbit cs=P2^0; /*ADC0832片选脚*/
11 sbit clk=P2^1; /*ADC0832时钟输入脚*/
12 sbit data_o=P2^2; /*ADC0832数据输入脚*/
13 #define uchar unsigned char
14 #define uint unsigned int
15 #define nop _nop_() /*定义空操作指令*/
16 #define XMS 5500 /*定时中断间隔11.0592MHz*/
-
17 uchar disppoint,tx_dat;
18 uint buf[]={0,0,0,0};
19 uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; /*显示段表0~9*/
20 void senddata(uchar date_) /*发送数据*/
21 {
22 1 uchar m,i;
23 1 str595=0;
24 1 for(i=0;i<8;i++)
25 1 {
26 2 clk595=0;
27 2 m=date_;
28 2 m&=0x80; /*保留M的最高位*/
29 2 data595=(bit)m; /*在每个clk周期,同时送出1bit串行数据*/
30 2 date_<<=1; /*将date_向左移动一位*/
31 2 clk595=1; /*0-->1,clk为上升沿*/
32 2 }
33 1 str595=1; /*数据送完,锁存到输出端进行显示*/
34 1 str595=0;
35 1 }
36 void timer0(void) interrupt 1 using 0 /*定时器显示中断程序*/
37 {
38 1 EA=0; /*关中断*/
39 1 TH0=-(XMS/256); /*定时器赋值*/
40 1 TL0=-(XMS%256);
41 1 disppoint&=3; /*显示位赋值*/
42 1 if(disppoint==2){tx_dat=seg[buf[disppoint]];tx_dat&=~0x80;senddata(tx_dat);}/*第三个数码显示小数点
-*/
43 1 else senddata(seg[buf[disppoint]]);
44 1 switch(disppoint) /*显示片选处理*/
45 1 {
46 2 case 2:Q3=0;Q2=1;Q1=1;Q0=1;break;
47 2 case 3:Q2=0;Q3=1;Q1=1;Q0=1;break;
48 2 case 0:Q1=0;Q3=1;Q2=1;Q0=1;break;
49 2 case 1:Q0=0;Q3=1;Q2=1;Q1=1;break;
50 2 }
51 1 disppoint++;
52 1 EA=1; /*开中断*/
53 1 }
C51 COMPILER V7.07 AD 11/26/2007 19:54:09 PAGE 2
54 /***********************************************************/
55 void BCD(uchar ad_)
56 {
57 1 uint temp;
58 1 uchar i;
59 1 temp=(uint)(((unsigned long)((unsigned long)ad_*500))/256); /*将AD结果转换成BCD码*/
60 1 for(i=0;i<3;i++)
61 1 {
62 2 buf[i]=temp%10;
63 2 temp=temp/10;
64 2 }
65 1 }
66 /**************************************************************/
67 uchar read_adc(void) /*读取AD值*/
68 {
69 1 uchar i,ch=0;
70 1 cs=0;
71 1 clk=1;
72 1 nop;
73 1 nop;
74 1 clk=0;
75 1 nop;
76 1 nop;
77 1 for(;data_o==1;) /*等待AD转换结束*/
78 1 {
79 2 clk=1;
80 2 nop;
81 2 nop;
82 2 clk=0;
83 2 nop;
84 2 nop;
85 2 }
86 1 for(i=0; i<8; i++)
87 1 {
88 2 clk=1;
89 2 nop;
90 2 nop;
91 2 clk=0;
92 2 nop;
93 2 nop;
94 2 ch=(ch<<1)|data_o; /*读取串行数据*/
95 2 }
96 1 cs=1;
97 1 return(ch);
98 1 }
99 /***********************************************************************/
100
101 void main(void)
102 {
103 1 uint ad=0;
104 1 uchar j,tmp;
105 1 uchar ad_temp[10]={0};
106 1 P0=0xff; /*P0初始化*/
107 1 TMOD=0x01; /*定时器工作方式*/
108 1 TH0=-(XMS/256); /*定时器赋值*/
109 1 TL0=-(XMS%256);
110 1 TR0=1; /*允许T0工作*/
111 1 ET0=1; /*允许T0中断*/
112 1 EA=1; /*允许全局中断*/
113 1 while(1)
114 1 {
115 2 while(tmp!=read_adc())
C51 COMPILER V7.07 AD 11/26/2007 19:54:09 PAGE 3
116 2 {
117 3 tmp=read_adc();
118 3 for(j=0;j<10;j++)ad_temp[j]=read_adc(); /*读取10次AD值*/
119 3 for(j=0;j<10;j++)ad=ad+ad_temp[j]; /*AD值累加*/
120 3 tmp=(uchar)(ad/10); /*计算平均值*/
121 3 BCD(tmp); /*BCD转换*/
122 3 ad=0;
123 3 }
124 2 }
125 1 }
126
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 383 ----
CONSTANT SIZE = 20 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 10 13
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 + -