📄 ad_cy.lst
字号:
C51 COMPILER V7.06 AD_CY 02/20/2009 10:36:17 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE AD_CY
OBJECT MODULE PLACED IN AD_CY.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE AD_CY.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1
2 /* --- AD采样程序------------------------------------------------------------ */
3 /* --- 史继前 设计 2009.02.20 V1.2 ------------------------------------------ */
4 /* --- 程序代码版本:V1.2 -------------------------------------------------- */
5 /* --- 演示 在AD采样电流值的精确性------------------------------------------- */
6 /* --- Mobile: 15999617642 -------------------------------------------------- */
7 /* --- 文档说明请查阅测试文档V1.2-------------------------------------------- */
8 #include<reg52.h>
9 #define RELOAD 0xf3 //此为串口1,串口波特率重装数值。晶振:24M,12T模式,SMOD=0,
10 //串口波特率基准采用4800bps.
11 void AD_Iint(void); //AD初始化
12 void AD_Interrupt(void); //AD中断服务程序
13 void Serial_Port_Initial(void); //串口初始化原型
14 void Send_UART(uint8); //发送数据原型
15 void UART_Interrupt_Receive(void); //中断接收
16 void Timer0_Init(void); //定时器0初始化,定时1MS
17 void Timer0_Interrupt(void); //定时器中断服务程序
18 bit UTL_DelayTime(uint16 ); //延时程序
19 uint8 Read_Data(uint16); //从EEPROM中读数据
20 void Write_Data(uint8,uint16); //向EEPROM中写数据
21 void Erase_Data(uint16); //将EEPROM中的数据擦除
22 void IAP_Disable(void); //关闭 IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态
23 void Delays(void); //软件延时程序
24 void Display_LED(void); //测试灯闪烁
25
26 uint32 idata AD_Data; //AD结果变量
27 uint8 idata k=0; //AD采样次数计录
28 uint32 idata AD_Data1=0; //AD结果变量1
29 uint32 idata AD_Data2=0; //AD结果
30 uint32 idata __dwTemp; //此为时间计数变量
31 uint16 idata __wTemp; //此为时间计数变量
32 uint16 idata Data=0; //AD结果变量
33 uint32 data __dwCountSystem=0; //定时计数值
34
35 uint8 IAP_BYTE_READ =1; //字节读
36 uint8 IAP_BYTE_PROGRAM =2; //字节编程,可以将1 写成0,要将1 变成0,必须执行字节编程
37 uint8 IAP_SECTOR_ERASE =3; //扇区擦除,可以将0 擦成1,要将0 变成1,必须擦除整个扇区
38 uint8 ENABLE_IAP =0x80; //系统工作时钟<30MHz 时,对IAP_CONTR 寄存器设置此值
39
40 main()
41 {
42 1 AUXR |=0xC0; //d=1,定时方式的分频系数改变,采用1T模式
43 1 Delays(); //延时一小断时间有利于串口的初始化
44 1 Display_LED(); //程序开始执行一小段的闪烁程序
45 1 Serial_Port_Initial(); //串口初始化
46 1
47 1 Timer0_Init(); //定时器0初始化,定时1MS
48 1 Erase_Data(0x3200); //擦除扇区
49 1 Write_Data(0x00,0x3200); //写数据
50 1 Data=Read_Data(0x3200); //读取数据
51 1 IAP_Disable(); //关闭IAP功能
52 1 AD_Iint(); //AD初始化
53 1
54 1 while(1)
55 1 {
C51 COMPILER V7.06 AD_CY 02/20/2009 10:36:17 PAGE 2
56 2
57 2 Send_UART((uint8)(AD_Data2>>8)); //发送AD数据,分两次发送
58 2 Send_UART((uint8)(AD_Data2));
59 2 Erase_Data(0x2600); //擦除扇区
60 2 Write_Data((uint8)(AD_Data2>>8),0x2600); //写数据
61 2 Erase_Data(0x2800); //擦除扇区
62 2 Write_Data((uint8)(AD_Data2),0x2800); //写数据
63 2 UTL_DelayTime(10);
64 2 }
65 1
66 1 }
67 void Display_LED(void)//LED灯闪烁
68 {
69 1 unsigned char i=0;
70 1 for(i=0;i<5;i++)
71 1 {
72 2 P4_0=1;
73 2 Delays();
74 2 P4_0=0;
75 2 Delays();
76 2 }
77 1 }
78 /******************************************************************************
79 函数:AD_Iint()
80 功能:AD初始化
81 说明:设置相应的AD参数,并且打开AD中断,可用中断方式,亦可用查询方式
82 ******************************************************************************/
83
84 void AD_Iint(void)
85 {
86 1 P1ASF = 0xFF; //设置P1的所有I/0口都为AD输入口
87 1 //A/D转换控制寄存器 ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0
88 1 ADC_CONTR = 0xE7; // 1 1 1 0 0 1 1 1
89 1 UTL_DelayTime(1); //ADC_POWER =1.开ADC 电源, 第一次使用时要打开内部模拟电源
90 1 // 可适当加延时,1mS 以内就足够了
91 1 AUXR1= 0x04; // ADRJ=AUXR^4 设为1, 10 位A/D 转换结果的高2 位存放在ADC_RES 中低2位,
92 1 // 低8位存放在ADC_RESL 中
93 1 ADC_CONTR = 0xEF; //开始AD转换
94 1 EADC = 1; // 允许ADC中断
95 1 EA = 1; // 打开总中断
96 1
97 1 }
98 /******************************************************************************
99 函数:AD_Interrupt()
100 功能:AD中断,对AD结果进行分析
101 说明:AD中断,可用中断方式,亦可用查询方式 ,此采用中断方式
102 ******************************************************************************/
103
104 void AD_Interrupt(void) interrupt 5
105 {
106 1 k++;
107 1 ADC_CONTR = 0xE7; //AD关闭
108 1 EADC = 0; //禁止AD中断
109 1 //UTL_DelayTime(1);
110 1 Data = ADC_RES*256+ADC_RESL; //AD采样出来的数值
111 1 AD_Data = Data; //存入数据
112 1 AD_Data1 = AD_Data1+AD_Data; //相加采样值
113 1 //AD_Data = (AD_Data*5000)>>10;
114 1 if(k==64) //采样64次之后进行平均求值
115 1 {
116 2 k=0;
117 2 AD_Data2 = (AD_Data1*4893)>>16; //根据参考电压得到最终的数据
C51 COMPILER V7.06 AD_CY 02/20/2009 10:36:17 PAGE 3
118 2 AD_Data1=0;
119 2 }
120 1 ADC_CONTR = 0xEF; //重新开始AD转换
121 1 EADC = 1;
122 1 }
123 /******************************************************************************
124 函数:Delays()
125 功能:软件延时
126 说明:本函数采用软件延时一定的时间
127 ******************************************************************************/
128
129 void Delays(void)//延时
130 {
131 1 unsigned short j=0;
132 1 unsigned short g=0;
133 1 for(j=0;j<100;j++)
134 1 {
135 2 for(g=0;g<5000;g++)
136 2 {
137 3 ;
138 3 }
139 2 }
140 1 }
141 /******************************************************************************
142 函数:Read_Data()
143 功能:从EEPROM中读数据
144 说明:设置相应的IAP参数,最后连续送5A和A5到IAP_TRIG中开启IAP.读取数据,返回
145 ******************************************************************************/
146
147 uint8 Read_Data(uint16 Flash_Address) //从EEPROM中读数据
148 {
149 1 uint8 Dat=0;
150 1 IAP_CONTR =ENABLE_IAP ; //打开 IAP 功能, 设置 Flash 操作等待时间
151 1 IAP_CMD =IAP_BYTE_READ ;//设置为IAP/ISP/EEPROM 字节读模式命令
152 1 IAP_ADDRH =(uint8)(Flash_Address>>8); //设置目标单元地址的高8 位地址
153 1 IAP_ADDRL =(uint8)Flash_Address; //设置目标单元地址的低8 位地址
154 1 EA=0;
155 1 IAP_TRIG =0x5A ; //先送5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
156 1 IAP_TRIG =0xA5 ; //送完A5h 后,ISP/IAP 命令立即被触发起动
157 1 EA=1;
158 1 ;
159 1 Dat=IAP_DATA ; //读出的数据在IAP_DATA 单元中,送入累加器A
160 1 return(Dat);
161 1 }
162 /******************************************************************************
163 函数:Write_Data()
164 功能:向EEPROM中写数据
165 说明:设置相应的IAP参数,最后连续送5A和A5到IAP_TRIG中开启IAP,自动进行写数据操作.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -