写在前面
平台
LED
测试代码
#include <STC8G.H>
/******************** IO配置函数 **************************/
void LED_Init(void)
{
P5M1 = 0x00; //LED引脚P55
P5M0 = 0x00; //00设置准双向口 01推挽输出 10高阻输入 11开漏输出
}
void LED_ON(void)
{
P55 = 0;
}
void LED_OFF(void)
{
P55 = 1;
}
#ifndef __LED_H
#define __LED_H
void LED_Init(void);
void LED_ON(void);
void LED_OFF(void);
#endif
芯片手册
KEY
测试代码
#include <STC8G.H>
/******************** IO配置函数 **************************/
void KEY_Init(void)
{
P1M0 = 0x00; //设置双向输入,P1.0为输入高阻
P1M1 = 0x01;
}
#ifndef __KEY_H
#define __KEY_H
void KEY_Init(void);
#endif
芯片手册
ADC
测试代码
#include <STC8G.H>
#include "intrins.h"
/******************** IO配置函数 **************************/
void ADC_Init(void)
{
P1M0 = 0x00; //设置双向输入,P1.0为输入高阻
P1M1 = 0x01;
P_SW2 |= 0x80; //P_SW2:外设端口切换寄存器2 与0x80取|后,相当于把寄存器末位EAXFR置1
//特殊功能寄存器为扩展SFR,逻辑地址位于 XDATA 区域,访问前需要将 P_SW2(BAH)寄存器的最高位(EAXFR)置 1
//ADCTIM就是特殊功能寄存器
ADCTIM = 0x3f; //设置 ADC 内部时序
//0011 1111 ADC通道选择时间1 ADC通道选择保持时间2 ADC模拟信号采样时间32
P_SW2 &= 0x7f; //P_SW2:外设端口切换寄存器2 与0x7f取&后,相当于把寄存器末位EAXFR置0
ADCCFG = 0x0f; //设置 ADC 时钟为系统时钟/2/16/16
//0000 1111
//0000 转换结果左对齐
//1111 SYSclk/2/16
ADC_CONTR = 0x80; //使能 ADC 模块
//1000 0000
//1000 打开ADC电源
}
int analogRead(int channel)
{
int res = 0;
ADC_CONTR &= 0xf0; //底四位清零
//1111 0000
//1111 打开ADC电源;开始ADC转换,转换完成后硬件自动将此位清零;
//0000 ADC模拟通道选择位P10
ADC_CONTR |= channel; //置位通道
ADC_CONTR |= 0x40; //启动AD转换 0100 0000开始ADC转换
_nop_();
_nop_();
while (!(ADC_CONTR & 0x20)); //查询 ADC 完成标志
ADC_CONTR &= ~0x20; //清完成标志 ADC_FLAG:ADC 转换结束标志位,
//当 ADC 完成一次转换后,硬件会自动将此位置 1,并向 CPU 提出中断请求,此标志位必须软件清零。
res = (int)(ADC_RES*4); //觉得应该右移两位才对?
res += ADC_RESL;
return res; //读取 ADC 结果
}
#ifndef __ADC_H
#define __ADC_H
void ADC_Init(void);
int analogRead(int channel);
#endif
#include <STC8G.h>
#include "intrins.h"
#include "Delay.h"
#include "config.h"
#include "LED.h"
#include "KEY.h"
#include "ADC.h"
int advalue = 0;
void main(void)
{
LED_Init();
ADC_Init();
while(1)
{
advalue = analogRead(0);
if(advalue > 1000)
{
LED_ON();
}
else
{
LED_OFF();
}
}
}
芯片手册
UART
测试代码
#include <STC8G.H>
#include "UART.h"
bit busy;
char wptr;
char buffer;
u8 UART_RxFlag;
void UART_Init()
{
P1M0 = 0x00; //P10 P11 设置准双向口 串口2
P1M1 = 0x00;
P3M0 = 0x00; //P30 P31 设置准双向口 串口1
P3M1 = 0x00;
SCON = 0x50; //串口1控制寄存器 0101 0000 模式1 允许串口接收
T2L = BRT; //定时器2低字节 属于特殊功能寄存器
T2H = BRT >> 8;
AUXR = 0x15; //AUXR定时器2辅助寄存器1 0001 0101 定时器2开始计数;用作定时器
wptr = 0x00;
// rptr = 0x00;
busy = 0;
ES = 1; //ES:串行口1中断允许位
EA = 1; //EA:总中断允许控制位
}
void UART_SendChar(unsigned char dat) //发送一个字符
{
while (busy);
busy = 1;
SBUF = dat;
}
void UART_SendString(unsigned char *p) //发送字符串
{
while (*p)
{
UART_SendChar(*p++);
}
}
//重写putchar函数
char putchar(char c)
{
UART_SendChar(c);
return c;
}
//串口接收标志位
u8 UART_GetRxFlag(void)
{
if (UART_RxFlag == 1)
{
UART_RxFlag = 0;
return 1;
}
return 0;
}
//串口接收数据
u8 UART_GetRxData(void)
{
return buffer;
}
//中断函数
void UARTIsr() interrupt 4
{
if (TI) //TI:串口 1 发送中断请求标志位,停止位被发送出去时置1,向CPU请求中断
{
TI = 0;
busy = 0;
}
if (RI) //RI:串口 1 接收中断请求标志位,接收到停止位时,置1,向CPU请求中断
{
RI = 0;
buffer = SBUF;
UART_RxFlag = 1 ;
//wptr &= 0x0f;
}
}
#ifndef __UART_H__
#define __UART_H__
#include "config.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BRT (65536 - MAIN_Fosc / 9600 / 4) //BRT定时器2的重载值 1T
void UART_Init();
void UART_SendChar(unsigned char dat); //发送一个字符
void UART_SendString(unsigned char *p); //发送字符串
char putchar(char c);
u8 UART_GetRxData(void);
u8 UART_GetRxFlag(void);
#endif
#include <STC8G.h>
#include "intrins.h"
#include "Delay.h"
#include "config.h"
#include "LED.h"
#include "KEY.h"
#include "ADC.h"
#include "UART.h"
u8 RxData;
void main(void)
{
LED_Init();
UART_Init();
while(1)
{
//printf("UART test\r\n");
//UART_SendChar('a');
Delay_ms(1000);
if(UART_GetRxFlag() == 1)
{
RxData=UART_GetRxData();
//UART_SendChar(RxData);
printf("RxDate: %c\n",RxData);
LED_TURN();
}
}
}
数据手册
用到了定时器、中断、串口。