2017年单片机省赛
有关题目




实现代码
注意:①注意修改驱动代码时要留意一下onewire.c中单总线延时函数,是
STC89C52RC,还是15系列的,15系列的单片机速度比51快8~12倍,需要修改对应的延时函数。②实现pwm控制电机实现不同的转动速度,通过调占空比实现的。需要结合点击转动的频率。③剩余时间为零时,需要停止pwm信号的输出。
onewire.c中具体修改如下
//单总线延时函数
void Delay_OneWire(unsigned int t)
{
while(t--)
{
signed char i = 0;
for (i = 0; i < 12; i++);
}
}
实现风格①main.c
#include "STC15F2K60S2.h"
#include "onewire.h"
#define uchar unsigned char
#define uint unsigned int
sbit L1 = P0^0;
sbit L2 = P0^1;
sbit L3 = P0^2;
sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;
uchar temp;//实时温度
uchar time;//倒计时时间
uchar mod = 1;//模式
code uchar tab[] = {
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf, 0xc6};
//-, C 11 12
uchar pwm_val, pwm_cnt = 0;
bit flag_s7 = 0;//初始化0为显示剩余工作时间
void sys_init();//系统初始化
uchar rd_temp();
void key_handle();
void led();
//显示模块
void dsp_smg_bit(uchar pos, val);//位显示数码管
void display();
void dsp_time();
void dsp_temp();
void delay_k(uchar t);
void Delay1ms(); //@12.000MHz
void main()
{
sys_init();
while(1)
{
temp = rd_temp();//实时读取温度
key_handle();//按键处理
display();//界面显示
if (!time)
{
ET1 = 0;
P34 = 0;
}
else
{
ET1 = 1;
}
led();//led显示
}
}
void led()
{
if (time > 0)
{
if (mod == 1)
{
P2 = (P2 & 0x1f) | 0x80;
L1 = 0;
}
else if (mod == 2)
{
P2 = (P2 & 0x1f) | 0x80;
L2 = 0;
}
else if (mod == 3)
{
P2 = (P2 & 0x1f) | 0x80;
L3 = 0;
}
}
else
{
P2 = (P2 & 0x1f) | 0x80;
P0 = 0xff;
}
}
void display()
{
if (!flag_s7)
{
dsp_time();
}
else
{
dsp_temp();
}
}
void dsp_time()
{
dsp_smg_bit(1, 11);
dsp_smg_bit(2, mod);
dsp_smg_bit(3, 11);
dsp_smg_bit(4, 10);
dsp_smg_bit(5, 0);
dsp_smg_bit(6, time / 100);
dsp_smg_bit(7, time / 10 % 10);
dsp_smg_bit(8, time % 10);

本文介绍了一种基于STC15F2K60S2单片机的解决方案,涉及温度传感器DS18B20读取、按键控制的PWM电机速度调整及时间显示。核心代码包括主函数、LED显示、温度读取、延时函数和单总线通信。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



