- 打卡等级:初来乍到
- 打卡总天数:9
- 最近打卡:2025-05-01 14:00:37
中级会员
- 积分
- 237
|
本帖最后由 yhf3721 于 2023-6-20 11:29 编辑
第一集知道什么是单片机,以及单片机的用途。stc32g单片机是目前最强大单片机,是32位8051单片机。
第二集认识stc32g实验箱的各大模块和作用。
第三搭建编译开发环境
学习一款单片机,最重要的是首先要看单片机手册,了解跟其它单片机的区别及注意事项。下载安装stc isp工具。
stc32g单片机要安装keil c251编译器,hex输出格
式选择hex386。
第四集建立工程点亮led
/*****************************
点亮led
*******************************/
#include <STC32G.H> //调用头文件
sbit P00=P0^0; //选择p0.0引脚
void main() //主函数
{
P0M0=0x00; //设置P0口端口为准双向口模式
P0M1=0x00;
while(1) //死循环
{
P00=0; //输出低电平
}
}
usb不停电下载程序
usb hid和usb cdc两种模式
usb cdc不停电下载程序
usb hid模式不停电下载程序
第五集c语言运算符和进制转换入门
printf函数的格式字符和转义符使用
主函数添加程序:
if(DeviceState!=DEVSTATE_CONFIGURED)
continuFe;
if(bUsbOutReady)
{
usb_OUT_done();
}
常规用法:
printf("hoello world!");
printf("室内湿度:%.2f\r\n",26.5);
c语言运算符(算术运算符,位运算符,赋值运算符)
进制转换(二进制,十进制,十六进制)
第六集led点亮和花式闪烁
函数的使用三步:定义,声明,调用
学会delay延时函数
void delay_ms(u16 ms);//前部声明
void delay_ms(u16 ms)//延时函数定义
if(DeviceState!=DEVSTATE_CONFIGURED)
continuFe;
if(bUsbOutReady)
{
usb_OUT_done();
}
void main()
{
............
delay_ms(100);
}
while,do while循环函数
while()
{
.........
}
do{
........
}
while();
#define 名称 需要定义的内容
模块化编程
xxx.h格式
#ifndef__XXX_H
#define__XXX_H
调用头文件
函数声明
#endif
xxx.c格式
#inclde "xxx.h"
函数定义
第七集按键点灯
按键防抖使用延时10-20ms再次检测
if(KEY==0)
{
delay_ms(10);
if(KEY==0)
{
执行功能
}
}
位左移<< ,位右移>>
数组的定义:类型 名称[长度]={数值}
赋值: 名称[索引]=数值
第八集蜂鸣器的应用
有源蜂鸣器和无源蜂鸣器区别内部有无震荡源.
有源蜂鸣器两脚接直流电就会发声.
上图划线部分语句,视频教程教程中讲解不够详细。我的理解:p6=~(1<<(run_mode-1))
run_mode初值是0,
key2按第一次,p6=~(1<<(1-1) 0000 0001<<0位,
0000 0001 取反 1111 1110
key2按第二次,p6=~(1<<(2-1) 0000 0001<<1位,
0000 0010 取反 1111 1101
key3按第三次,p6=~(1<<(3-1) 0000 0001<<2位,
0000 0100 取反 1111 1011
第九集数码管静态显示
数码管有共阴和共阳之分。
7段,8段,米字型。1位,2位,3位,4位等。
数码管的内码(段码)用一般用16位数表示,放在数组中方便调用。
屠龙刀核心板没有蜂鸣器可以led代替,没有数码管外设,数码管动静态只能理论,不能实践。
不知什么时候才能获得实验箱,好期待呀。
u8 num=0;
u8 SEG_Tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阴数码管 0~9段码
一位数码管显示0-9
void main()
{
while(1)
{
p70=0;
p6= SEG_Tab[num];
num++;
if(num>9)
num=0;
delay(100);
}
}
第十集数码管动态显示
数码管动态显示原理是人眼不容易分辨50hz以上刷新率,延时时间不大于20ms。
8位数码管
段码数组,位码数组。
新建数组保存每位要显示的内容。
10秒免单
u8 SEG_Tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阴数码管 0~9段码
u8 COM_Tab[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//0~7位码
u8 Show_Tab[8]={1,2,3,4,5,6,7,8} ; //每位要显示的内容
bit run_state=0;
void main()
{
while(1)
{
SEG_Fre();
if(run_state==1)
{
temp++;
if(temp>9999)
temp=0;
}
if(key1==0)
{
delay(10);
if(key1==0)
{
beep=0;
delay(10);
beep=1;
if(run_state==0)
temp=0;
run_state=!run_state;
}
while(key1==0)
{
SEG_Fre();
}
}
}
void SEG_Fre( void )
{
Show_Tab[0] = 1; //选择 1
Show_Tab[1] = 10; //选择 0.
Show_Tab[2] = 0; //选择 0
Show_Tab[3] = 0; //选择 0
Show_Tab[4]=temp/1000;
Show_Tab[5]=temp/100%10+10;
Show_Tab[6]=temp/10%10;
Show_Tab[7]=temp%10;
//位码选择第一位,段码选择0
P7 = COM_Tab[num]; //位码的选择
P6 = SEG_Tab[Show_Tab[num]];
//需要显示的数字的内码 赋给 P6 NUM =0 -> Show_Tab[num]] = 1 -> p6 = oxF9
delay(1);
P6=0xff;
num++;
if( num >7 )
num = 0;
}
}
}
void delay(u16 ms) //unsigned int
{
u16 i;
do
{
i = MAIN_Fosc/6000;
while(--i);
}while(--ms);
}
第十一集定时器使用
定时/计时器T/C,有定时和计数功能,stc32g有5个24位定时/计数器。
定时器较常用
简易时钟
#ininclude<stc32g.h >
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long uint32;
typedef signed char int8;
typedef signed int int16;
typedef signed long int;
u8 COM_Tab[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//0
uint8 SEG_Tab[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
uint8 Show_Tab[8]={0,0,10,0,0,10,0,0};
uint16 temp,num;
uint16 hour,min,sec; //时间时分秒计数
sbit beep=P1^5;
void Show_time();//时间显示函数
void main()
{
// set T0 1ms 12t
TMOD = 0x00; //设置定时器模式
TH0 = (65536-2000)/256;//设置定时初始值
TL0 = (65536-2000)%256;//设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
EA=1;
while (1)
{
Show_time();
if((hour==0)&&(min==0)&&(sec==30))
//判断当前时间与闹钟是否一致
{
beep=0;
while(10);
beep=1;
}
}
}
void Show_time()
{
Show_Tab[0]=hour/10;
Show_Tab[1]=hour%10;
Show_Tab[2]=10;
Show_Tab[3]=min/10;
Show_Tab[4]=min%10;
Show_Tab[5]=10;
Show_Tab[6]=sec/10;
Show_Tab[7]=sec%10;
p7=COM_Tab[num];
P6=SEG_Tab[Show_Tab[num]];
num++;
if(num>7)
num=0;
}
void Timer0_Isr(void) interrupt 1
{
temp++;
if(temp>=1000)
{
temp=0;
sec++;
}
if(sec>=60)
{
sec=0;
min++;
}
if(min>=60)
{
min=0;
hour++;
}
if (hour>=24)
hour=0;
}
第十二集计数器使用
计数器用来对外部脉冲的数量进行计数,广泛用来计量转速,流速等动量。
用按键t1模拟外部脉冲信号
#define key4 p35(T1脚)
void main()
{
TMOD = 0x40; //设置T1计数器模式
TL1 = 0xFF; //设置T1计数初始值
TH1 = 0xFF; //设置T1计数初始值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计数
ET1 = 1; //使能定时器1中断
P3PU = 0x20; //打开内部上拉4.1K
P40 = 0; //led的电源控制三极管打开
EA = 1; //打开总中断。
while(1)
{
}
}
void Timer1_Isr(void) interrupt 3
{
P60 = !P60; //led取反
}
第十三集多任务
模块化编程 .c + .h
变量函数声明在.h文件
修饰符extern用在函数和变量的声明前,用来说明此函数和变量在别处已经定义,要在此处引用。函数前修饰符extern可以省略。
如,a.c要应用b.c中的变量int num,在a.h中声明extern int num在a.c可以直接使用
extern修饰的变量不能赋初值,在别处已经赋值。
bdata位寻址变量使用
a.c
u8 bdata LED =0x00;
sbit LED0=LED^0;
sbit LED0=LED^1;
sbit LED0=LED^2;
sbit LED0=LED^3;
sbit LED0=LED^4;
sbit LED0=LED^5;
sbit LED0=LED^6;
sbit LED0=LED^7;
a.h
extern u8 bdata LED;
extern bit LED0;
extern bit LED1;
extern bit LED2;
extern bit LED3;
extern bit LED4;
extern bit LED5;
extern bit LED6;
extern bit LED7;
第十四集矩阵按键
第十五集外部中断
第十六集io中断
第十七集ADC
第十八集ADC采集电源电压
第十九集NTC温度采集
第二十集串口通信
第二十一集串口应用
第二十二集CDC串口通信
第二十三看门狗
第二十四比较器
第二十五集FLASH模拟EEprom
第二十六集ds18b20
第二十七集软件模拟SPI
第二十八集硬件SPI
第二十九集SPI口FLASH
第三十集软件模拟IIc
|
|