谢谢斑竹支持!
DS18B20实验,数码管显示温度,保留一位小数,温度超过30蜂鸣器有报警噢:
简单程序:
#include<STC12C5A60S2.H> //头文件
#include <string.h>
#include "INTRINS.H"
sbit speaker = P1^0;//扬声器
unsigned char leddisplay[8] ={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char leddisplay1[10]={0x3F,0x06,0x5B,0x4f,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
typedef unsigned char BYTE;
sbit DQ = P1^3; //DS18B20的数据口位P1.3
BYTE TPH; //存放温度值的高字节
BYTE TPL; //存放温度值的低字节
void DelayXus(BYTE n);
void DS18B20_Reset();
void DS18B20_WriteByte(BYTE dat);
BYTE DS18B20_ReadByte();
/*********************************************************************************************/
void DELAY_MS (unsigned int a){
unsigned int i;
while( a-- != 0){
for(i = 0; i < 600; i++);
}
}
/*********************************************************************************************/
/**************************************
延时X微秒(STC12C5A60S2@12M)
不同的工作环境,需要调整此函数
此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同
**************************************/
void DelayXus(BYTE n)
{
while (n--)
{
_nop_();
_nop_();
}
}
/**************************************
复位DS18B20,并检测设备是否存在
**************************************/
void DS18B20_Reset()
{
CY = 1;
while (CY)
{
DQ = 0; //送出低电平复位信号
DelayXus(240); //延时至少480us
DelayXus(240);
DQ = 1; //释放数据线
DelayXus(60); //等待60us
CY = DQ; //检测存在脉冲
DelayXus(240); //等待设备释放数据线
DelayXus(180);
}
}
/**************************************
从DS18B20读1字节数据
**************************************/
BYTE DS18B20_ReadByte()
{
BYTE i;
BYTE dat = 0;
for (i=0; i<8; i++) //8位计数器
{
dat >>= 1;
DQ = 0; //开始时间片
DelayXus(1); //延时等待
DQ = 1; //准备接收
DelayXus(1); //接收延时
if (DQ) dat |= 0x80; //读取数据
DelayXus(60); //等待时间片结束
}
return dat;
}
/**************************************
向DS18B20写1字节数据
**************************************/
void DS18B20_WriteByte(BYTE dat)
{
char i;
for (i=0; i<8; i++) //8位计数器
{
DQ = 0; //开始时间片
DelayXus(1); //延时等待
dat >>= 1; //送出数据
DQ = CY;
DelayXus(60); //等待时间片结束
DQ = 1; //恢复数据线
DelayXus(1); //恢复延时
}
}
/******************************************************************************/
/******************************************************************************/
unsigned int ReadTemperature(void){//读取温度
unsigned int t=0;
float tt=0;
DS18B20_Reset(); //设备复位
DS18B20_WriteByte(0xCC); //跳过ROM命令
DS18B20_WriteByte(0x44); //开始转换命令
while (!DQ); //等待转换完成
DS18B20_Reset(); //设备复位
DS18B20_WriteByte(0xCC); //跳过ROM命令
DS18B20_WriteByte(0xBE); //读暂存存储器命令
TPL = DS18B20_ReadByte(); //读温度低字节
TPH = DS18B20_ReadByte(); //读温度高字节
t=TPH;
t<<=8;
t=t|TPL;
tt=t*0.0625;
t= tt*10+0.5; //放大10倍输出并四舍五入
return(t);
}
/*****************************************************************************/
/**********************************************************
蜂鸣器驱动子函数
**********************************************************/
void beep(void)
{
speaker = 1;
DELAY_MS(20);
speaker = 0;
DELAY_MS(20);
}
/**********************************************************
LED驱动子函数
**********************************************************/
void led_display(void)
{
unsigned char i;
for(i=0;i<3;i++)
{
P0 = leddisplay[i];
P2 = i;
DELAY_MS(1);
}
}
/**********************************************************
/*---------------------------------------------------------------------------------------------------------*/
/* MAIN function */
/*---------------------------------------------------------------------------------------------------------*/
int main (void)
{
unsigned int i=0;
unsigned char a,b,c;
speaker=0;
while(1)
{
i=ReadTemperature();//读温度并送显
a=i/100;
if(a>2){beep();}
leddisplay[0]=leddisplay1[a];
b=i/10-a*10;
leddisplay[1]=leddisplay1[b]+ 0x80;;
c=i-a*100-b*10;
leddisplay[2]=leddisplay1[c];
led_display();
}
}
本实验是根据热敏电阻MFD-103AT随温度变化而其阻值的变化,通过PCF8591对其进行AD采集,送单片机进行运算处理,得出温度值。
简单原程序:
#include <STC12C5A60S2.H> //STC头文件
#include <MATH.H> //STC头文件
double AD_Value;
unsigned int Temp;
sbit speaker = P1^0;//蜂鸣器
sbit SCL=P1^1;//时钟脉冲
sbit SDA=P1^2;//双向输入输出数据端
#define SCL_SET SCL=1
#define SCL_CLR SCL=0
#define SDA_SET SDA=1
#define SDA_CLR SDA=0
#define AddWr 0x90 //写数据地址 1001 0000
#define AddRd 0x91 //读数据地址 1001 0001
#define adCon 0x40 //AD控制字节 0100 0000
/*********************************************************************************************/
/*-- 调入了一幅图像:C:\Documents and Settings\dz\桌面\logo.bmp --*/
/*-- 宽度x高度=128x22 --*/
unsigned char code logo[] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xC7,0x81,0xE0,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xF3,0x83,0xE0,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xF9,0x87,0xF0,0x7C,0x03,0x00,0x80,0x80,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x87,0xF0,0xFC,0x06,0x03,0x41,0xC0,0xC0,0x00,0xC0,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x47,0xF0,0xFC,0x03,0xC0,0x40,0x41,0x40,0x22,0xE0,
0xFC,0x01,0xF0,0x00,0xF8,0x7E,0x07,0xF8,0xFC,0x07,0x00,0x81,0xE1,0x82,0xA3,0xC0,
0xFC,0x01,0xF0,0x00,0xF8,0x3F,0x0F,0xF8,0xF8,0x14,0x07,0xE2,0x40,0x27,0xF1,0x00,
0xFF,0xF9,0xF0,0x00,0xF8,0x3F,0x0F,0xF8,0xF8,0x12,0x80,0x82,0xC3,0x72,0xA3,0xE0,
0xFF,0xF9,0xFF,0xFF,0xF8,0x7F,0x0F,0xF8,0xF8,0x0B,0x80,0x82,0xC5,0x52,0x63,0x18,
0xFF,0xF9,0xFF,0xFF,0xFF,0xFE,0x5F,0xFD,0xF8,0x07,0x02,0x84,0xE3,0x61,0xF5,0x80,
0xFF,0xF9,0xFF,0xFF,0xFF,0xFE,0x5F,0x7D,0xF8,0x01,0x81,0x04,0x00,0x00,0x00,0x80,
0xFF,0xF9,0xFF,0xFF,0xFF,0xFC,0xDF,0x7D,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFC,0x01,0xFF,0xFF,0xFF,0xF9,0xFE,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFC,0x01,0xF0,0x00,0xFF,0xF3,0xFE,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFC,0x01,0xF0,0x00,0xFF,0xC3,0xFE,0x3F,0xF0,0x00,0xE1,0xE3,0x66,0x03,0x8D,0x80,
0xFC,0x01,0xF0,0x00,0xF8,0x03,0xFE,0x3F,0xE0,0x01,0xFB,0xF3,0xFF,0x07,0xEF,0xC0,
0xFF,0xFF,0xFF,0xFF,0xF8,0x03,0xFC,0x1F,0xE0,0x03,0x03,0x33,0xBB,0x0C,0x0E,0xC0,
0xFF,0xFF,0xFF,0xFF,0xF8,0x01,0xFC,0x1F,0xE0,0x03,0x03,0x33,0x33,0x0C,0x0C,0xC0,
0xFF,0xFF,0xFF,0xFF,0xF8,0x01,0xFC,0x1F,0xE0,0x1B,0x9B,0x33,0x33,0x6E,0x6C,0xC0,
0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x70,0x07,0x80,0x19,0xF1,0xE3,0x33,0x67,0xCC,0xC0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
/*****************************************************************************/
/****************************************************************************/
//LCD接口定义
sbit RS = P2^4; //模式位,为0输入指令,为1输入数据
sbit RW = P2^5; //读写位,为0读,为1写
sbit E = P2^6; //使能位
#define Lcd_Bus P0 //数据总线
sbit PSB = P2^1; //H:8位或4位并口方式,L:串口方式
sbit NC = P2^2; //空脚
sbit RES = P2^3; //复位端,低电平有效
/*****************************************************************************/
/*********************************************************************************************/
void DELAY_MS (unsigned int a){
unsigned int i;
while( a-- != 0){
for(i = 0; i < 600; i++);
}
}
/*********************************************************************************************/
/******************************************************************************/
//LCD驱动
/******************************************************************************/
void chk_busy(){//检查忙位
RS=0;
RW=1;
E=1;
Lcd_Bus=0xff;
while((Lcd_Bus&0x80)==0x80);
E=0;
}
/******************************************************************************/
void write_com(unsigned char cmdcode){ //写命令到LCD
chk_busy();
RS=0;
RW=0;
E=1;
Lcd_Bus=cmdcode;
E=0;
}
/******************************************************************************/
void write_data(unsigned char Dispdata){ //写数据到LCD
chk_busy();
RS=1;
RW=0;
E=1;
Lcd_Bus=Dispdata;
E=0;
}
/******************************************************************************/
void lcm_init(){ //初始化LCD屏)
PSB = 1; //H:8位或4位并口方式,L:串口方式
NC = 0; //空脚
RES = 1; //复位端,低电平有效
write_com(0x30); //选择8bit数据流
write_com(0x0c); //开显示(无游标、不反白)
write_com(0x01); //清除显示,并且设定地址指针为00H
}
/*****************************************************************************/
void lcm_w_word(unsigned char *s){ //向LCM发送一个字符串,长度64字符之内。
while(*s>0){ //
write_data(*s);
s++;
}
}
/******************************************************************************/
void lcm_w_test(bit i,unsigned char word){//写指令或数据
if(i == 0){
write_com(word); //写指令或数据(0,指令)
}else{
write_data(word);//写指令或数据(1,数据)
}
}
/******************************************************************************/
void lcm_clr(void){//清屏函数
lcm_w_test(0,0x01);
}
/******************************************************************************/
/******************************************************************************
//指定显示位置// (设置LCD显示的起始位置)
/******************************************************************************/
void LCD_set_xy( unsigned char x, unsigned char y ){//X为行(1~4),Y为列(0~7)
unsigned char address;
switch(x){
case 0: address = 0x80 + y; break;
case 1: address = 0x80 + y; break;
case 2: address = 0x90 + y; break;
case 3: address = 0x88 + y; break;
case 4: address = 0x98 + y; break;
default:address = 0x80 + y; break;
}
lcm_w_test(0, address);
}
/******************************************************************************
//图形方式12864显示字模(横向8位左高位取模)
/******************************************************************************/
void Disp_img(unsigned char *img){
unsigned char i,j;
unsigned int k = 0;
lcm_w_test(0,0x36); //图形方式
for(i=0;i<32;i++){
lcm_w_test(0,0x80+i);
lcm_w_test(0,0x80);
for(j=0;j<16;j++) {
lcm_w_test(1,img[k++]);
}
}
for(i=0;i<32;i++){
lcm_w_test(0,0x80+i);
lcm_w_test(0,0x88);
for(j=0;j<16;j++) {
lcm_w_test(1,img[k++]);
}
}
}
/**********************************************************/
//延时1US
void delay(unsigned int cnt)
{
while(--cnt);
}
//延时1MS
void delayms(unsigned int time)
{
unsigned int i;
for(i=0; i<time; i++)
delay(120);
}
void start()
{
SDA_SET;
delay(1);
SCL_SET;
delay(5);
SDA_CLR;
}
void stop()
{
SDA_CLR;
delay(1);
SCL_SET;
delay(5);
SDA_SET;
}
void ack()
{
SDA_CLR;
SCL_SET;
delay(1);
SCL_CLR;
}
void noAck()
{
SDA_SET;
SCL_SET;
delay(1);
SCL_CLR;
}
void send(unsigned char Data)
{
unsigned char i=0;
unsigned char temp=0;
temp=Data;
for(i=0; i<8; i++)
{
SCL_CLR;
delay(1);
if(temp&0x80) SDA_SET;
else SDA_CLR;
delay(1);
SCL_SET;
delay(1);
temp<<=1;
}
SCL_CLR;
}
unsigned char recive()
{
unsigned char i=0;
unsigned char temp=0;
SDA_SET; //必须设置
for(i=0; i<8; i++)
{
SCL_CLR;//拉低允许数据改变
delay(1);
SCL_SET;//拉高保持数据,等待读走
delay(2);
if(SDA) temp|=0x01;
else temp&=0xfe;
if(i<7) temp<<=1;//最低位发送完成不能移位,否则出错
}
SCL_CLR;
return temp;
}
unsigned char read(unsigned char ch )
{
unsigned char temp=0;
start();
send(AddWr);//确认芯片
ack();
send(adCon|ch);//确认通道
ack();
//读出数据,放进temp
start();
send(AddRd);
ack();
temp=recive();
noAck();
stop();
return temp;
}
unsigned char DAC(unsigned char light)
{
start();
send(AddWr);
ack();
send(0x40); //写入控制位,使能DAC输出
ack();
send(light);
ack();
stop();
}
/*****************************************************************************/
//---主程序---//
/*****************************************************************************/
main() {
speaker=0;
lcm_init(); //初始化液晶显示器
Disp_img(logo);//显示图片测试内容
DELAY_MS (10000);
lcm_clr();
lcm_init(); //初始化液晶显示器
LCD_set_xy(1,0); //写入字符的位置
lcm_w_word(" NTC1测温实验 "); //写入字符内容
LCD_set_xy(3,0);
lcm_w_word(" 温度: ℃ ");
while(1){ //主循环
AD_Value=read(1);
Temp = floor((1/(log(AD_Value/(255-AD_Value))/3380 + 1/298.15)- 273.15)*10);
lcm_w_test(0,0x8c); //秒值在LCM上的写入位置
lcm_w_test(1,Temp/100+0x30);
if(Temp/100>2){
speaker = 1;
DELAY_MS(20);
speaker = 0;
DELAY_MS(20);
}
lcm_w_test(1,Temp%100/10+0x30);
lcm_w_test(1,0x2e);
lcm_w_test(1,Temp%10+0x30);
DELAY_MS (300);
}
}
PS2键盘实验,参考了网上的程序,用1602显示键盘输入的字符:
程序代码:
#include <STC12C5A60S2.H> //STC头文件
#include <PS2.h>
//宏定义
typedef unsigned char uchar;
typedef unsigned int uint;
bit Flag;
sbit PS2_PIN=P3^0; //#define PS2_PIN P3_0
sbit PS2_CLK=P3^2; //#define PS2_CLK P3_2
typedef unsigned char uint8; // 无符号8位整型变量 //
/********************************************************************************************
// 引脚定义 //
/********************************************************************************************/
#define LCM1602_DB0_DB7 P0 // 定义LCM1602的数据总线
sbit LCM1602_RS = P2 ^ 4; // 定义LCM1602的RS控制线
sbit LCM1602_RW = P2 ^ 5; // 定义LCM1602的RW控制线
sbit LCM1602_E = P2 ^ 6; // 定义LCM1602的E控制线
sbit LCM1602_Busy = P0 ^ 7; // 定义LCM1602的测忙线(与LCM1602_DB0_DB7关联)
/********************************************************************************************
// 定义LCM1602指令集 //
/********************************************************************************************/
#define CMD_clear 0x01 // 清除屏幕
#define CMD_back 0x02 // DDRAM回零位
#define CMD_dec1 0x04 // 读入后AC(指针)减1,向左写
#define CMD_add1 0x06 // 读入后AC(指针)加1,向右写
#define CMD_dis_gb1 0x0f // 开显示_开光标_开光标闪烁
#define CMD_dis_gb2 0x0e // 开显示_开光标_关光标闪烁
#define CMD_dis_gb3 0x0c // 开显示_关光标_关光标闪烁
#define CMD_OFF_dis 0x08 // 关显示_关光标_关光标闪烁
#define CMD_set82 0x38 // 8位总线_2行显示
#define CMD_set81 0x30 // 8位总线_1行显示(上边行)
#define CMD_set42 0x28 // 4位总线_2行显示
#define CMD_set41 0x20 // 4位总线_1行显示(上边行)
#define lin_1 0x80 // 4位总线_1行显示(上边行)
#define lin_2 0xc0 // 4位总线_1行显示(上边行)
volatile uchar counter; //中断脉冲计数
volatile uchar key_value; //键值
volatile uchar key_value_buf[1];//键值缓冲区
volatile uchar key;
volatile uchar i;
volatile uchar key_fact;
void delay(uint ms)
{
uint i;
for(;ms>0;ms--)
for(i=500;i>0;i--);
}
/********************************************************************************************
// 读LCM忙程序 [底层协议] //
// LCM1602测忙,若LCM1602处于忙状态,本函数将等待至非忙状态 //
/********************************************************************************************/
void LCM1602_TestBusy(void){
LCM1602_DB0_DB7 = 0xff; //设备读状态
LCM1602_RS = 0;
LCM1602_RW = 1;
LCM1602_E = 1;
while(LCM1602_Busy); //等待LCM不忙
LCM1602_E = 0; //
}
/********************************************************************************************
// 写指令程序 //
// 向LCM1602写命令 本函数需要1个指令集的入口参数 //
/********************************************************************************************/
void LCM1602_WriteCMD(uint8 LCM1602_command) {
LCM1602_TestBusy();
LCM1602_DB0_DB7 = LCM1602_command;
LCM1602_RS = 0;
LCM1602_RW = 0;
LCM1602_E = 1;
LCM1602_E = 0;
}
/********************************************************************************************
// 写数据程序 //
// 向LCM1602写数据 //
/********************************************************************************************/
void LCM1602_WriteData(uint8 LCM1602_data){
LCM1602_TestBusy();
LCM1602_DB0_DB7 = LCM1602_data;
LCM1602_RS = 1;
LCM1602_RW = 0;
LCM1602_E = 1;
LCM1602_E = 0;
}
/********************************************************************************************
// 打印字符串程序 //
// 向LCM发送一个字符串,长度48字符之内
// 第一行位置 0x00~0x17 第二行位置 0x40~0x57
// 应用举例:print(0x80,"goodboy3021");
/********************************************************************************************/
void print(uint8 a,uint8 *str){
LCM1602_WriteCMD(a | 0x80);
while(*str != '\0'){
LCM1602_WriteData(*str++);
}
*str = 0;
}
/********************************************************************************************
// 打印单字符程序 //
// 第一行位置 0x00~0x17 第二行位置 0x40~0x57
// 向LCM发送一个字符,以十六进制(0x00)表示
// 应用举例:print(0xc0,0x30);
/********************************************************************************************/
void print2(uint8 a,uint8 t){
LCM1602_WriteCMD(a | 0x80);
LCM1602_WriteData(t);
}
/********************************************************************************************
// LCM1602初始化 //
/********************************************************************************************/
void LCM1602_Init(void){
LCM1602_WriteCMD(CMD_set82); //* 显示模式设置:显示2行,每个字符为5*7个像素
LCM1602_WriteCMD(CMD_clear); // 显示清屏
LCM1602_WriteCMD(CMD_back); //* 数据指针指向第1行第1个字符位置
LCM1602_WriteCMD(CMD_add1); // 显示光标移动设置:文字不动,光标右移
LCM1602_WriteCMD(CMD_dis_gb1); // 显示开及光标设置:显示开,光标开,闪烁开
}
/********************************************************************************************/
//PS2端口中断初始化
void PS2_Init(void)
{
counter=0; //中断脉冲计数
key_value=0; //键值
key=0;
i=0;
PS2_PIN = 1;//将数据线拉高
PS2_CLK = 1;//时钟线拉高
IT0 = 1; //下降沿触发中断
EX0 = 1; //打开外部中断0
EA = 1; //打开全局中断
//优先级采用默认方式,即最高优先级为复位中断 其次为外部中断0
}
uchar PS2_Value(void)
{
switch(key_value)
{
case PS_0:key_fact=0x30;break;
case PS_1:key_fact=0x31;break;
case PS_2:key_fact=0x32;break;
case PS_3:key_fact=0x33;break;
case PS_4:key_fact=0x34;break;
case PS_5:key_fact=0x35;break;
case PS_6:key_fact=0x36;break;
case PS_7:key_fact=0x37;break;
case PS_8:key_fact=0x38;break;
case PS_9:key_fact=0x39;break;
case PS_a:key_fact=0x61;break;
case PS_b:key_fact=0x62;break;
case PS_c:key_fact=0x63;break;
case PS_d:key_fact=0x64;break;
case PS_e:key_fact=0x65;break;
case PS_f:key_fact=0x66;break;
case PS_g:key_fact=0x67;break;
case PS_h:key_fact=0x68;break;
case PS_i:key_fact=0x69;break;
case PS_j:key_fact=0x6A;break;
case PS_k:key_fact=0x6B;break;
case PS_l:key_fact=0x6C;break;
case PS_m:key_fact=0x6D;break;
case PS_n:key_fact=0x6E;break;
case PS_o:key_fact=0x6F;break;
case PS_p:key_fact=0x70;break;
case PS_q:key_fact=0x71;break;
case PS_r:key_fact=0x72;break;
case PS_s:key_fact=0x73;break;
case PS_t:key_fact=0x74;break;
case PS_u:key_fact=0x75;break;
case PS_v:key_fact=0x76;break;
case PS_w:key_fact=0x77;break;
case PS_x:key_fact=0x78;break;
case PS_y:key_fact=0x79;break;
case PS_z:key_fact=0x7A;break;
case PS_SPACE:key_fact=0x20;break;
case PS_Q2:key_fact=0x2E;break;
case PS_Q7:key_fact=0x2D;break;
default:key_fact=0x20;Flag=0;break;
}
return key_fact;
}
int main()
{
uchar i=0,j=0,k=63;
PS2_Init();
LCM1602_Init(); //LCM1602初始化
Flag=0;
while(1)
{
if(Flag)
{
i=PS2_Value();
print2(j,i);
if(j<15)
{
j=j+1;
}
else{
j=k+1;
k=k+1;
}
if(j>80)
{
LCM1602_WriteCMD(CMD_clear);
j=0;
k=63;
}
delay(250);
}
Flag=0;
}
return 0;
}
void INT0_ISR(void) interrupt 0 using 3
{
if(counter>0 && counter<9) //接受1字节数据
{
key >>= 1;
if(PS2_PIN) {key |= 0x80;}
}
counter++;
if(counter==11)
{
counter=0;
key_value_buf[i]=key;
key=0;
i++;
if(i==2) i=0;
if(key_value_buf[1]==0xf0 || key_value_buf[0]==0xf0)
{
key_value=(key_value_buf[1]==0xF0?key_value_buf[0]:key_value_buf[1]);
Flag=1;
}
}
}
PS2.H
#ifndef _PS2_H
#define _PS2_H
//键码定义
//0到9键码
#define PS_0 0x45
#define PS_1 0x16
#define PS_2 0x1E
#define PS_3 0x26
#define PS_4 0x25
#define PS_5 0x2E
#define PS_6 0x36
#define PS_7 0x3D
#define PS_8 0x3E
#define PS_9 0x46
//a到z键码
#define PS_a 0x1C
#define PS_b 0x32
#define PS_c 0x21
#define PS_d 0x23
#define PS_e 0x24
#define PS_f 0x2B
#define PS_g 0x34
#define PS_h 0x33
#define PS_i 0x43
#define PS_j 0x3B
#define PS_k 0x42
#define PS_l 0x4B
#define PS_m 0x3A
#define PS_n 0x31
#define PS_o 0x44
#define PS_p 0x4D
#define PS_q 0x15
#define PS_r 0x2D
#define PS_s 0x1B
#define PS_t 0x2C
#define PS_u 0x3C
#define PS_v 0x2A
#define PS_w 0x1D
#define PS_x 0x22
#define PS_y 0x35
#define PS_z 0x1A
//F0到F2键码
#define PS_F1 0x05
#define PS_F2 0x06
#define PS_F3 0x04
#define PS_F4 0x0C
#define PS_F5 0x03
#define PS_F6 0x0B
#define PS_F7 0x83
#define PS_F8 0x0A
#define PS_F9 0x01
#define PS_F10 0x09
#define PS_F11 0x78
#define PS_F12 0x07
//部分特殊键键码
#define PS_Enter 0x5A //回车键
#define PS_Shift 0x12 //Shift
#define PS_Ctrl 0x14 //Ctrl
#define PS_Back_S 0x66 //Back Space
#define PS_Esc 0x76 //Esc
#define PS_Tab 0x0D //Tab
#define PS_Del 0x71 //DEl
//方向键键码
#define PS_UP 0x75 //向上键
#define PS_DOWN 0x72 //向下键
#define PS_LEFT 0x6B //向左键
#define PS_RIGHT 0x74 //向右键
#define PS_SPACE 0x29 //空格键
//部分符号键键码
#define PS_Q1 0x41 //符号键,
#define PS_Q2 0x49 //符号键.
#define PS_Q3 0x4C //符号键;
#define PS_Q4 0x54 //符号键[
#define PS_Q5 0x5B //符号键]
#define PS_Q6 0x55 //符号键=
#define PS_Q7 0x4E //符号键-
#define PS_Q8 0x4A //符号键/
//小键盘键码
#define PS_L0 0x70 //小键盘0
#define PS_L1 0x69 //小键盘1
#define PS_L2 0x72 //小键盘2
#define PS_L3 0x7A //小键盘3
#define PS_L4 0x6B //小键盘4
#define PS_L5 0x73 //小键盘5
#define PS_L6 0x74 //小键盘6
#define PS_L7 0x6C //小键盘7
#define PS_L8 0x75 //小键盘8
#define PS_L9 0x7D //小键盘9
#define PS_L10 0x71 //小键盘.
#define PS_L11 0xA5 //小键盘Enter E0A5
#define PS_L12 0x79 //小键盘+
#define PS_L13 0x7B //小键盘-
#define PS_L14 0x7C //小键盘*
#define PS_L15 0x4A //小键盘/ E04A
#define PS_L16 0x77 //小键盘Num Lock
//键盘函数声明
extern void PS2_Init();
extern unsigned char PS2_Value();
#endif
MCU-DIY之步进电机实验,本实验是利用开发板上的UL2003来驱动步进电机的,步进电机是光驱中拆下来的2相6线步进式电机,工作电压为12V,实验用的是板上的5V电压,力矩变小。实验内容为利用板上的4x1独立按键中的S2、S3和S4来控制步进电机的正转、反转和停止:
简单驱动程序:
#include <STC12C5A60S2.H> //STC头文件
#define PHASEPORT P1 //引脚定义
sbit ZZ = P3 ^ 1;
sbit FZ = P3 ^ 2;
sbit TZ = P3 ^ 3;
unsigned char FFW[8]={0xF1,0xF3,0xF2,0xF6,0xF4,0xFC,0xF8,0xF9};
unsigned char REV[8]={0xF9,0xF8,0xFC,0xF4,0xF6,0xF2,0xF3,0xF1};
/*****************************************************************/
/*****************************************************************/
void DELAY_MS (unsigned int a){ // 1ms延时程序
unsigned int i;
while( --a != 0){
for(i = 0; i < 600; i++);
}
}
/*****************************************************************/
/********************************************************/
/*
/*步进电机正转
/*
/********************************************************/
void motor_ffw()
{
unsigned char i;
for (i=0; i<8; i++)
{
PHASEPORT = FFW[i]; //取数据
DELAY_MS(20); //调节转速
}
}
/********************************************************/
/*
/*步进电机反转
/*
/********************************************************/
void motor_rev()
{
unsigned char i;
for (i=0; i<8; i++)
{
PHASEPORT = REV[i]; //取数据
DELAY_MS(20); //调节转速
}
}
/********************************************************/
/*
/* 主程序
/*
*********************************************************/
main()
{
PHASEPORT=0xF0;
while(1)
{
if(ZZ==0){
DELAY_MS(250);
while(FZ==1 && TZ==1)
{
motor_ffw(); //电机正转
}
}
if(FZ==0){
DELAY_MS(250);
while(ZZ==1 && TZ==1)
{
motor_rev(); //电机反转
}
}
if(TZ==0){
DELAY_MS(250);
while(ZZ==1 && FZ==1)
{
PHASEPORT=0xF0;
} }
}
}
MCU-DIY开发板数字时钟实验:此数字时钟同样使用了DIY开发板上的DS1302数字时钟芯片,并通过8位数码管来显示年、月、日、星期、小时、分钟、秒。通过板上的4x1键盘的S2、S3、S4对数字时钟的年/月/日、星期、时间切换显示。数字时钟时间校正是使用VB 编写的上位机程序,通过串口传送数据,一键对其进行时钟校正(也可扩展闹铃设定等),操作方便、时间准确。
程序代码:
#include <STC12C5A60S2.H> //STC头文件
#include <MATH.H>
sbit S2 = P3 ^ 1;
sbit S3 = P3 ^ 2;
sbit S4 = P3 ^ 3;
sbit speaker = P3 ^ 7;
static unsigned char data s_time[14];
static unsigned char data CN;
unsigned char leddisplay[8] ={0x3F,0x3F,0x40,0x3F,0x3F,0x40,0x3F,0x3F};
unsigned char leddisplay1[10]={0x3F,0x06,0x5B,0x4f,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned char yy,mo,dd,xq,hh,mm,ss;//定义时间映射全局变量(专用寄存器)
bit w = 0; //调时标志位
//定义累加器A中的各位
sbit a0 = ACC ^ 0;
sbit a1 = ACC ^ 1;
sbit a2 = ACC ^ 2;
sbit a3 = ACC ^ 3;
sbit a4 = ACC ^ 4;
sbit a5 = ACC ^ 5;
sbit a6 = ACC ^ 6;
sbit a7 = ACC ^ 7;
/****************************************************************************/
/*****************************************************************************/
//定义DS1302时钟接口
sbit clock_clk = P3 ^ 6;//ds1302_clk(时钟线)
sbit clock_dat = P3 ^ 4;//ds1302_dat(数据线)
sbit clock_Rst = P3 ^ 5;//ds1302_Rst(复位线)
/*****************************************************************************/
//声明(当各函数的排列适当时可不用声明)
void led_ss(void);void led_mm(void);
void led_hh(void);void led_dd(void);
void led_mo(void);void led_yy(void);
void led_xq(void);
unsigned char clock_in(void);
void clock_out(unsigned char dd);
void Init_1302(void);
unsigned char read_clock(unsigned char ord);
void read_clockS(void);
void Set_time(void);
void write_clock(unsigned char ord, unsigned char dd);
void updata (void);
/*****************************************************************/
void DELAY_MS (unsigned int a){ // 1ms延时程序
unsigned int i;
while( --a != 0){
for(i = 0; i < 600; i++);
}
}
/*****************************************************************/
/**********************************************************
*
*蜂鸣器驱动子函数
*
**********************************************************/
void beep(void)
{
speaker = 1;
DELAY_MS(20);
speaker = 0;
DELAY_MS(20);
}
/**********************************************************
*
*LED驱动子函数
*
**********************************************************/
void led_display(void)
{
unsigned char i;
for(i=0;i<8;i++)
{
P0 = leddisplay[i];
P2 = i;
DELAY_MS(2);
}
}
/**********************************************************/
/*********************************************************************************************
函数名:UART串口初始化函数
调 用:UART_init();
参 数:无
返回值:无
结 果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)
备 注:振荡晶体为11.0592MHz,PC串口端设置 [ 19200,8,无,1,无 ]
/**********************************************************************************************/
void UART_init (void){
EA = 1; //允许总中断(如不使用中断,可用//屏蔽)
ES = 1; //允许UART串口的中断
TMOD = 0x20; //定时器T/C1工作方式2
SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)
TH1 = 0xFD; //定时器初值高8位设置
TL1 = 0xFD; //定时器初值低8位设置
PCON = 0x80; //波特率倍频(屏蔽本句波特率为9600)
TR1 = 1; //定时器启动
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:UART串口接收中断处理函数
调 用:[SBUF收到数据后中断处理]
参 数:无
返回值:无
结 果:UART串口接收到数据时产生中断,用户对数据进行处理(并发送回去)
备 注:过长的处理程序会影响后面数据的接收
/**********************************************************************************************/
void UART_R (void) interrupt 4 using 1{ //切换寄存器组到1
unsigned char UART_data; //定义串口接收数据变量
if (RI == 1){ //接收中断标志位为1时
if(CN>13)
{
CN=0;
}
UART_data = SBUF; //接收数据 SBUF 为单片机的接收发送缓冲寄存器
s_time[CN]=UART_data;
CN=CN+1;
RI = 0; //令接收中断标志位为0(软件清零)
SBUF = UART_data;
while(TI == 0);
TI = 0;
w=1;
}
}
/**********************************************************************************************/
/*****************************************************************************/
//DS1302时钟芯片驱动程序
/*****************************************************************************/
//常用时钟数据读取
void read_clockS(void){
ss = read_clock(0x81);//读取秒数据
mm = read_clock(0x83);//读取分钟数据
hh = read_clock(0x85);//小时
dd = read_clock(0x87);//日
mo = read_clock(0x89);//月
xq = read_clock(0x8b);//星期
yy = read_clock(0x8d);//年
}
/*****************************************************************************/
//调时程序
void Set_time(void){ //根据选择调整的相应项写入DS1302
write_clock(0x8e,0x00);//允许写操作
write_clock(0x8c,(s_time[1]%16*10+s_time[2]%16)/10*16+(s_time[1]%16*10+s_time[2]%16)%10); //年
write_clock(0x8a,s_time[7]%16); //星期
write_clock(0x88,(s_time[3]%16*10+s_time[4]%16)/10*16+(s_time[3]%16*10+s_time[4]%16)%10); //月
write_clock(0x86,(s_time[5]%16*10+s_time[6]%16)/10*16+(s_time[5]%16*10+s_time[6]%16)%10); //日
write_clock(0x84,(s_time[8]%16*10+s_time[9]%16)/10*16+(s_time[8]%16*10+s_time[9]%16)%10); //小时
write_clock(0x82,(s_time[10]%16*10+s_time[11]%16)/10*16+(s_time[10]%16*10+s_time[11]%16)%10);//分钟
write_clock(0x80,(s_time[12]%16*10+s_time[13]%16)/10*16+(s_time[12]%16*10+s_time[13]%16)%10);//秒
write_clock(0x8e,0x80);//禁止写操作
updata ();
beep();
w=0;
}
/*****************************************************************************/
//设置1302的初始时间(自动初始化)
void Init_1302(void){//设置1302的初始时间(2007年1月1日00时00分00秒星期一)
unsigned char f;
if(read_clock(0xc1) != 0xaa){
write_clock(0x8e,0x00);//允许写操作
write_clock(0x8c,0x07);//年
write_clock(0x8a,0x01);//星期
write_clock(0x88,0x01);//月
write_clock(0x86,0x01);//日
write_clock(0x84,0x00);//小时
write_clock(0x82,0x00);//分钟
write_clock(0x80,0x00);//秒
write_clock(0x90,0xa5);//充电
write_clock(0xc0,0xaa);//写入初始化标志RAM(第00个RAM位置)
for(f=0;f<60;f=f+2){//清除闹钟RAM位为0
write_clock(0xc2+f,0x00);
}
write_clock(0x8e,0x80);//禁止写操作
}
}
/*****************************************************************************/
//DS1302写数据(底层协议)
void write_clock(unsigned char ord, unsigned char dd){
clock_clk=0;
clock_Rst=0;
clock_Rst=1;
clock_out(ord);
clock_out(dd);
clock_Rst=0;
clock_clk=1;
}
/*****************************************************************************/
//1302驱动程序(底层协议)
void clock_out(unsigned char dd){
ACC=dd;
clock_dat=a0; clock_clk=1; clock_clk=0;
clock_dat=a1; clock_clk=1; clock_clk=0;
clock_dat=a2; clock_clk=1; clock_clk=0;
clock_dat=a3; clock_clk=1; clock_clk=0;
clock_dat=a4; clock_clk=1; clock_clk=0;
clock_dat=a5; clock_clk=1; clock_clk=0;
clock_dat=a6; clock_clk=1; clock_clk=0;
clock_dat=a7; clock_clk=1; clock_clk=0;
}
/*****************************************************************************/
//DS1302写入字节(底层协议)
unsigned char clock_in(void){
clock_dat=1;
a0=clock_dat;
clock_clk=1; clock_clk=0; a1=clock_dat;
clock_clk=1; clock_clk=0; a2=clock_dat;
clock_clk=1; clock_clk=0; a3=clock_dat;
clock_clk=1; clock_clk=0; a4=clock_dat;
clock_clk=1; clock_clk=0; a5=clock_dat;
clock_clk=1; clock_clk=0; a6=clock_dat;
clock_clk=1; clock_clk=0; a7=clock_dat;
return(ACC);
}
/*****************************************************************************/
//DS1302读数据(底层协议)
unsigned char read_clock(unsigned char ord){
unsigned char dd=0;
clock_clk=0;
clock_Rst=0;
clock_Rst=1;
clock_out(ord);
dd=clock_in();
clock_Rst=0;
clock_clk=1;
return(dd);
}
/*****************************************************************************/
//刷新数据
void updata (void){
led_mm();//刷新 分
led_hh();//刷新 小时
led_dd();//刷新 日
led_xq();//更新星期值
led_mo();//刷新 月
led_yy();//刷新 年
}
/*****************************************************************************/
//向数码管中填写 年 数据
void led_yy(void){
yy = read_clock(0x8d);
leddisplay[0] = leddisplay1[2];
leddisplay[1] = leddisplay1[0];
leddisplay[2] = leddisplay1[yy/16];
leddisplay[3] = leddisplay1[yy%16] | 0x80;
}
/*****************************************************************************/
//向数码管中填写 月 数据
void led_mo(void){
mo = read_clock(0x89);
if(mo/16 != 0){leddisplay[4] = leddisplay1[mo/16];} //十位消隐
else{leddisplay[4] = 0x00;}
leddisplay[5] = leddisplay1[mo%16]| 0x80;
}
/*****************************************************************************/
//向数码管中填写 日 数据
void led_dd(void){
dd = read_clock(0x87);
if(dd/16 != 0){leddisplay[6] = leddisplay1[dd/16]; } //十位消隐
else{leddisplay[6] = 0x00;}
leddisplay[7] = leddisplay1[dd%16];
}
/*****************************************************************************/
//星期处理
void led_xq(void){
xq = read_clock(0x8b);
leddisplay[0] = leddisplay1[xq%16];
leddisplay[1] = 0x00;
leddisplay[2] = 0x00;
leddisplay[3] = 0x00;
leddisplay[4] = 0x00;
leddisplay[5] = 0x00;
leddisplay[6] = 0x00;
leddisplay[7] = 0x00;
}
/*****************************************************************************/
//向数码管中填写 小时 数据
void led_hh(void){
hh = read_clock(0x85);
leddisplay[0] = leddisplay1[hh/16];
leddisplay[1] = leddisplay1[hh%16];
leddisplay[2] = 0x40;
}
/*****************************************************************************/
//向数码管中填写 分钟 数据
void led_mm(void){
mm = read_clock(0x83);
leddisplay[3] = leddisplay1[mm/16];
leddisplay[4] = leddisplay1[mm%16];
leddisplay[5] = 0x40;
}
/*****************************************************************************/
//向数码管中填写 秒 数据
void led_ss(void){
if(read_clock(0x81) != ss){ //判断是否需要更新
ss = read_clock(0x81); //更新数据
leddisplay[6] = leddisplay1[ss/16];
leddisplay[7] = leddisplay1[ss%16];
led_mm();//刷新 分
led_hh();//刷新 小时
}
}
/********************************************************/
/*
/* 主程序
/*
*********************************************************/
main()
{
unsigned char i,j;
yy=0xff;mo=0xff;dd=0xff;xq=0xff;hh=0xff;mm=0xff;ss=0xff; //各数据刷新
Init_1302();
UART_init ();
speaker=0;
while(1)
{
if (w == 0){ //正常走时
led_ss(); //刷新 秒
}
if (w==1){
Set_time(); //更新
}
if (S2 == 0){
led_dd();//刷新 日
led_mo();//刷新 月
led_yy();//刷新 年
while(S4==1){
led_display();
}
for(i=0;i<50;i++){led_display();} //防抖
}
if (S3 == 0){
led_xq();//刷新 星期
while(S4==1){
led_display();
}
for(j=0;j<50;j++){led_display();} //防抖
}
led_display();
}
}
上位机校正程序免费下载地址:http://share.eepw.com.cn/share/download/id/60517
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 | |
【FRDM-MCXN947评测】核间通信MUTEX被打赏50分 |