📄 adc.lst
字号:
0076 2022 TST R2
0077 F7D9 BNE 0x0073
0078 9508 RET
FILE: F:\job\M16学习板\ADC(实验七)\M16ADC.c
(0001) /*******************************************************************
(0002) 实验七
(0003) 实验名称: ADC转换实验
(0004) 实验目的: 学习AVR单片机的ADC功能
(0005) 实验现象: 串口发送命令开启一次ADC,并将结果通过串口发送到PC,任意字符开始
(0006) 环 境: ICCAVR6.31A
(0007) 设 计 者: shinea8868
(0008) 说 明: 部分程序原型源自网络,经本人修改调试可用,请尊重知识产权,如
(0009) 作商业用途请保留本段文字
(0010) 完成日期: 2007年4月10日
(0011) *******************************************************************/
(0012) #include <iom16v.h>
(0013) #include <macros.h>
(0014) #include "..\ICC_H\SOFTWARE.h"
(0015)
(0016) uchar UcAdcData; //ADC转换的结果
(0017) uchar AdcConCom = 0; //ADC转换完成标志
(0018) uchar admuxx = 0x67; //外部参考源,数据存储左对齐方式
(0019) /*--------------------------------------------------------------------
(0020) 功 能: ADC转换初始化设定
(0021) 入口参数:
(0022) 返 回 值:
(0023) --------------------------------------------------------------------*/
(0024) void AdcInit(void)
(0025) {
(0026) ADCSR = 0x00; //ADC无效
_AdcInit:
0079 2422 CLR R2
007A B826 OUT 0x06,R2
(0027) ADMUX = admuxx; //选择ADC通道7
007B 90200061 LDS R2,admuxx
007D B827 OUT 0x07,R2
(0028) /*--REFS1---REFS0---ADLAR---0--------------参考电源选择------对齐方式--------*/
(0029) /*--0000-- 0001-- 0010-- 0011-- 0100-- 0101-- 0110-- 0111-- 1110--- --1111---*/
(0030) /*--通道0--通道1--通道2--通道3--通道4--通道5--通道6-通道7--1.23V(VBG)-0V(GND)*/
(0031) ACSR = 0x80; //模拟比较器控制和状态寄存器 ACSR
007E E880 LDI R24,0x80
007F B988 OUT 0x08,R24
(0032) //ACD置1,使模拟比较器禁用
(0033) /*--ACD--ACBG--ACO--ACI---ACIE---ACIC---ACIS1---ACIS0------------------------*/
(0034) /*-模拟比较起禁用--模拟比较器的能隙基准源--模拟比较起输出--模拟比较器中断标志*/
(0035) /*-模拟比较器中断使能--模拟比较器输入捕捉使能--模拟比较器中断模式选择--------*/
(0036) ADCSR = 0x8B;//模拟比较起控制和状态寄存器
0080 E88B LDI R24,0x8B
0081 B986 OUT 0x06,R24
0082 9508 RET
_adc_isr:
0083 922A ST R2,-Y
0084 938A ST R24,-Y
0085 B62F IN R2,0x3F
0086 922A ST R2,-Y
(0037) /*-----------ADEN---ADSC---ADFR---ADIF---ADIE---ADPS2---ADPS1---ADPS0--------*/
(0038) //使能模数转换 ADC开始转换 ADC连续转换 ADC中断使能 128分频
(0039) }
(0040) /*-----------------------ADC转换中断程序--------------------------------------*/
(0041) #pragma interrupt_handler adc_isr:15
(0042) void adc_isr(void)
(0043) {
(0044) UcAdcData = ADCH; //读ADC转换结果
0087 B025 IN R2,0x05
0088 92200062 STS UcAdcData,R2
(0045) AdcConCom = 1; //置ADC转换完成标志
008A E081 LDI R24,1
008B 93800060 STS AdcConCom,R24
008D 9029 LD R2,Y+
008E BE2F OUT 0x3F,R2
008F 9189 LD R24,Y+
0090 9029 LD R2,Y+
0091 9518 RETI
(0046) }
(0047)
(0048) /*-----------------------------------------------------------------
(0049) 函数名称: void Uart0Init(void)
(0050) 函数功能: 串口初始化
(0051) 波特率 9600 0.2% 字符长度 8bit 无奇偶校验
(0052) 参 数:
(0053) 返 回 值: 无
(0054) -----------------------------------------------------------------*/
(0055) void Uart0Init(void)
(0056) {
(0057) UCSRB = 0x00; //关串口
_Uart0Init:
0092 2422 CLR R2
0093 B82A OUT 0x0A,R2
(0058) UCSRA = 0x02; //倍速模式 M16中文P151
0094 E082 LDI R24,2
0095 B98B OUT 0x0B,R24
(0059) UCSRC = BIT(URSEL) | 0x06; //写UCSRC寄存器,设定8个bit
0096 E886 LDI R24,0x86
0097 BD80 OUT 0x20,R24
(0060) UBRR = 0x000c; //设定串口波特率为9600
0098 E08C LDI R24,0xC
0099 B989 OUT 0x09,R24
(0061) UCSRB = 0x98; //开串口
009A E988 LDI R24,0x98
009B B98A OUT 0x0A,R24
009C 9508 RET
_UartRecvData:
temp --> R16
009D 930A ST R16,-Y
009E 938A ST R24,-Y
009F B70F IN R16,0x3F
00A0 930A ST R16,-Y
(0062) }
(0063) /*-----------------------------------------------------------------
(0064) 函数名称: void Uart0Init(void)
(0065) 函数功能: 串口初始化
(0066) 波特率 9600 0.2% 字符长度 8bit 无奇偶校验
(0067) 参 数:
(0068) 返 回 值: 无
(0069) -----------------------------------------------------------------*/
(0070) #pragma interrupt_handler UartRecvData:12
(0071) void UartRecvData(void)
(0072) {
(0073) uchar temp;
(0074) temp = UDR;
00A1 B10C IN R16,0x0C
(0075) ADMUX |= 0x07;
00A2 B187 IN R24,0x07
00A3 6087 ORI R24,7
00A4 B987 OUT 0x07,R24
(0076) ADCSR |= 0x40; //开启一次ADC转换
00A5 9A36 SBI 0x06,6
00A6 9109 LD R16,Y+
00A7 BF0F OUT 0x3F,R16
00A8 9189 LD R24,Y+
00A9 9109 LD R16,Y+
00AA 9518 RETI
(0077) }
(0078) /*-----------------------------------------------------------------
(0079) 函数名称: void UartTransmitData(void)
(0080) 函数功能: 发送字符串
(0081) 参 数:
(0082) 返 回 值: 无
(0083) -----------------------------------------------------------------*/
(0084) void UartTransmitData(void)
(0085) {
(0086) while(!(UCSRA&0x20)); //判断数据寄存器是否为空
_UartTransmitData:
00AB 9B5D SBIS 0x0B,5
00AC CFFE RJMP _UartTransmitData
(0087) UDR = UcAdcData;
00AD 90200062 LDS R2,UcAdcData
00AF B82C OUT 0x0C,R2
00B0 9508 RET
(0088) }
(0089) /*-----------------------------------------------------------------
(0090) 函数名称: void InitDevices(void)
(0091) 函数功能: 初始化各种信息
(0092) 参 数:
(0093) 返 回 值: 无
(0094) -----------------------------------------------------------------*/
(0095) void InitDevices(void)
(0096) {
(0097) CLI(); //关全部中断
_InitDevices:
00B1 94F8 BCLR 7
(0098) Uart0Init();
00B2 DFDF RCALL _Uart0Init
(0099) AdcInit();
00B3 DFC5 RCALL _AdcInit
(0100)
(0101) MCUCR = 0x00;
00B4 2422 CLR R2
00B5 BE25 OUT 0x35,R2
(0102) SEI(); //开全中断
00B6 9478 BSET 7
00B7 9508 RET
(0103) }
(0104)
(0105)
(0106) void main(void)
(0107) {
(0108) // uchar i;
(0109) InitDevices();
_main:
00B8 DFF8 RCALL _InitDevices
00B9 C008 RJMP 0x00C2
(0110) while(1)
(0111) {
(0112) if( AdcConCom)
00BA 90200060 LDS R2,AdcConCom
00BC 2022 TST R2
00BD F021 BEQ 0x00C2
(0113) {
(0114) AdcConCom = 0; //清ADC转换完成标志
00BE 2422 CLR R2
00BF 92200060 STS AdcConCom,R2
(0115) UartTransmitData(); //发送转换结果
FILE: <library>
00C1 DFE9 RCALL _UartTransmitData
00C2 CFF7 RJMP 0x00BA
00C3 9508 RET
mod8u:
00C4 9468 BSET 6
00C5 C001 RJMP xdiv8u
div8u:
00C6 94E8 BCLR 6
xdiv8u:
00C7 932A ST R18,-Y
00C8 92FA ST R15,-Y
00C9 92EA ST R14,-Y
00CA 24FF CLR R15
00CB 24EE CLR R14
00CC E120 LDI R18,0x10
00CD 0F00 LSL R16
00CE 1CFF ROL R15
00CF 1CEE ROL R14
00D0 16E1 CP R14,R17
00D1 F010 BCS 0x00D4
00D2 1AE1 SUB R14,R17
00D3 9503 INC R16
00D4 952A DEC R18
00D5 F7B9 BNE 0x00CD
00D6 F40E BRTC 0x00D8
00D7 2D0E MOV R16,R14
00D8 90E9 LD R14,Y+
00D9 90F9 LD R15,Y+
00DA 9129 LD R18,Y+
00DB 9508 RET
push_gset5:
00DC 92FA ST R15,-Y
00DD 92EA ST R14,-Y
push_gset4:
00DE 92DA ST R13,-Y
00DF 92CA ST R12,-Y
push_gset3:
00E0 92BA ST R11,-Y
00E1 92AA ST R10,-Y
push_gset2:
00E2 937A ST R23,-Y
00E3 936A ST R22,-Y
push_gset1:
00E4 935A ST R21,-Y
00E5 934A ST R20,-Y
00E6 9508 RET
pop_gset1:
00E7 E0E1 LDI R30,1
pop:
00E8 9149 LD R20,Y+
00E9 9159 LD R21,Y+
00EA FDE0 SBRC R30,0
00EB 9508 RET
00EC 9169 LD R22,Y+
00ED 9179 LD R23,Y+
00EE FDE1 SBRC R30,1
00EF 9508 RET
00F0 90A9 LD R10,Y+
00F1 90B9 LD R11,Y+
00F2 FDE2 SBRC R30,2
00F3 9508 RET
00F4 90C9 LD R12,Y+
00F5 90D9 LD R13,Y+
00F6 FDE3 SBRC R30,3
00F7 9508 RET
00F8 90E9 LD R14,Y+
00F9 90F9 LD R15,Y+
00FA 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -