串口2的初始化程序,我是用STC的“波特率计算工具”生成的:
void UartInit(void) //4800bps@110592MHz
{
AUXR &= 0xf7; //波特率不倍速
S2CON = 0x50; //8位数据,可变波特率
BRT = 0xB8; //设定独立波特率发生器重装值
AUXR |= 0x04; //独立波特率发生器时钟为Fosc,即1T
AUXR |= 0x10; //启动独立波特率发生器
}
串口2查询方式函数,注意不要开中断:
串口输出数据:
void OutByteS2(int8u k)
{
S2BUF=k;
while(!(S2CON&S2TI));
S2CON&=~S2TI;
}
串口读取数据
int8u GetByteS2(void)
{
while(!(S2CON&S2RI));
S2CON&=~S2RI;
return S2BUF;
}
串口2中断服务程序:
void S2INT() interrupt UART2_INT
{
EA=0;
if(S2CON&S2RI)
{
S2CON&=~S2RI;
//k=S2BUF;
}
if(S2CON&S2TI)
{
S2CON&=~S2TI;
//S2BUF=k;
}
EA=1;
}
STC12C5A60S2是STC公司的单片机产品,是基于51内核的,而我们学习的51单片机就是51内核的,所以,STC12C5A60S2的程序写法与我们学的51的是一样的,所以,C51怎么编写,STC12C5A就怎么编写,中断啊,定时啊等等都是一样的。
区别之处就是,在用C语言写STC12C5A60S2单片机程序的时候,包含STC12C5AH头文件,不要包含REG51H或者REG52H,当然,你包含REG51H或者REG52H也没问题,一样能够编译成功,一样能够运行,但是不够全面,REG51H或者REG52H是传统的51单片机的资源头文件,资源比较少,而STC12C5AH是专门用于stc12C5A的头文件,资源比较全面,这个文件,你在百度文库里下载就有。
#include<STC12C5A60ADh>
#include<intrinsh>
#define uchar unsigned char
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
int ch=0,cl=0,flag=0,V;
void adc();
void delay_2ms(void) //误差 0us
{
unsigned char a,b;
for(b=4;b>0;b--)
for(a=248;a>0;a--);
_nop_; //if Keil,require use intrinsh
}
void delay(void) //误差 0us
{
unsigned char a,b,c;
for(c=167;c>0;c--)
for(b=171;b>0;b--)
for(a=16;a>0;a--);
_nop_; //if Keil,require use intrinsh
}
void main()
{
ADC_CONTR = 0xe8; //设置AD转换
delay_2ms();
P1ASF = 0x01; //P10
AUXR1 = 0; //ADC_RES为高八位
EA = 1; //开总中断
EADC = 1; //开AD转换中断
/
init_LCD();
/
while(1)
{
// adc();
if(flag)
{
EADC=0;//关闭AD转换中断
flag=0;
V=ch5/256; //数据转换 只取低位
// time[0]=V%10;
// time[1]=V/10;
// if(V==0)
EADC=1;
P0=0x01; //标记LED
}
// display();
P2=table[(uchar)V] ; //数码管显示
delay();
P0=0;
}
}
void adc() interrupt 5
{
ADC_CONTR&=0xef; //flag清0
flag=1;
ch=ADC_RES;
cl=ADC_RESL;
ADC_RES=0;
ADC_RESL=0;
ADC_CONTR=0xe8;
delay_2ms;
}
#include<reg51h>
#define uchar unsigned char
sfr AUXR=0x8e;
sfr S2CON=0x9a;
sfr S2BUF=0x9b;
sfr BRT=0x9c;
sfr IE2=0xaf;
#define S2RI=0x01
#define S2TI=0x02
uartinit()
{
S2CON=0x50;
BRT=-12000000/32/9600;
AUXR=0x14;
IE2=0x01;
EA=1;
}
不知你的液晶是什么控制器的,这个是st7920的
/
文件名 : 串行12864显示c
描述 : 该程序实现了12864以串行的方式进行通信。
创建人 : 东流,2009年4月10日
版本号 : 20
/
#include <reg52h>
#include <intrinsh>
#define uchar unsigned char
#define uint unsigned int
sbit CS=P2^5; //片选信号
sbit SID=P2^6; //数据信号
sbit SCLK=P2^7; //时钟信号
sbit RST=P2^2; //复位信号
sbit CH = P2^4; //并行、串行选择信号
/
名称 : delay()
功能 : 延时,延时时间为 100us t。这是通过软件延时,有一定误差。
输入 : t
输出 : 无
/
void delay(unsigned int t)
{
unsigned int i,j;
for(i=0; i<t; i++)
for(j=0; j<10; j++);
}
/
名称 : sendbyte()
功能 : 按照液晶的串口通信协议,发送数据
输入 : zdata
输出 : 无
/
void sendbyte(unsigned char zdata)
{
unsigned int i;
for(i=0; i<8; i++)
{
if((zdata << i) & 0x80)
{
SID = 1;
}
else
{
SID = 0;
}
SCLK = 0;
SCLK = 1;
}
}
/
名称 : write_com()
功能 : 写串口指令
输入 : cmdcode
输出 : 无
/
void write_com(unsigned char cmdcode)
{
CS = 1;
sendbyte(0xf8);
sendbyte(cmdcode & 0xf0);
sendbyte((cmdcode << 4) & 0xf0);
delay(2);
}
/
名称 : write_data()
功能 : 写串口指令
输入 : cmdcode
输出 : 无
/
void write_data(unsigned char Dispdata)
{
CS = 1;
sendbyte(0xfa);
sendbyte(Dispdata & 0xf0);
sendbyte((Dispdata << 4) & 0xf0);
delay(2);
}
/
名称 : lcdinit()
功能 : 初始化函数
输入 : cmdcode
输出 : 无
/
void lcdinit()
{
RST = 0;
delay(100);
RST = 1;
delay(20000);
write_com(0x30);
delay(50);
write_com(0x0c);
delay(50);
}
/
名称 : hzkdis()
功能 : 显示字符串
输入 : s
输出 : 无
/
void hzkdis(unsigned char code s)
{
while(s > 0)
{
write_data(s);
s++;
delay(50);
}
}
/
名称 : Test()
功能 : 显示子函数
输入 : 无
输出 : 无
/
void Test()
{
write_com(0x03);
delay(50);
write_com(0x81);
hzkdis(" HOT-51");
write_com(0x91);
hzkdis("单片机开发板");
write_com(0x89);
hzkdis(" ");
write_com(0x98);
hzkdis(" 东流电子");
}
/
名称 : Main()
功能 : 主函数
输入 : 无
输出 : 无
/
void Main()
{
CH = 0;
delay(1);
lcdinit();
delay(10);
while(1)
{
Test();
delay(5000);
}
}
以上就是关于求各位谁有STC12C5A60S2单片机第二串口的程序全部的内容,包括:求各位谁有STC12C5A60S2单片机第二串口的程序、stc12c5A60S2与c51的编程一样吗,c51怎么编写,stc12c5A60S2就怎么编写,比如中断,定时等等、STC12C5A60S2中的AD转换怎么用,有没有可用的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)