写在前面
平台
LED
测试代码
#include <STC8G.H>/******************** IO配置函数 **************************/void LED_Init(void){P5M1 = 0x00; //LED引脚P55P5M0 = 0x00; //00设置准双向口 01推挽输出 10高阻输入 11开漏输出}void LED_ON(void){P55 = 0;}void LED_OFF(void){P55 = 1;}
#ifndef __LED_H#define __LED_Hvoid 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_Hvoid 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模拟信号采样时间32P_SW2 &= 0x7f; //P_SW2:外设端口切换寄存器2 与0x7f取&后,相当于把寄存器末位EAXFR置0ADCCFG = 0x0f; //设置 ADC 时钟为系统时钟/2/16/16//0000 1111//0000 转换结果左对齐//1111 SYSclk/2/16ADC_CONTR = 0x80; //使能 ADC 模块//1000 0000//1000 打开ADC电源}int analogRead(int channel){int res = 0;ADC_CONTR &= 0xf0; //底四位清零//1111 0000//1111 打开ADC电源;开始ADC转换,转换完成后硬件自动将此位清零;//0000 ADC模拟通道选择位P10ADC_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_Hvoid 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 设置准双向口 串口2P1M1 = 0x00;P3M0 = 0x00; //P30 P31 设置准双向口 串口1P3M1 = 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的重载值 1Tvoid 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();}}}
数据手册
用到了定时器、中断、串口。


