本人初学STC12C5A60S2,以前用过STC89C52。看到网上查到的都说程序可以通用什么的,但是根本不行啊,这个是STC89C52使用绝对没问题的程序,为何现在现在到STC12C5A60S2上却完全不是那么回事呢?二者在配置上有什么区别呢?请大神详细讲讲
/********************************************************************
功能描述:由串口向上位机发送"哈哈哈"
***********************************************************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
/********************************************************************
* 名称 : Uart0_Init()
* 功能 : 串口初始化,晶振12M,波特率9600,使能了串口中断
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Uart0_Init()
{
//9600波特率对应 FFD9H
RCAP2L = 0xD9;
RCAP2H = 0xFF;
//RCLK、TCLK置1
//TR2置1
T2CON = 0x34;
//串口工作模式1,接收使能
SCON = 0x50;
//允许串口中断
ES = 1;
return;
}
/********************************************************************
* 名称 : Com_Init()
* 功能 : 串口初始化,波特率9600,使能了串口中断
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Com_Init(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xfd; //设置波特率 9600 //fD
TL1 = 0xd3; //
TR1 = 1; //启动定时器1
ES = 1; //开串口中断
EA = 1; //开总中断
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main()
{
uchar i = 0;
uchar code Buffer[] = "哈哈哈"; //所要发送的数据
uchar *p;
// Com_Init();
Uart0_Init();
P1 = 0xff;
p = Buffer;
while(1)
{
SBUF = *p;
while(!TI) //如果发送完毕,硬件会置位TI
{
_nop_();
}
p++;
if(*p == '\0')
break; //在每个字符串的最后,会有一个'\0'
TI = 0; //TI清零
}
while(1);
}
/**************************************
中断服务程序
**************************************/
void Uart0_Ist() interrupt 4
{
if(RI)
{
RI = 0;
//Do whatever you want;
}
if(TI)
{
TI = 0;
//Do whatever you want;
}
}
看到几个STC12C5A60S2关于串口的例程,里面都有这个子函数,但是配置都不一样,不知道怎么用,有些配置根本不懂干什么的
void uart0_init(void)
{
PCON |= 0x80; //UART0 Double Rate Enable
SCON = 0x50; //UART0 set as 10bit , UART0 RX enable
/*
TMOD &= ~(1<<6); //Timer1 Set as Timer, defalul 12T
TMOD = (TMOD & ~0x30) | 0x20; //Timer1 set as 8 bits auto relaod
AUXR |= (1<<6); //Timer1 set as 1T mode
TH1 = T1_TimerReload; //Load the timer
TR1 = 1;
*/
AUXR |= 0x01; //UART0 使用BRT
AUXR |= 0x04; //BRT set as 1T mode
BRT = BRT_Reload;
AUXR |= 0x10; //start BRT
ES = 1;
EA = 1;
}
STC12C5A60S2单片机的串口中断问题求助
还是那个中断优先级寄存器没有设置好,至少要设置IP,IP2寄存器,将两个串口设置成高优先级,而将定时器0设置成低优先级。另外,STC12C5A60S2串口的波特率可以设置得很高的,尽量用高波特发送,可以减少发送时间,完全可以设置成38400的,甚至57600,都没有问题的。
stc12c5a60s2单片机第二串口通讯问题(可以发送不能接接收)?
如果确定硬件没有问题,先用查询方式测试接收是否正常(标志位是S2CON的最低位)。如果查询方式接收正常,再检查中断相关的设置(串口2中断允许IE2的最低位置位了没有,时钟源有没有在运行,波特率设置是否正确,中断入口函数是不是对应于矢量8)
单片机stc12c5a60s2 想要用串口助手来控制led亮灭,其中led由P0口控制...
还有,串口接收后,不要返回,删掉SBUF=0X00;这没有什么用,但串口还要发送,又没while语句等待发送结束。
stc12c5a60s2 单片机I\/O口设置问题!
STC89C指令周期为12T,STC12C指令周期为1T,也就是说同样用12M的外部晶振STC89C系列指令周期为12M\/12T=1us,而STC12C系列为12M\/1T=0.083us,因此在执行同样的循环延时指令时,将出现12倍的时间差,可能会导致外围器件的时序出现不匹配的情况。需要酌情重新匹配外设时序。
51单片机程序问题 stc12c5a60s2 的a\/d转换问题..
1.转换的引脚由ADC_CONTG的低3位CHS2、CHS1和CHS0控制,三位二进制能表示0~7八个数,与P1口一一对应。ADC的结构决定了它一次只能转换一个口,但是STC的转换速度达到10万次\/秒,依次转换P1.0和P1.1与同时转换差别不大。设置P1.0时,ch=0x00.设置P1.1时,ch=0x01.2.是按照一个字节读的...
STC12C5A60S2,串口1可以发字符串了,串口2不知道怎么回事只能发一个字符...
SCON=0x50;\/\/串口通讯方式1 TH1=0xfd;\/\/波特率9600 TL1=0xfd;button=0;delay(1);TI=0;\/\/发送中断标志位清零 RI=0;\/\/接收中断标志位清零 TR1=1;\/\/启动定时器1 EA=1; \/\/使能全局中断 ES=1; \/\/启动串口中断 } } void main(){ P1=0xff;uart_init() ;while(1){ } \/\/ 串行中断...
stc12c5a60s2 单片机I\/O口设置问题!
STC89C指令周期为12T,STC12C指令周期为1T,也就是说同样用12M的外部晶振STC89C系列指令周期为12M\/12T=1us,而STC12C系列为12M\/1T=0.083us,因此在执行同样的循环延时指令时,将出现12倍的时间差,可能会导致外围器件的时序出现不匹配的情况。需要酌情重新匹配外设时序。
stc12c5a60s2单片机串口2怎么接收不到数据
检查硬件连接有无问题,示波器确认;检查串口2是否已经开启,时钟源选的哪个,是否x12模式,波特率设置是否正确;程序里先用查询方式验证确认串口配置本身有无问题。
stc12C5A60S2单片机的I\/O口中P0口为开漏模式应如何设置
是P0口的8个引脚全部为开漏模式吗,还是其中几个脚?设置方法如下图 如果全部设置为开漏模式:C语言程序则为 P0M1=0xFF;P0M0=0xFF;汇编程序为 MOV P0M1 , #0FFH MOV P0M0 , #0FFH C语言程序,要加载stc12C5A60S2的头文件,可用STC-ISP软件导出头文件。
stc12c5a60s2单片机IO赋0后IO口电压为2.5V,是什么原因?
1.检查IO口配置是否正确 2.查看外围电路是否对IO口产生影响