wulin 发表于 2024-1-13 06:11 把定时器2修改为定时器1后,可以发送数据了,谢谢 |
hjx5548 发表于 2024-1-12 20:14 首先要说清楚所选用的MCU具体型号,你标题写STC8G1K0A,在15、16楼又说是STC8G1H08A。实际上你说的型号都不存在。估猜实际型号是STC8G1K08A-PIN8。那么问题就非常明确了。STC8G1K08A只有定时器0和定时器1,没有定时器2。你用定时器2作波特率发生器怎么能成功? |
wulin 发表于 2024-1-11 22:12 能不能把你的代码发上来参考一下,STC8H1K08A的8脚单片机,ADC采集是P32。 |
hjx5548 发表于 2024-1-11 14:41 STC8G1H08A-PIN8 单片机的P32 |
wulin 发表于 2024-1-11 22:12 #include "STC8G.h" #include "intrins.h" #define uchar unsigned char #define uint unsigned int #define ADCTIM (*(unsigned char volatile xdata *)0xfea8) #define ADC_POWER 0x80 //ADC电源控制位1000 0000 #define ADC_START 0x40 //ADC启动控制位0100 0000 #define ADC_FLAG 0x20 //ADC完成标志位0010 0000 #define ADC_EPWMT 0x10 //ADC使能控制位0001 0000 #define FOSC 1105920L //系统频率 #define BAUD 11520 //串口波特率 uint ADC_A,ADC_B; void Delay1ms() //@11.0592MHz { unsigned char i, j; i = 15; j = 90; do { while (--j); } while (--i); } /*----------------------------- 初始化ADC ------------------------------*/ void UartInit() //可变波特率设置 115200bps@11.0592MHz { SCON = 0x50; //8位可变波特率 AUXR |= 0x14; //T2为1T模式 T2L = (65536 - (FOSC/4/BAUD)); //设置波特率重装值 T2H = (65536 - (FOSC/4/BAUD))>>8; } void send_byte(uchar by) { SBUF = by; while (!TI); TI = 0; } void Init_ADC() { //ADC 控制器 电源 启动 完成 -- 15通道模拟选择位 单片机STC8G1K08A-8PIN P30 0000 P31 0001 P32 0010 P33 0011 P54 0100 P55 0101 //ADC_CONTR B7 B6 B5 B4 B3 B2 B1 B0 P_SW2 |= 0x80; //打开 ADCTIM = 0x3f; //设置 ADC 内部时序 P_SW2 &= 0x7f; //关闭 ADCCFG = 0x27; //设置ADC结果右对齐,速度为512系统时钟 ADC_RES=0; //清除ADC_RES存储器以前的结果 ADC_RESL=0; ADC_CONTR=ADC_POWER; //ADC 开启电源 Delay1ms(); //上电延时1ms } /*---------------------------- 读取ADC结果 ----------------------------*/ uint GetADCResult(uchar CH) { ADC_CONTR=ADC_POWER|ADC_START|CH;//启动转换1100 1000 STC8G1K08A-8PIN的CH P30 0000 P31 0001 P32 0010 P33 0011 P54 0100 P55 0101 _nop_();_nop_(); //小延时 while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成标志置位 1010 0000 ADC_CONTR &=~ADC_FLAG; //清完成标志 return ADC_RES<<8|ADC_RESL; //返回十位ADC结果 } void main () { P3M0 = 0x00; P3M1 = 0x04; P5M0 = 0x00; P5M1 = 0x00; Init_ADC(); while(1) { ADC_A=GetADCResult(2); // ADC_B=GetADCResult(1); //添加显示/控制代码 send_byte(ADC_A/1000 + 0x30); send_byte(ADC_A%1000/100 + 0x30); send_byte(ADC_A%100/10 + 0x30); send_byte(ADC_A%10 + 0x30); send_byte(0x0a); Delay100ms(); Delay100ms(); Delay100ms(); } } //这个是你以前帖子,加入了串口发送,也是无法发送ADC ,芯片为8脚的STC8G1K08A ,ADC采集口P32 |
设置P32为ADC口,需要修改哪里? |
#define BAUD 11520 //串口波特率,先单独测试串口吧 |
hjx5548 发表于 2024-1-11 20:37 ![]() |
hjx5548 发表于 2024-1-11 14:41 ADC_CONTR |=0x40;//启动AD交换 后4位表示采集的通道 ADC0口 P30 0000 P31 0001 P32 0010 P33 0011 P54 0100 P55 0101 |
cocolala 发表于 2024-1-11 09:43 代码是什么型号单片机? |
hjx5548 发表于 2024-1-11 14:42 上面改过的程序实测串口可以正常发送ADC转换值。问题可能是你串口中断与send_byte(uchar by)函数TI处理冲突。 |
wulin 发表于 2024-1-11 10:47 定时器后面还有代码要用的。先谢谢了 |
cocolala 发表于 2024-1-11 09:43 谢谢啦,有空我试一下 |
用不到的函数屏蔽掉
|