
基于STC8G1K08/20pin单片机自制开发板
简介
基于STC8G1K08/20pin单片机,自制的开发板,功能包括:RS485、OLED、按键、AD采样、PWM输出控制、蜂鸣器、NTC、LED指示灯
简介:基于STC8G1K08/20pin单片机,自制的开发板,功能包括:RS485、OLED、按键、AD采样、PWM输出控制、蜂鸣器、NTC、LED指示灯开源协议
:GPL 3.0
描述
项目简介
本项目基于使用STC8G1K08-38I-TSSOP20单片机自制的开发板,芯片小巧,上用空间小。电源使用降压芯片XL7005A,可以从DC5V-DC80V宽范围输入,DC12V或5V输出;开发板具有RS485通讯,可方便学习开发MODBUS-RTU通讯;有3路ADC采样,3个按键和一些输出口,用于学习开发一些小功能是基本够用的。
项目功能
本设计是基于STC8G1K08国产芯片,开发的功能适用于物联网控制,小家电控制,DIY自玩等
项目参数
- 本设计采用XL7005A宽电压输入降压芯片,不用担心插错供电电源;
- 本设计采用OLED液晶显示,上面可以开发显示当前的温度和电压;
- 本设计可开发脉冲充电功能,8.33KHz的电池修复功能;
- 当温度或湿度超出阈值范围时,有蜂鸣器报警提示,并有对应LED报警灯点亮;
原理解析(硬件说明)
软件代码
示例代码是基于ADC采样,NTC的采集实现:
#include"STC8G.h"
#include"stdio.h"
//#include"intrins.h"
#define u8 uint8_t
#define u16 uint16_t
#define u32 uint32_t
typedef unsigned char uint8_t;
typedef unsigned int uint16_t;
typedef unsigned long uint32_t;
#define FOSC 11059200UL //系统外部时钟频率(无符号长整型)
#define BAUD 9600 //欲配置的串口通信波特率值
void delay(u16 Count);
void IO_init(void);
void ADC_init(void);
void UART_init(void);
char putchar(char ch);//发送字符重定向函数
void UART1_SendByte(u8 dat);//串口发送单字节函数
void SendString(u8 *s);
u16 Get_ADC(void);
void main()
{
u16 ADC_NUM=0;//定义变量用于存放ADC转换结果
float Vin_Val=0;//定义变量用于存放模拟电压值
IO_init();
P34=1;
ADC_init();
UART_init();
delay(100);//等待配置稳定
printf("|************************************************|\r\n");
printf("|************串口打印光敏电阻分压实验************|\r\n");
printf("|************************************************|\r\n");
while(1)
{
ADC_NUM=Get_ADC();//获取ADC转换结果
printf("|ADC_Val: %d ",ADC_NUM);//打印ADC转换结果(份数)
Vin_Val=ADC_NUM*0.0048828125;//按5V/1024计算得到的结果
printf("Vin_Val: %f V\r\n",Vin_Val);//打印计算电压结果
delay(2000);//控制串口数据打印速度
}
}
void IO_init(void)
{
P1M0 = 0xf3; P1M1 = 0x3c;
P3M0 |= 0x10; P3M1 &= 0xEF;
// P3M0 &= 0xFB; P3M1 |= 0x04;
P3M0 &= ~0x40; P3M1 |= 0x40;
}
void UART_init(void)
{
SCON=0x50;//8位数据位,波特率可变
AUXR|=0x40;//定时器1时钟为FOSC,即1T
AUXR&=0xFE;//串口1选择定时器1为波特率发生器
TMOD&=0x0F;//设定定时器1为16位自动重载方式
TL1=(65536-(FOSC/4/BAUD));
TH1=(65536-(FOSC/4/BAUD))>>8;//设置波特率重装值
ET1=0;//先禁止定时器1中断
TR1=1;//启动定时器1
ES=1;
EA=1;
}
void UART1_SendByte(u8 dat)
{
TI=0;
SBUF=dat;//发送数据到发送缓冲区内
while(TI==0);//等待发送完毕
TI=0;
}
void SendString(u8 *s)
{
while(*s!='\0')
{
UART1_SendByte(*s);//调用单字节发送函数依次发送数据
s++;
}
}
void ADC_init(void)
{
ADC_CONTR=0x0E;//ADC输入通道选择
ADCCFG=0x0F;//左对齐512个时钟
//ADCCFG=0x2F;//右对齐512个时钟
ADC_CONTR |=0x80;//打开ADC电源
}
u16 Get_ADC(void)
{
u16 ADC_Val=0;//定义变量用于存放ADC转换结果
ADC_CONTR |=0x40;//启动ADC转换
delay(1);
while(!(ADC_CONTR &=0x20));//等待ADC转换完成
ADC_CONTR &=0xDF;//清零ADC转换结束标志位
ADC_Val=ADC_RES<<2;
ADC_Val|=ADC_RESL>>6;//处理左对齐格式下的ADC结果
//ADC_Val=ADC_RES<<8;
//ADC_Val=|ADC_RESL;//处理左对齐格式下的ADC结果
return ADC_Val;
}
void delay(u16 Count)
{
u8 i,j;
while(Count--)
{
for(i=0;i<50;i++)
for(j=0;j<20;j++);
}
}
char putchar(char ch)
{
UART1_SendByte((u8) ch);
return (ch);
}
u16 adc_Table[]=
{
969,//-30 0
966,//-29 1
963,//-28 2
959,//-27 3
955,//-26 4
951,//-25 5
947,//-24 6
943,//-23 7
938,//-22 8
933,//-21 9
928,//-20 10
923,//-19 11
918,//-18 12
912,//-17 13
906,//-16 14
900,//-15 15
894,//-14 16
888,//-13 17
881,//-12 18
874,//-11 19
867,//-10 20
860,//-9 21
852,//-8 22
844,//-7 23
836,//-6 24
828,//-5 25
820,//-4 26
811,//-3 27
802,//-2 28
793,//-1 29
784,//0 30
774,//1 31
765,//2 32
755,//3 33
745,//4 34
734,//5 35
724,//6 36
714,//7 37
703,//8 38
692,//9 39
681,//10 40
670,//11 41
659,//12 42
648,//13 43
637,//14 44
626,//15 45
614,//16 46
603,//17 47
592,//18 48
580,//19 49
569,//20 50
557,//21 51
546,//22 52
535,//23 53
523,//24 54
512,//25 55
501,//26 56
490,//27 57
479,//28 58
468,//29 59
457,//30 60
446,//31 61
436,//32 62
425,//33 63
415,//34 64
405,//35 65
395,//36 66
385,//37 67
375,//38 68
365,//39 69
356,//40 70
347,//41 71
338,//42 72
329,//43 73
320,//44 74
311,//45 75
303,//46 76
295,//47 77
287,//48 78
279,//49 79
271,//50 80
264,//51 81
256,//52 82
249,//53 83
242,//54 84
235,//55 85
229,//56 86
222,//57 87
216,//58 88
210,//59 89
204,//60 90
198,//61 91
192,//62 92
187,//63 93
182,//64 94
176,//65 95
171,//66 96
166,//67 97
162,//68 98
157,//69 99
152,//70 100
148,//71 101
144,//72 102
140,//73 103
136,//74 104
132,//75 105
128,//76 106
124,//77 107
121,//78 108
117,//79 109
114,//80 110
111,//81 111
108,//82 112
105,//83 113
102,//84 114
99, //85 115
96, //86 116
93, //87 117
91, //88 118
88, //89 119
86, //90 120
83, //91 121
81, //92 122
79, //93 123
76, //94 124
74, //95 125
72, //96 126
70, //97 127
68, //98 128
66, //99 129
65, //100 130
63, //101 131
61, //102 132
60, //103 133
58, //104 134
56, //105 135
55, //106 136
53, //107 137
52, //108 138
51, //109 139
49, //110 140
48, //111 141
47, //112 142
45, //113 143
44, //114 144
43, //115 145
42, //116 146
41, //117 147
40, //118 148
39, //119 149
38, //120 150
37, //121 151
36, //122 152
35, //123 153
34, //124 154
33, //125 155
33, //126 156
32, //127 157
31, //128 158
30, //129 159
29, //130 160
29, //131 161
28, //132 162
27, //133 163
27, //134 164
26, //135 165
25, //136 166
25, //137 167
24, //138 168
24, //139 169
23, //140 170
23, //141 171
22, //142 172
21, //143 173
21, //144 174
21, //145 175
20, //146 176
20, //147 177
19, //148 178
19, //149 179
18, //150 180
}
//*****************************************************
//函数名称:Temp_Cal
//函数功能:把读取到的ADC值转换成温度
//入口参数:ADC的数值
//函数返回:当前的温度值,保留一位小数,
//当前版本:
//修改日期:
//当前作者:
//其他备注:int=-32768~32767
//*****************************************************
int Temp_Cal(u16 adc)
{
u8 i;
float temp;
if(adc>adc_Table[0]) //温度大于最小温度的adc数值,表示超量程,返回最小数值
return -32768;
else if(adc
设计图

BOM


评论