优化原则:
代码功能明确;
方便移植;
减少阻塞(尽可能不用delay函数);
显示结果清晰,无bug;
软件环境:
Keil编译;
STC-ISP 工具;
单片机开发板:普中 STC12C5A60S2 处理器;
单个项目功能代码
LED的控制
电路连接情况
JP12 与 JP10 导线连接:74HC573的输入引脚(D0-D7)接MCU的P0引脚
LE 与 VCC跳线帽连接:使能74HC573的锁存引脚(LE)
代码:
#include <STC12C5A60S2.H>
#define uchar unsigned char
#define uint unsigned int
uchar LED[9];
void Timer0Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xCD; //设置定时初值
TH0 = 0xD4; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;
EA=1;
}
void Delay300ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 13;
j = 156;
k = 83;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Timer0() interrupt 1
{
P0= (LED[8]*128 + LED[7]*64 + LED[6]*32 + LED[5]*16 + LED[4]*8 + LED[3]*4 + LED[2]*2 + LED[1]);
}
void main()
{
Timer0Init();
P0=0x00;
while(1)
{
LED[1] = 1; Delay300ms();
LED[2] = 1; Delay300ms();
LED[3] = 1; Delay300ms();
LED[4] = 1; Delay300ms();
LED[5] = 1; Delay300ms();
LED[6] = 1; Delay300ms();
LED[7] = 1; Delay300ms();
LED[8] = 1; Delay300ms();
LED[8] = 0; LED[7] = 0; LED[6] = 0; LED[5] = 0;
LED[4] = 0; LED[3] = 0; LED[2] = 0; LED[1] = 0;
Delay300ms();
}
}
现象:
依次点亮D11-D18;如何熄灭;
独立按键
电路连接情况
单片机P1接JP5; LED电路如上一实验;
代码
#include <STC12C5A60S2.H>
#define uchar unsigned char
#define uint unsigned int
uchar Cnt,Trg;
uchar count_button;
uchar LED[9];
void Timer0Init(void)
{
AUXR |= 0x80;
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xCD; //设置定时初值
TH0 = 0xD4; //设置定时初值
TF0 = 0;
TR0 = 1;
ET0=1;
EA=1;
}
void Scan_button()
{
uchar ReadDat=P1^0xff;
Trg=ReadDat & (ReadDat^Cnt);
Cnt=ReadDat;
if(Trg & 0X01)
{
LED[1] = 1;
}
else if(Trg & 0X02)
{
LED[2] = 1;
}
else if(Trg & 0X04)
{
LED[3] = 1;
}
else if(Trg & 0X08)
{
LED[4] = 1;
}
else if(Trg & 0X10)
{
LED[5] = 1;
}
else if(Trg & 0X20)
{
LED[6] = 1;
}
else if(Trg & 0X40)
{
LED[7] = 1;
}
else if(Trg & 0X80)
{
LED[8] = 0; LED[7] = 0; LED[6] = 0; LED[5] = 0;
LED[4] = 0; LED[3] = 0; LED[2] = 0; LED[1] = 0;
}
}
void Timer0() interrupt 1
{
P0= (LED[8]*128 + LED[7]*64 + LED[6]*32 + LED[5]*16 + LED[4]*8 + LED[3]*4 + LED[2]*2 + LED[1]);
}
void main()
{
Timer0Init();
P0=0x00;
while(1)
{
Scan_button();
}
}
结果
对应按键的LED对应做反应。
串口通信
普通
电路连接情况
串口功能引脚为:P30,P31;
使用板载数据代码下载USB口
代码
#include <STC12C5A60S2.H>
bit busy;
unsigned char rx_buff;
void SendData(unsigned char dat)
{
while(busy);
busy=1;
SBUF=dat;
}
void SendString(char *s)
{
while(*s)
{
SendData(*s++);
}
}
//串口初始化
void Uart_Init(void) //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xFD; //设置定时初始值
TH1 = 0xFD; //设置定时重载值
ET1 = 0; //禁止定时器%d中断
TR1 = 1; //定时器1开始计时
ES = 1;
EA = 1;
}
void Delay100ms(void) //@11.0592MHz
{
unsigned char data i, j, k;
i = 5;
j = 52;
k = 195;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
Uart_Init();
Delay100ms();
while(1)
{
SendString(“send:”);
SendString(“send:”);
SendData(rx_buff);
}
}
void Uart() interrupt 4
{
if(TI)
{
TI=0;
busy=0;
}
else if(RI)
{
RI = 0;
rx_buff= SBUF;
}
}
结果
串口printf
代码
#include <STC89C5xRC.H>
#include <intrins.h>
#include <stdio.h>
bit busy;
unsigned char rx_buff = 8;
unsigned int rx_buf = 0x0010;
void SendData(unsigned char dat)
{
while(busy);
busy=1;
SBUF=dat;
}
void SendString(char *s)
{
while(*s)
{
SendData(*s++);
}
}
//串口初始化
void Uart_Init(void) //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xFD; //设置定时初始值
TH1 = 0xFD; //设置定时重载值
ET1 = 0; //禁止定时器%d中断
TR1 = 1; //定时器1开始计时
ES = 1;
EA = 1;
}
void Delay100ms(void) //@11.0592MHz
{
unsigned char data i, j, k;
i = 5;
j = 52;
k = 195;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
char putchar(char c)
{
SendData(c);
return c;
}
void main()
{
Uart_Init();
Delay100ms();
while(1)
{
SendString("send:\r\n");
printf("rx_buff: %bd \r\n",rx_buff);
printf("rx_buff: %hd \r\n",rx_buf);
Delay100ms();
}
}
void Uart() interrupt 4
{
if(TI)
{
TI=0;
busy=0;
}
else if(RI)
{
RI = 0;
rx_buff= SBUF;
}
}
结果