ブルーブリッジカップコンペティションのシングルチップグループの第7回州コンペティションへの回答(コードとコメント)
1.トピック
以前の記事で以前の州および全国大会のトピックを共有しました(クリックして表示)(オンラインディスクリソース)。必要に応じて、直接ダウンロードしてください。ここでは繰り返しません。
2、16進ファイル
リーダーはこのファイルをダウンロードし、書き込みソフトウェアを使用してマイクロコントローラーに直接書き込みます。これで使用できるようになります。
リンク:https
://pan.baidu.com/s/1i1cHqNFWtSmhXAs-7cAbiw抽出コード:dud6
第三に、主な関数の実装
ヒント:競技中は、主な機能の変更だけでは不十分な場合があります。競技関係者から提供された各ドライバーのコードがそのまま記述されているかどうかに注意する必要がある場合があります。たとえば、これらすべてが記述されていない場合もあります。 .hファイルで、意図的にコメントアウトし、対応する.cファイルで必要な関数を見つけて、それらを1つずつ入力する必要があります。
さらに、私のコードは完全に1つのファイルに記述されているため、読者が使用する方が便利です。.cファイルを直接コピーするか、コンテンツをコピーして貼り付けて、好きな場所に配置できます。
コード上:
# include "reg52.h"
# include "onewire.h"
typedef unsigned char uchar;
typedef unsigned int uint;
sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;
uchar duanma[18] = {
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};
uint t_c = 0; //定时1s的计数变量
uchar pwm_c = 0; //脉宽调制的计数变量
uchar pwm_t = 2; //具体的脉宽调制的值,默认值为2
bit pwm_f = 1; //pwm输出的标志变量
uint temp = 0; //用来存放读取的温度
uchar mode = 1; //标志风扇工作模式,默认为睡眠风
uint rtime = 60; //剩余工作时间,默认工作时间1min
bit k7 = 0; //S7按键的标志位,默认为时间倒计时
uchar k6 = 1; //S6按键的标志位,默认为1
void BUZZEROutput ();
//========================锁存器的选择========================
void SelectHC573 (uchar n)
{
switch (n)
{
case 4:
P2 = (P2 & 0x1f) | 0x80;break;
case 5:
P2 = (P2 & 0x1f) | 0xa0;break;
case 6:
P2 = (P2 & 0x1f) | 0xc0;break;
case 7:
P2 = (P2 & 0x1f) | 0xe0;break;
case 0:
P2 = (P2 & 0x1f) | 0x00;break;
}
}
//============================================================
//======================初始化函数============================
void InitSystem ()
{
SelectHC573(4);
P0 = 0xff;
SelectHC573(5);
P0 = 0x00;
SelectHC573(0);
}
//============================================================
//====================定时器T0 - 100us ========================
void InitTime0 ()
{
TMOD = 0x01;
TH0 = (65535 - 100) / 256;
TL0 = (65535 - 100) % 256;
TR0 = 1;
ET0 = 1;
EA = 1;
}
void ServiceTime0 () interrupt 1
{
TH0 = (65535 - 100) / 256;
TL0 = (65535 - 100) % 256;
if (rtime > 0)
{
t_c++;
if (t_c >= 10000)
{
rtime = rtime - 1;
t_c = 0;
}
}
pwm_c = pwm_c + 1;
if (pwm_c >= pwm_t)
{
pwm_f = 0;
}
if (pwm_c >= 10)
{
pwm_c = 0;
pwm_f = 1;
}
}
//============================================================
//======================温度的读取============================
void ReadTemp ()
{
uchar LSB;
uchar MSB;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
LSB = Read_DS18B20();
MSB = Read_DS18B20();
temp = (MSB << 8) | LSB;
if ((temp & 0xf800) == 0x0000)
{
temp = temp >> 4;
}
}
//============================================================
//==================数码管显示相关函数========================
void Delay_SMG (uint t)
{
while (t--);
}
void ShowSMG_Bit (uchar pos,uchar dat)
{
SelectHC573(7);
P0 = 0xff;
SelectHC573(6);
P0 = 0x01 << pos - 1;
SelectHC573(7);
P0 = dat;
SelectHC573(0);
}
void AllSMG (uchar dat)
{
SelectHC573(6);
P0 = 0xff;
SelectHC573(7);
P0 = dat;
SelectHC573(0);
}
void ShowSMG ()
{
if(k7 == 0)
{
ShowSMG_Bit(1,duanma[16]);
Delay_SMG (100);
ShowSMG_Bit(2,duanma[mode]);
Delay_SMG (100);
ShowSMG_Bit(3,duanma[16]);
Delay_SMG (100);
ShowSMG_Bit(5,duanma[rtime / 1000]);
Delay_SMG (100);
ShowSMG_Bit(6,duanma[(rtime / 100) % 10]);
Delay_SMG (100);
ShowSMG_Bit(7,duanma[(rtime / 10) % 10]);
Delay_SMG (100);
ShowSMG_Bit(8,duanma[rtime % 10]);
Delay_SMG (100);
}
else if (k7 == 1)
{
ShowSMG_Bit(1,duanma[16]);
Delay_SMG (100);
ShowSMG_Bit(2,duanma[4]);
Delay_SMG (100);
ShowSMG_Bit(3,duanma[16]);
Delay_SMG (100);
ShowSMG_Bit(6,duanma[(temp / 10) % 10]);
Delay_SMG (100);
ShowSMG_Bit(7,duanma[temp % 10]);
Delay_SMG (100);
ShowSMG_Bit(8,duanma[12]);
Delay_SMG (100);
}
AllSMG(0xff);
}
//============================================================
//=======================浏览按键=============================
void Delay_Key (uchar t)
{
while (t--);
}
void ScanKey ()
{
if (S7 == 0)
{
Delay_Key(100);
if (S7 == 0)
{
while (S7 == 0)
{
ShowSMG ();
if (rtime > 0)
{
BUZZEROutput ();
}
else if (rtime == 0)
{
SelectHC573(5);
P0 = 0x00;
}
}
if (k7 == 0)
{
k7 = 1;
}
else if (k7 == 1)
{
k7 = 0;
}
}
}
if (S6 == 0)
{
Delay_Key(100);
if (S6 == 0)
{
while (S6 == 0)
{
ShowSMG ();
if (rtime > 0)
{
BUZZEROutput ();
}
else if (rtime == 0)
{
SelectHC573(5);
P0 = 0x00;
}
}
rtime = 0;
}
}
if (S5 == 0)
{
Delay_Key(100);
if (S5 == 0)
{
while (S5 == 0)
{
ShowSMG ();
if (rtime > 0)
{
BUZZEROutput ();
}
else if (rtime == 0)
{
SelectHC573(5);
P0 = 0x00;
}
}
if(k6 == 1)
{
k6 = 2;
rtime = 120;
}
else if (k6 == 2)
{
k6 = 0;
rtime = 0;
}
else if (k6 == 0)
{
k6 = 1;
rtime = 60;
}
}
}
if (S4 == 0)
{
Delay_Key(100);
if (S4 == 0)
{
while (S4 == 0)
{
ShowSMG ();
if (rtime > 0)
{
BUZZEROutput ();
}
else if (rtime == 0)
{
SelectHC573(5);
P0 = 0x00;
}
}
if (mode == 1) //睡眠风
{
mode = 2;
pwm_t = 5;
}
else if (mode == 2) //自然风
{
mode = 3;
pwm_t = 10;
}
else if (mode == 3) //常风
{
mode = 1;
pwm_t = 2;
}
}
}
}
//============================================================
//====================PWM蜂鸣器输出===========================
void BUZZEROutput ()
{
SelectHC573(0);
if (pwm_f == 1)
{
P0 = 0x40;
}
else if (pwm_f == 0)
{
P0 = 0x00;
}
SelectHC573(5);
}
//============================================================
//=====================LED显示函数============================
void LEDRunning ()
{
SelectHC573(0);
if (rtime > 0)
{
if (mode == 1)
{
P0 = 0xfe;
}
else if (mode == 2)
{
P0 = 0xfd;
}
else if (mode == 3)
{
P0 = 0xfb;
}
}
else if(rtime == 0)
{
P0 = 0xff;
}
SelectHC573(4);
}
//============================================================
//========================主函数==============================
void main ()
{
InitSystem ();
InitTime0 ();
while (1)
{
ScanKey ();
if (k7 == 1)
{
ReadTemp ();
}
ShowSMG ();
if (rtime > 0)
{
BUZZEROutput ();
}
else if (rtime == 0)
{
SelectHC573(0);
P0 = 0x00;
SelectHC573(5);
}
LEDRunning ();
}
}
//============================================================
第四に、プロジェクトファイル全体
リンク:https
://pan.baidu.com/s/1Qm3icNKZyWl21H2zoB4ZxA抽出コード:80ci
このプロジェクトを直接開くことができない場合は、keilのバージョンが原因である可能性があります。私はkeil3を使用しています。問題がある場合は、.cファイルの内容を直接コピーできます。前に述べたように、私の実装プロセスは次のとおりです。 .cファイルで実現され、読者が使用するのに便利です!
やっと
困っている友達はいつでも私にコメントしたり、個人的に手紙を書いたりして、学習プロセスの問題について話し合うことができます。私は最善を尽くして助けを提供します。
暖かいリマインダー:私に注意を払うことは記事を失うことは簡単ではありません!
ブルーブリッジカップコンペティションシングルチップマイクロコンピューターグループ以前の州コンペティションの質問の回答(コードとコメント)残りについては、https ://blog.csdn.net/weixin_45386875/article/details/114136549を参照してください。