1、STC12C5A60S2 内部 ADC 转换串口显示程序(已经验证成功)#include #include “intrins.h“typedef unsigned char uchar;typedef unsigned int uint;/* 设置 ADC_CONTRL 控制寄存器 */#define ADC_POWER 0x80 / ADC 电源控制为 0:关闭 AD 转换电源 1:打开 AD 转换电源#define ADC_FLAG 0x10 / ADC 转换结束标志位, AD 转换后自动置 1,/ 由软件清零(这里作取反使用 )#define ADC_START 0x08 / ADC 转
2、换启动控制位,设置为 1 时开始 AD 转换,/ 转换结束后为 0 #define ADRJ_ 0x04 / AUXR1 寄存器的 ADRJ 位是转换结果寄存器(ADC_RES,ADC_RESL)的数据格式调整控制位 / ADRJ 为 0 时,10 位 AD 转换结果的高 8 位存放在ADC_RES 中,低 2 位存放在 ADC_RESL 的低 2 位/ ADRJ 为 1 时,10 位 AD 转换结果的高 2 位存放在ADC_RES 低 2 位中,低 8 位存放在 ADC_RESL#define ADC_SPEEDLL 0x00 / 540 个时钟周期转换一次 (最低速)#define ADC
3、_SPEEDL 0x20 / 360 个时钟周期转换一次 (低 速)#define ADC_SPEEDH 0x40 / 180 个时钟周期转换一次(高 速)#define ADC_SPEEDHH 0x60 / 90 个时钟周期转换一次 (最高速)uchar ch = 0; / 模拟通道uchar code num=0,1,2,3,4,5,6,7,8,9;/ 字符数组,输出到串口显示void delay2ms(void) /误差 0.000000000000usunsigned char a,b;for(b=129;b0;b-)for(a=45;a0;a-);void delay2s(void)
4、 /误差 -0.000000000111usunsigned char a,b,c,n;for(c=142;c0;c-)for(b=168;b0;b-)for(a=250;a0;a-);for(n=2;n0;n-);_nop_(); /if Keil,require use intrins.h/* 串口通信部分 *uchar wj_uun = !; / 用于存放串口 1 接收的字符void bt_uart_init(void) / 单片机串口初始化/SCON=0X50; / SM0=0 SM1=1 SM2=0 REN=1SM0 = 0; / 串口工作方式 1:1 位起始位,8 位数据位,1 位
5、停止位允许串口接收SM1 = 1;REN = 1; / 允许串口接收/RI=1; / 接收标志位,0:正在接收 1:接收完毕 (如果 RI=1 就一直执行串口中断)TMOD = 0X20; / 定时器 T1 工作方式 2TH1 = 0XFD; / 9600bit/s 下的定时器初值TL1 = 0XFD;TR1 = 1; / 启动定时器 T1EA = 1; / 开总中断ES = 1; / 开串行口中断/* 串口 1 发送函数 */void s1_send_char(uchar dat) / 发送端(发送的是字符 )SBUF = dat; / 将字符送入发送缓冲寄存器while(!TI); / T
6、I 为发送状态标志位,0:发送中 1:发送结束TI = 0; / 手动清零标志位void s1_send_string(uchar *pt) / 通过调用发送字符函数来发送字符数组while(*pt != 0) s1_send_char(*pt+);void ADC_Init(void) / P1ASF = 0x01; / 设置 P1 口的 0 为模拟输入端口(经过测试这句写不写 P1 口都能模拟输入)ADC_RES = 0; / 先清空两个寄存器ADC_RESL = 0;AUXR1 / ADRJ 为 0 的存储格式(参考技术手册)ADC_CONTR = ADC_POWER|ADC_SPEED
7、LL|ADC_START|ch; / 开启 ADC 电源并且启动 ADC/ 经过最少四个时钟周期之后才能够正确读取到 ADC_CONTR 的值delay2ms();EADC = 1; / 允许 ADC 中断/* 主函数 *void main()P4SW = 0x70; / P4 端口的 4、5、6 脚可作为通用 I/O 口bt_uart_init(); / 串口初始化ADC_Init(); / ADC 初始化while(1) ;/* ADC 中断函数 *void ADC_(void) interrupt 5 / ADC 中断编号为 5uint adc_result = 0;/ while(!(
8、ADC_CONTR / 如果未转换结束,等待 ADC_CONTR 寄存器ADC_FLAG 位置 1/ ADC_CONTR / 清零 ADC 转换结束标志位(这句可以不写,因为下面有覆盖)if(ADC_CONTR adc_result = ADC_RES*4 + ADC_RESL;/ 获取到 10AD 转换值s1_send_string(“ 通道号:“);s1_send_char(numch); / 通过串口发送通道号s1_send_string(“ 转换值:“); / 一共四位数s1_send_char(numadc_result/1000);s1_send_char(numadc_resul
9、t%1000/100);s1_send_char(numadc_result%100/10);s1_send_char(numadc_result%10);if(+ch3) ch = 0; / 不断切换通道号 0、1、2、3/ 再次设置 ADC_CONTR 寄存器ADC_CONTR = ADC_POWER|ADC_SPEEDLL|ADC_START|ch;delay2s();/* 串口 1 中断程序 */void bt_serial_1() interrupt 4 / 中断编号 4 为串行口 1 中断if(RI) / 接收标志位,0:正在接收 1:接收完毕 (如果RI=1 就一直执行中断)RI = 0; / 同样需要手动清零wj_uun = SBUF; / 将接收缓冲器接收的字符送入变量中