适用于stc15系列,使用时请将c文件加入KEIL,并引入相应头文件目录!
双击 Source Group 1
双击所需c文件
寻找刚才C文件所在目录,添加即可。
下再程序注意:KEIL生成的二进制文件位于list文件夹
首次打开工程因无list文件夹会出现一个警告,忽略即可。第二次即无。
提供基础延时函数和GPIO初始化。
delay_ms(time);//time为unsigned int型
GPIO_INIT();//所有GPIO配置为准双向
默认配置串口1,P30_P31,使用定时器2 默认波特率115200,格式8,1
功能:
已配置好,可使用c语言printf()标准函数将信息打印到串口
例如:
printf("hello world**\n**");
使用c标准库函数来向单片机发送命令
注意:stc isp 内串口对此实验显示可能不正确,字符串以\n判定结束
scanf("%4s %d",name,&age);
TX1_Buffer //发送缓冲数组
RX1_Buffer//接收缓冲数组
void usart_demo(){
int age=0;
unsigned char name[5]={"name"};
printf("name age**\n**");
scanf("%4s %d",name,&age);
printf("name:%sage:%d**\n**",name,age);
}
内部ADC驱动
调用ADC_config(ADC_IO);//ADC基础配置,准备ADC_IO口
参数ADC_IO:
#define ADC_P10 0x01 //IO引脚 P1.0
#define ADC_P11 0x02 //IO引脚 P1.1
#define ADC_P12 0x04 //IO引脚 P1.2
#define ADC_P13 0x08 //IO引脚 P1.3
#define ADC_P14 0x10 //IO引脚 P1.4
#define ADC_P15 0x20 //IO引脚 P1.5
#define ADC_P16 0x40 //IO引脚 P1.6
#define ADC_P17 0x80 //IO引脚 P1.7
#define ADC_P1_All 0xFF //IO所有引脚
结果为10位,int类型 1~1024
Get_ADC10bitResult(u8 channel); //channel = 0~7
参数channel:0~7分别对应通道P1.0-P1.7
unsigned int result=0;
ADC_config(ADC_P10);//初始化P10为ADC通道
result=Get_ADC10bitResult(0);//获取P10通道ADC值
printf("ADC:%d**\n**",result);
1602驱动
函数:LCD1602_init();
LCD1602_init();
本模块提供print_lcd()函数,使用方法与printf()完全相同,例如:
print_lcd ("1+1=%d",(int)2);
6路PWM控制器驱动
PWM_INIT(DUTY);
初始化PWM周期,DUTY取值1-32767 最大周期即为32767/(主频/16)秒
PWM_CHN_ENABLE(CHN)
初始化PWM通道
CHN取值1-6
对应IO:
通道1:P3.7
通道2:P2.1
通道3:P2.2
通道4:P2.3
通道5:P1.6
通道6:P1.7
PWM_set_ratio(duty,chn);
duty 取值1-PWM周期,duty应==占空比* PWM周期
chn 1-6
PWM_port_remap(unsigned char chn, bit enable)
Chn 通道号
Enabe 1:使能0:否
提供LCD12864核心驱动和显示函数
注意:中文个别字符有乱码BUG,系KEIL编译器导致,可尽量多用英文或安装补丁
调用init_LCD12864()函数,IO分配设置位于LCD12864.h
使用高级函数print_lcd12864(char* fmt ,...);
使用语法与printf()相同
例如:print_lcd12864(“1+1=%d\n”,(int)2);
注意本函数需要手动换行,只限‘\n’方式
也可使用底层写字符函数
void disp_string_LCD12864(unsigned char x,unsigned char y,unsigned char *s);
功能:显示一个字符串s到液晶 x:第x行,y:第y列,从第X行第Y列开始写
unsigned int adder=0;
init_LCD12864();//初始化LCD
print_lcd12864("1+1=%d**\n**",(int)2);//显示数字2
//下面体现这钟的优势,写一个秒表,每秒加1
while(1){
adder++;
print_lcd12864("adder:%d**\n**",adder);
delay_ms(1000);
}
为一个带中断的按键模板
void key_init();
外部按键使用轻触开关,使用上拉电阻,以下程序配置为了下降沿触发
外部中断引脚:
INT0(P3.2)
INT1(P3.3)
INT2(P3.6)固定为下降沿触发
INT3(P3.7)固定为下降沿触发
INT4(P3.0)固定为下降沿触发
修改位于KEY.c中的如下函数的*//你的代码*位置
/********************* INT0中断函数 *************************/
void Ext_INT0 (void) interrupt INT0_VECTOR //进中断时已经清除标志
{
delay_ms(10);
if(P32==0){
//开始执行中断服务部分
//你的代码
}
}
外部中断配置函数
注意:别忘记开启总中断开关EA
EXTI_config(u8 EXTI_Mode,u8 EXTI_Polity,u8 EXTI_Interrupt,u8 EXT_chn) ;
参数定义如下
EXTI_Mode:中断方式
可选值:
EXT_MODE_RiseFall 0 //上升沿/下降沿中断
EXT_MODE_Fall 1 //下降沿中断
EXTI_Polity:中断优先级
可选值:
PolityLow 0 //低优先级中断
PolityHigh 1 //高优先级中断
EXTI_Interrupt:是否允许中断
可选值
ENABLE 1
DISABLE 0
EXT_chn:使能的外部中断通道
可选值:
EXT_INT0 0 //初始化外中断0
EXT_INT1 1 //初始化外中断1
EXT_INT2 2 //初始化外中断2
EXT_INT3 3 //初始化外中断3
EXT_INT4 4 //初始化外中断4
EXTI_config(EXT_MODE_Fall,PolityHigh,ENABLE,EXT_INT0);
初始化配置INT0,下降沿触发,高优先级,使能中断
DS1302模块是一个数字时钟,本模块提供其驱动
接口定义在头文件中
Ds1302Init();//init
Ds1302ReadTime();//读取值到缓冲
结果存储在TIME[]数组中
定义如下
TIME[2] 时
TIME[1] 分
TIME[6] 年
TIME[4] 月
TIME[3] 日
TIME[5] 1~7 星期一~星期日
本模块提供代码的执行时间测试,通过串口输出结果,使用串口1
#include "Runtime.h"
Runtime_init();
Runtime_start();//启动
//被测试代码如下
delay_ms(1);
Runtime_stop();//结束
温湿度传感器模块
默认使用P07 为数据引脚 修改头文件中 #define dht_dat P07以变更
使用实例
init_DHT11();
while(1){
delay_ms(1000);
getdat_DHT11();
print_lcd12864("hum:\n%d**\n**",(int)Sensor_Data_DHT11[2]);
}
其中Sensor_Data_DHT11为全局变量,内容依次为温度整数部分和温度小数部分,湿度整数部分和湿度小数部分和校验,可选择是否使用,具体参照数据手册
在复杂的c项目中,将全局变量但放到一个global.c文件中声明,并且在头文件中extern暴露出去,其他文件只需include global.h即可,使得工程结构更加清晰。