第10节:一个用来学习C语言的模板程序

发布者:dong125612最新更新时间:2016-03-11 来源: eefocus关键字:C语言  模板程序  单片机 手机看文章 扫描二维码
随时随地手机看文章
从业十年,教你单片机入门  第10讲:

目前,几乎所有的初学者在学习和上机练习C语言的时候,都是在电脑上安装VC这个调试软件,在源代码里只要调用打印语句printf就可以观察到不同的变量结果,挺方便的。但是现在我要提出另外一种方法,学习单片机的C语言,不一定非要用VC调试软件,也可以直接在坚鸿51学习板上学习和上机练习的。我可以做一个调试模板程序给初学者使用,利用8位数码管和16个LED灯来显示不同的变量结果,利用3个按键来切换显示不同的变量,这样就能达到类似在VC平台下用printf语句来观察变量的效果。甚至我个人认为这样比用VC调试的效果还更加直观。现在重点介绍这个模板程序的使用。

在模板程序里,初学者只需要在主程序的初始化区域填入自己练习的C语言代码,最后把需要观察的变量赋值给窗口变量就可以了,其它部分的代码属于模板的监控调试代码,大家暂时不用读懂它,直接复制过来就可以了。上述所谓的“赋值”,就是“=”这个语句,它表面上像我们平时用的等于号,实际上不是等于号,而是代表“给”的意思,把“=”符号右边的数复制一份给左边的变量,比如“a=36;”就是代表把36这个数值复制一份给变量a,执行这条指令后,a就等于36了。这里的分号“;”代表一条程序指令的结束。窗口变量有几个?有哪些?一共有10个,分别是GuiWdData0,GuiWdData1,GuiWdData2,GuiWdData3,GuiWdData4,GuiWdData5,GuiWdData6,GuiWdData7,GuiWdData8,GuiWdData9。这10个窗口变量是给大家调试专用的,8位数码管可以切换显示10个窗口变量,最左边2位数码管代表窗口变量号,剩下6位数码管显示十进制的窗口变量数值,另外16个LED实时显示此数据的二进制格式。最左边2位数码管从“0-”到“9-”代表从第0个窗口变量到第9个窗口变量,也就是GuiWdData0依次到GuiWdData9。用S1和S5按键可以切换显示不同的窗口变量,按住S9不放可以观察到当前窗口变量的十六进制格式数据,松开S9按键后,又自动返回显示当前窗口变量的十进制数据。

该模板程序是基于坚鸿51学习板,现在跟大家分享这个程序,要让这10个窗口变量分别显示10,11,12,13,14,15,16,17,18,19这10个数,用S1按键可以切换显示从小往大的窗口变量号,用S5按键可以切换显示从大往小的窗口变量号。再强调一次,大家只需要关注主程序main函数的初始化区域就可以了,其它的代码请直接复制过来,不用理解。比如:

void main() //主程序

{

//...初始化区域

while(1)

{

}

}

详细的源代码如下:

#include "REG52.H"

#define const_voice_short 40

#define const_key_time1 20

#define const_key_time2 20

#define const_key_time3 20

void initial(void);

void delay_short(unsigned int uiDelayShort);

void dig_hc595_drive(unsigned char ucDigStatusTemp16_09,unsigned char ucDigStatusTemp08_01);

void display_drive(void);

void display_service(void);

void hc595_drive(unsigned char ucLedStatusTemp16_09,unsigned char ucLedStatusTemp08_01);

void T0_time(void);

void key_service(void);

void key_scan(void);

sbit beep_dr=P2^7;

sbit key_sr1=P0^0;

sbit key_sr2=P0^1;

sbit key_sr3=P0^2;

sbit key_gnd_dr=P0^4;

sbit led_dr=P3^5;

sbit dig_hc595_sh_dr=P2^0;

sbit dig_hc595_st_dr=P2^1;

sbit dig_hc595_ds_dr=P2^2;

sbit hc595_sh_dr=P2^3;

sbit hc595_st_dr=P2^4;

sbit hc595_ds_dr=P2^5;

unsigned char GucKeySec=0;

unsigned char GucKey3Sr=1;

unsigned int GuiVoiceCnt=0;

unsigned char GucVoiceStart=0;

unsigned char GucDigShow8;

unsigned char GucDigShow7;

unsigned char GucDigShow6;

unsigned char GucDigShow5;

unsigned char GucDigShow4;

unsigned char GucDigShow3;

unsigned char GucDigShow2;

unsigned char GucDigShow1;

unsigned char GucDisplayUpdate=1;

unsigned char GucWd=0;

unsigned int GuiWdData0=0;

unsigned int GuiWdData1=0;

unsigned int GuiWdData2=0;

unsigned int GuiWdData3=0;

unsigned int GuiWdData4=0;

unsigned int GuiWdData5=0;

unsigned int GuiWdData6=0;

unsigned int GuiWdData7=0;

unsigned int GuiWdData8=0;

unsigned int GuiWdData9=0;

code unsigned char dig_table[]=

{

0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40,

};

void main() //主程序

{

/*---C语言学习区域的开始---------------------------------------------------------------------------*/

GuiWdData0=10; //把10这个数值放到窗口变量0里面显示

GuiWdData1=11; //把11这个数值放到窗口变量1里面显示

GuiWdData2=12; //把12这个数值放到窗口变量2里面显示

GuiWdData3=13; //把13这个数值放到窗口变量3里面显示

GuiWdData4=14; //把14这个数值放到窗口变量4里面显示

GuiWdData5=15; //把15这个数值放到窗口变量5里面显示

GuiWdData6=16; //把16这个数值放到窗口变量6里面显示

GuiWdData7=17; //把17这个数值放到窗口变量7里面显示

GuiWdData8=18; //把18这个数值放到窗口变量8里面显示

GuiWdData9=19; //把19这个数值放到窗口变量9里面显示

/*---C语言学习区域的结束---------------------------------------------------------------------------*/

while(1)

{

initial();

key_service();

display_service();

}

}

void display_service(void)

{

static unsigned char SucLedStatus16_09=0;

static unsigned char SucLedStatus08_01=0;

static unsigned int SinWdDataTemp=0;

if(1==GucDisplayUpdate)

{

GucDisplayUpdate=0;

switch(GucWd)

{

case 0:

GucDigShow8=0;

SinWdDataTemp=GuiWdData0;

break;

case 1:

GucDigShow8=1;

SinWdDataTemp=GuiWdData1;

break;

case 2:

GucDigShow8=2;

SinWdDataTemp=GuiWdData2;

break;

case 3:

GucDigShow8=3;

SinWdDataTemp=GuiWdData3;

break;

case 4:

GucDigShow8=4;

SinWdDataTemp=GuiWdData4;

break;

case 5:

GucDigShow8=5;

SinWdDataTemp=GuiWdData5;

break;

case 6:

GucDigShow8=6;

SinWdDataTemp=GuiWdData6;

break;

case 7:

GucDigShow8=7;

SinWdDataTemp=GuiWdData7;

break;

case 8:

GucDigShow8=8;

SinWdDataTemp=GuiWdData8;

break;

case 9:

GucDigShow8=9;

SinWdDataTemp=GuiWdData9;

break;

}

GucDigShow7=17;

GucDigShow6=16;

if(1==GucKey3Sr)

{

if(SinWdDataTemp>=10000)

{

GucDigShow5=SinWdDataTemp/10000;

}

else

{

GucDigShow5=16;

}

if(SinWdDataTemp>=1000)

{

GucDigShow4=SinWdDataTemp%10000/1000;

}

else

{

GucDigShow4=16;

}

if(SinWdDataTemp>=100)

{

GucDigShow3=SinWdDataTemp%1000/100;

}

else

{

GucDigShow3=16;

}

if(SinWdDataTemp>=10)

{

GucDigShow2=SinWdDataTemp%100/10;

}

else

{

GucDigShow2=16;

}

GucDigShow1=SinWdDataTemp%10;

}

else

{

GucDigShow5=16;

if(SinWdDataTemp>=0x1000)

{

GucDigShow4=SinWdDataTemp/0x1000;

}

else

{

GucDigShow4=16;

}

if(SinWdDataTemp>=0x0100)

{

GucDigShow3=SinWdDataTemp%0x1000/0x0100;

}

else

{

GucDigShow3=16;

}

if(SinWdDataTemp>=0x0010)

{

GucDigShow2=SinWdDataTemp%0x0100/0x0010;

}

else

{

GucDigShow2=16;

}

GucDigShow1=SinWdDataTemp%0x0010;

}

SucLedStatus16_09=SinWdDataTemp>>8;

SucLedStatus08_01=SinWdDataTemp;

hc595_drive(SucLedStatus16_09,SucLedStatus08_01);

}

}

void key_scan(void)

{

static unsigned int SuiKeyTimeCnt1=0;

static unsigned char SucKeyLock1=0;

static unsigned int SuiKeyTimeCnt2=0;

static unsigned char SucKeyLock2=0;

static unsigned int SuiKey3Cnt1=0;

static unsigned int SuiKey3Cnt2=0;

if(1==key_sr1)

{

SucKeyLock1=0;

SuiKeyTimeCnt1=0;

}

else if(0==SucKeyLock1)

{

SuiKeyTimeCnt1++;

if(SuiKeyTimeCnt1>const_key_time1)

{

SuiKeyTimeCnt1=0;

SucKeyLock1=1;

GucKeySec=1;

}

}

if(1==key_sr2)

{

SucKeyLock2=0;

SuiKeyTimeCnt2=0;

}

else if(0==SucKeyLock2)

{

SuiKeyTimeCnt2++;

if(SuiKeyTimeCnt2>const_key_time2)

{

SuiKeyTimeCnt2=0;

SucKeyLock2=1;

GucKeySec=2;

}

}

if(1==key_sr3)

{

SuiKey3Cnt1=0;

SuiKey3Cnt2++;

if(SuiKey3Cnt2>const_key_time3)

{

SuiKey3Cnt2=0;

GucKey3Sr=1;

}

}

else

{

SuiKey3Cnt2=0;

SuiKey3Cnt1++;

if(SuiKey3Cnt1>const_key_time3)

{

SuiKey3Cnt1=0;

GucKey3Sr=0;

}

}

}

void key_service(void)

{

static unsigned char SucKey3SrRecord=1;

if(GucKey3Sr!=SucKey3SrRecord)

{

SucKey3SrRecord=GucKey3Sr;

GucDisplayUpdate=1;

}

switch(GucKeySec)

{

case 1:

GucWd++;

if(GucWd>9)

{

GucWd=9;

}

GucDisplayUpdate=1;

GuiVoiceCnt=const_voice_short;

GucVoiceStart=1;

GucKeySec=0;

break;

case 2:

GucWd--;

if(GucWd>9)

{

GucWd=0;

}

GucDisplayUpdate=1;

GuiVoiceCnt=const_voice_short;

GucVoiceStart=1;

GucKeySec=0;

break;

}

}

void display_drive()

{

static unsigned char SucDigShowTemp=0;

static unsigned char SucDisplayDriveStep=1;

switch(SucDisplayDriveStep)

{

case 1:

SucDigShowTemp=dig_table[GucDigShow1];

dig_hc595_drive(SucDigShowTemp,0xfe);

break;

case 2:

SucDigShowTemp=dig_table[GucDigShow2];

dig_hc595_drive(SucDigShowTemp,0xfd);

break;

case 3:

SucDigShowTemp=dig_table[GucDigShow3];

dig_hc595_drive(SucDigShowTemp,0xfb);

break;

case 4:

SucDigShowTemp=dig_table[GucDigShow4];

dig_hc595_drive(SucDigShowTemp,0xf7);

break;

case 5:

SucDigShowTemp=dig_table[GucDigShow5];

dig_hc595_drive(SucDigShowTemp,0xef);

break;

case 6:

SucDigShowTemp=dig_table[GucDigShow6];

dig_hc595_drive(SucDigShowTemp,0xdf);

break;

case 7:

SucDigShowTemp=dig_table[GucDigShow7];

dig_hc595_drive(SucDigShowTemp,0xbf);

break;

case 8:

SucDigShowTemp=dig_table[GucDigShow8];

dig_hc595_drive(SucDigShowTemp,0x7f);

break;

}

SucDisplayDriveStep++;

if(SucDisplayDriveStep>8)

{

SucDisplayDriveStep=1;

}

}

void dig_hc595_drive(unsigned char ucDigStatusTemp16_09,unsigned char ucDigStatusTemp08_01)

{

unsigned char i;

unsigned char ucTempData;

dig_hc595_sh_dr=0;

dig_hc595_st_dr=0;

ucTempData=ucDigStatusTemp16_09;

for(i=0;i<8;i++)

{

if(ucTempData>=0x80)dig_hc595_ds_dr=1;

else dig_hc595_ds_dr=0;

dig_hc595_sh_dr=0;

delay_short(1);

dig_hc595_sh_dr=1;

delay_short(1);

ucTempData=ucTempData<<1;

}

ucTempData=ucDigStatusTemp08_01;

for(i=0;i<8;i++)

{

if(ucTempData>=0x80)dig_hc595_ds_dr=1;

else dig_hc595_ds_dr=0;

dig_hc595_sh_dr=0;

delay_short(1);

dig_hc595_sh_dr=1;

delay_short(1);

ucTempData=ucTempData<<1;

}

dig_hc595_st_dr=0;

delay_short(1);

dig_hc595_st_dr=1;

delay_short(1);

dig_hc595_sh_dr=0;

dig_hc595_st_dr=0;

dig_hc595_ds_dr=0;

}

void hc595_drive(unsigned char ucLedStatusTemp16_09,unsigned char ucLedStatusTemp08_01)

{

unsigned char i;

unsigned char ucTempData;

hc595_sh_dr=0;

hc595_st_dr=0;

ucTempData=ucLedStatusTemp16_09;

for(i=0;i<8;i++)

{

if(ucTempData>=0x80)hc595_ds_dr=1;

else hc595_ds_dr=0;

hc595_sh_dr=0;

delay_short(1);

hc595_sh_dr=1;

delay_short(1);

ucTempData=ucTempData<<1;

}

ucTempData=ucLedStatusTemp08_01;

for(i=0;i<8;i++)

{

if(ucTempData>=0x80)hc595_ds_dr=1;

else hc595_ds_dr=0;

hc595_sh_dr=0;

delay_short(1);

hc595_sh_dr=1;

delay_short(1);

ucTempData=ucTempData<<1;

}

hc595_st_dr=0;

delay_short(1);

hc595_st_dr=1;

delay_short(1);

hc595_sh_dr=0;

hc595_st_dr=0;

hc595_ds_dr=0;

}

void T0_time(void) interrupt 1

{

TF0=0;

TR0=0;

if(1==GucVoiceStart)

{

if(GuiVoiceCnt!=0)

{

GuiVoiceCnt--;

beep_dr=0;

}

else

{

beep_dr=1;

GucVoiceStart=0;

}

}

key_scan();

display_drive();

TH0=0xfe;

TL0=0x0b;

TR0=1;

}

void delay_short(unsigned int uiDelayShort)

{

static unsigned int i;

for(i=0;i

}

void initial(void)

{

static unsigned char SucInitialLock=0;

if(0==SucInitialLock)

{

SucInitialLock=1;

key_gnd_dr=0;

led_dr=0;

beep_dr=1;

TMOD=0x01;

TH0=0xfe;

TL0=0x0b;

EA=1;

ET0=1;

TR0=1;

}

}

下节预告:三种类型变量的定义与赋值语句。目前,几乎所有的初学者在学习和上机练习C语言的时候,都是在电脑上安装VC这个调试软件,在源代码里只要调用打印语句printf就可以观察到不同的变量结果,挺方便的。但是现在我要提出另外一种方法,学习单片机的C语言,不一定非要用VC调试软件,也可以直接在坚鸿51学习板上学习和上机练习的。我可以做一个调试模板程序给初学者使用,利用8位数码管和16个LED灯来显示不同的变量结果,利用3个按键来切换显示不同的变量,这样就能达到类似在VC平台下用printf语句来观察变量的效果。甚至我个人认为这样比用VC调试的效果还更加直观。现在重点介绍这个模板程序的使用。

在模板程序里,初学者只需要在主程序的初始化区域填入自己练习的C语言代码,最后把需要观察的变量赋值给窗口变量就可以了,其它部分的代码属于模板的监控调试代码,大家暂时不用读懂它,直接复制过来就可以了。上述所谓的“赋值”,就是“=”这个语句,它表面上像我们平时用的等于号,实际上不是等于号,而是代表“给”的意思,把“=”符号右边的数复制一份给左边的变量,比如“a=36;”就是代表把36这个数值复制一份给变量a,执行这条指令后,a就等于36了。这里的分号“;”代表一条程序指令的结束。窗口变量有几个?有哪些?一共有10个,分别是GuiWdData0,GuiWdData1,GuiWdData2,GuiWdData3,GuiWdData4,GuiWdData5,GuiWdData6,GuiWdData7,GuiWdData8,GuiWdData9。这10个窗口变量是给大家调试专用的,8位数码管可以切换显示10个窗口变量,最左边2位数码管代表窗口变量号,剩下6位数码管显示十进制的窗口变量数值,另外16个LED实时显示此数据的二进制格式。最左边2位数码管从“0-”到“9-”代表从第0个窗口变量到第9个窗口变量,也就是GuiWdData0依次到GuiWdData9。用S1和S5按键可以切换显示不同的窗口变量,按住S9不放可以观察到当前窗口变量的十六进制格式数据,松开S9按键后,又自动返回显示当前窗口变量的十进制数据。

该模板程序是基于坚鸿51学习板,现在跟大家分享这个程序,要让这10个窗口变量分别显示10,11,12,13,14,15,16,17,18,19这10个数,用S1按键可以切换显示从小往大的窗口变量号,用S5按键可以切换显示从大往小的窗口变量号。再强调一次,大家只需要关注主程序main函数的初始化区域就可以了,其它的代码请直接复制过来,不用理解。比如:

void main() //主程序

{

//...初始化区域

while(1)

{

}

}

详细的源代码如下:

#include "REG52.H"

#define const_voice_short 40

#define const_key_time1 20

#define const_key_time2 20

#define const_key_time3 20

void initial(void);

void delay_short(unsigned int uiDelayShort);

void dig_hc595_drive(unsigned char ucDigStatusTemp16_09,unsigned char ucDigStatusTemp08_01);

void display_drive(void);

void display_service(void);

void hc595_drive(unsigned char ucLedStatusTemp16_09,unsigned char ucLedStatusTemp08_01);

void T0_time(void);

void key_service(void);

void key_scan(void);

sbit beep_dr=P2^7;

sbit key_sr1=P0^0;

sbit key_sr2=P0^1;

sbit key_sr3=P0^2;

sbit key_gnd_dr=P0^4;

sbit led_dr=P3^5;

sbit dig_hc595_sh_dr=P2^0;

sbit dig_hc595_st_dr=P2^1;

sbit dig_hc595_ds_dr=P2^2;

sbit hc595_sh_dr=P2^3;

sbit hc595_st_dr=P2^4;

sbit hc595_ds_dr=P2^5;

unsigned char GucKeySec=0;

unsigned char GucKey3Sr=1;

unsigned int GuiVoiceCnt=0;

unsigned char GucVoiceStart=0;

unsigned char GucDigShow8;

unsigned char GucDigShow7;

unsigned char GucDigShow6;

unsigned char GucDigShow5;

unsigned char GucDigShow4;

unsigned char GucDigShow3;

unsigned char GucDigShow2;

unsigned char GucDigShow1;

unsigned char GucDisplayUpdate=1;

unsigned char GucWd=0;

unsigned int GuiWdData0=0;

unsigned int GuiWdData1=0;

unsigned int GuiWdData2=0;

unsigned int GuiWdData3=0;

unsigned int GuiWdData4=0;

unsigned int GuiWdData5=0;

unsigned int GuiWdData6=0;

unsigned int GuiWdData7=0;

unsigned int GuiWdData8=0;

unsigned int GuiWdData9=0;

code unsigned char dig_table[]=

{

0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40,

};

void main() //主程序

{

/*---C语言学习区域的开始---------------------------------------------------------------------------*/

GuiWdData0=10; //把10这个数值放到窗口变量0里面显示

GuiWdData1=11; //把11这个数值放到窗口变量1里面显示

GuiWdData2=12; //把12这个数值放到窗口变量2里面显示

GuiWdData3=13; //把13这个数值放到窗口变量3里面显示

GuiWdData4=14; //把14这个数值放到窗口变量4里面显示

GuiWdData5=15; //把15这个数值放到窗口变量5里面显示

GuiWdData6=16; //把16这个数值放到窗口变量6里面显示

GuiWdData7=17; //把17这个数值放到窗口变量7里面显示

GuiWdData8=18; //把18这个数值放到窗口变量8里面显示

GuiWdData9=19; //把19这个数值放到窗口变量9里面显示

/*---C语言学习区域的结束---------------------------------------------------------------------------*/

while(1)

{

initial();

key_service();

display_service();

}

}

void display_service(void)

{

static unsigned char SucLedStatus16_09=0;

static unsigned char SucLedStatus08_01=0;

static unsigned int SinWdDataTemp=0;

if(1==GucDisplayUpdate)

{

GucDisplayUpdate=0;

switch(GucWd)

{

case 0:

GucDigShow8=0;

SinWdDataTemp=GuiWdData0;

break;

case 1:

GucDigShow8=1;

SinWdDataTemp=GuiWdData1;

break;

case 2:

GucDigShow8=2;

SinWdDataTemp=GuiWdData2;

break;

case 3:

GucDigShow8=3;

SinWdDataTemp=GuiWdData3;

break;

case 4:

GucDigShow8=4;

SinWdDataTemp=GuiWdData4;

break;

case 5:

GucDigShow8=5;

SinWdDataTemp=GuiWdData5;

break;

case 6:

GucDigShow8=6;

SinWdDataTemp=GuiWdData6;

break;

case 7:

GucDigShow8=7;

SinWdDataTemp=GuiWdData7;

break;

case 8:

GucDigShow8=8;

SinWdDataTemp=GuiWdData8;

break;

case 9:

GucDigShow8=9;

SinWdDataTemp=GuiWdData9;

break;

}

GucDigShow7=17;

GucDigShow6=16;

if(1==GucKey3Sr)

{

if(SinWdDataTemp>=10000)

{

GucDigShow5=SinWdDataTemp/10000;

}

else

{

GucDigShow5=16;

}

if(SinWdDataTemp>=1000)

{

GucDigShow4=SinWdDataTemp%10000/1000;

}

else

{

GucDigShow4=16;

}

if(SinWdDataTemp>=100)

{

GucDigShow3=SinWdDataTemp%1000/100;

}

else

{

GucDigShow3=16;

}

if(SinWdDataTemp>=10)

{

GucDigShow2=SinWdDataTemp%100/10;

}

else

{

GucDigShow2=16;

}

GucDigShow1=SinWdDataTemp%10;

}

else

{

GucDigShow5=16;

if(SinWdDataTemp>=0x1000)

{

GucDigShow4=SinWdDataTemp/0x1000;

}

else

{

GucDigShow4=16;

}

if(SinWdDataTemp>=0x0100)

{

GucDigShow3=SinWdDataTemp%0x1000/0x0100;

}

else

{

GucDigShow3=16;

}

if(SinWdDataTemp>=0x0010)

{

GucDigShow2=SinWdDataTemp%0x0100/0x0010;

}

else

{

GucDigShow2=16;

}

GucDigShow1=SinWdDataTemp%0x0010;

}

SucLedStatus16_09=SinWdDataTemp>>8;

SucLedStatus08_01=SinWdDataTemp;

hc595_drive(SucLedStatus16_09,SucLedStatus08_01);

}

}

void key_scan(void)

{

static unsigned int SuiKeyTimeCnt1=0;

static unsigned char SucKeyLock1=0;

static unsigned int SuiKeyTimeCnt2=0;

static unsigned char SucKeyLock2=0;

static unsigned int SuiKey3Cnt1=0;

static unsigned int SuiKey3Cnt2=0;

if(1==key_sr1)

{

SucKeyLock1=0;

SuiKeyTimeCnt1=0;

}

else if(0==SucKeyLock1)

{

SuiKeyTimeCnt1++;

if(SuiKeyTimeCnt1>const_key_time1)

{

SuiKeyTimeCnt1=0;

SucKeyLock1=1;

GucKeySec=1;

}

}

if(1==key_sr2)

{

SucKeyLock2=0;

SuiKeyTimeCnt2=0;

}

else if(0==SucKeyLock2)

{

SuiKeyTimeCnt2++;

if(SuiKeyTimeCnt2>const_key_time2)

{

SuiKeyTimeCnt2=0;

SucKeyLock2=1;

GucKeySec=2;

}

}

if(1==key_sr3)

{

SuiKey3Cnt1=0;

SuiKey3Cnt2++;

if(SuiKey3Cnt2>const_key_time3)

{

SuiKey3Cnt2=0;

GucKey3Sr=1;

}

}

else

{

SuiKey3Cnt2=0;

SuiKey3Cnt1++;

if(SuiKey3Cnt1>const_key_time3)

{

SuiKey3Cnt1=0;

GucKey3Sr=0;

}

}

}

void key_service(void)

{

static unsigned char SucKey3SrRecord=1;

if(GucKey3Sr!=SucKey3SrRecord)

{

SucKey3SrRecord=GucKey3Sr;

GucDisplayUpdate=1;

}

switch(GucKeySec)

{

case 1:

GucWd++;

if(GucWd>9)

{

GucWd=9;

}

GucDisplayUpdate=1;

GuiVoiceCnt=const_voice_short;

GucVoiceStart=1;

GucKeySec=0;

break;

case 2:

GucWd--;

if(GucWd>9)

{

GucWd=0;

}

GucDisplayUpdate=1;

GuiVoiceCnt=const_voice_short;

GucVoiceStart=1;

GucKeySec=0;

break;

}

}

void display_drive()

{

static unsigned char SucDigShowTemp=0;

static unsigned char SucDisplayDriveStep=1;

switch(SucDisplayDriveStep)

{

case 1:

SucDigShowTemp=dig_table[GucDigShow1];

dig_hc595_drive(SucDigShowTemp,0xfe);

break;

case 2:

SucDigShowTemp=dig_table[GucDigShow2];

dig_hc595_drive(SucDigShowTemp,0xfd);

break;

case 3:

SucDigShowTemp=dig_table[GucDigShow3];

dig_hc595_drive(SucDigShowTemp,0xfb);

break;

case 4:

SucDigShowTemp=dig_table[GucDigShow4];

dig_hc595_drive(SucDigShowTemp,0xf7);

break;

case 5:

SucDigShowTemp=dig_table[GucDigShow5];

dig_hc595_drive(SucDigShowTemp,0xef);

break;

case 6:

SucDigShowTemp=dig_table[GucDigShow6];

dig_hc595_drive(SucDigShowTemp,0xdf);

break;

case 7:

SucDigShowTemp=dig_table[GucDigShow7];

dig_hc595_drive(SucDigShowTemp,0xbf);

break;

case 8:

SucDigShowTemp=dig_table[GucDigShow8];

dig_hc595_drive(SucDigShowTemp,0x7f);

break;

}

SucDisplayDriveStep++;

if(SucDisplayDriveStep>8)

{

SucDisplayDriveStep=1;

}

}

void dig_hc595_drive(unsigned char ucDigStatusTemp16_09,unsigned char ucDigStatusTemp08_01)

{

unsigned char i;

unsigned char ucTempData;

dig_hc595_sh_dr=0;

dig_hc595_st_dr=0;

ucTempData=ucDigStatusTemp16_09;

for(i=0;i<8;i++)

{

if(ucTempData>=0x80)dig_hc595_ds_dr=1;

else dig_hc595_ds_dr=0;

dig_hc595_sh_dr=0;

delay_short(1);

dig_hc595_sh_dr=1;

delay_short(1);

ucTempData=ucTempData<<1;

}

ucTempData=ucDigStatusTemp08_01;

for(i=0;i<8;i++)

{

if(ucTempData>=0x80)dig_hc595_ds_dr=1;

else dig_hc595_ds_dr=0;

dig_hc595_sh_dr=0;

delay_short(1);

dig_hc595_sh_dr=1;

delay_short(1);

ucTempData=ucTempData<<1;

}

dig_hc595_st_dr=0;

delay_short(1);

dig_hc595_st_dr=1;

delay_short(1);

dig_hc595_sh_dr=0;

dig_hc595_st_dr=0;

dig_hc595_ds_dr=0;

}

void hc595_drive(unsigned char ucLedStatusTemp16_09,unsigned char ucLedStatusTemp08_01)

{

unsigned char i;

unsigned char ucTempData;

hc595_sh_dr=0;

hc595_st_dr=0;

ucTempData=ucLedStatusTemp16_09;

for(i=0;i<8;i++)

{

if(ucTempData>=0x80)hc595_ds_dr=1;

else hc595_ds_dr=0;

hc595_sh_dr=0;

delay_short(1);

hc595_sh_dr=1;

delay_short(1);

ucTempData=ucTempData<<1;

}

ucTempData=ucLedStatusTemp08_01;

for(i=0;i<8;i++)

{

if(ucTempData>=0x80)hc595_ds_dr=1;

else hc595_ds_dr=0;

hc595_sh_dr=0;

delay_short(1);

hc595_sh_dr=1;

delay_short(1);

ucTempData=ucTempData<<1;

}

hc595_st_dr=0;

delay_short(1);

hc595_st_dr=1;

delay_short(1);

hc595_sh_dr=0;

hc595_st_dr=0;

hc595_ds_dr=0;

}

void T0_time(void) interrupt 1

{

TF0=0;

TR0=0;

if(1==GucVoiceStart)

{

if(GuiVoiceCnt!=0)

{

GuiVoiceCnt--;

beep_dr=0;

}

else

{

beep_dr=1;

GucVoiceStart=0;

}

}

key_scan();

display_drive();

TH0=0xfe;

TL0=0x0b;

TR0=1;

}

void delay_short(unsigned int uiDelayShort)

{

static unsigned int i;

for(i=0;i

}

void initial(void)

{

static unsigned char SucInitialLock=0;

if(0==SucInitialLock)

{

SucInitialLock=1;

key_gnd_dr=0;

led_dr=0;

beep_dr=1;

TMOD=0x01;

TH0=0xfe;

TL0=0x0b;

EA=1;

ET0=1;

TR0=1;

}

}

下节预告:三种类型变量的定义与赋值语句。

关键字:C语言  模板程序  单片机 引用地址:第10节:一个用来学习C语言的模板程序

上一篇:第11节:变量的定义与赋值语句
下一篇:第9节:程序从哪里开始,要到哪里去?

推荐阅读最新更新时间:2024-03-16 14:46

基于单片机DS18B20温度报警系统 无线蓝牙显示
一、系统方案 随着科学技术的不断发展带动着电子行业的地位越来越重,现在电子产品几乎在社会的各个领域都可以见到。这些技术的发展有效的带动着社会生产力的发展和信息化的提高,同时电子产品也越来越智能。 本设计采用AT89C51单片机为主控芯片,采用数字型防水温度传感器DS18B20制作温度检测报警器,通过四位数码管显示温度值,系统设立几个按键,可以通过按键进行设置温度的上、下限值,当所采集温度超过设定值时,系统会控制蜂鸣器和对应LED发出声光报警。这个设计简单、成本低、具有实用性。 二、硬件设计 原理图如下: 三、单片机软件设计 1、首先是串口初始化: void Uart_init() { TMOD=0x20;//定时器0工作
[单片机]
基于<font color='red'>单片机</font>DS18B20温度报警系统 无线蓝牙显示
基于单片机与FPGA可调延时模块的设计
  系统结构框图如图1。其硬件结构比较简单,主要由单片机P89C51RD、RS-232/TTL接口电路MAX232和可编程逻辑器件FPGA三部分组成。单片机P89C51RD2是上位PC机和FPGA的连接纽带,它通过并口发送数据给FPGA,另一边通过RS-232/TTL接口芯片与PC机进行串行通讯;PC机主要功能是实现延时调整的可视化操作;FPGA是延时调整处理的硬件实现,单片机将PC送过来的延时调整参数输入FPGA,FPGA在单片机的控制下对信号进行延迟处理,最后送入相应传输通道。某些系统使用现场存在较强的电磁干扰,模块的设计考虑信号隔离问题,故对串行接口进行了电气隔离,强化了PC机和模块通讯的安全系数。   延时模块正常上
[单片机]
基于<font color='red'>单片机</font>与FPGA可调延时模块的设计
PIC单片机之时钟设置
什么时钟? 首先我们先讲讲什么是时钟。时钟就是单片机的心脏。每跳动一下。整个单片机的各个电路就同步的动作一下。就好像我们做广播体操的时候 广播上喊的节拍1234 2234 3234。。。。然后我们全部的同学就按照这个节奏进行一个个动作。节拍越快我们动作越快。节拍越慢我们动作的越慢。 内部时钟和外部时钟? PIC单片机有许多型号可以设置成 用外部时钟(如外部接个4MHZ的石英晶振),也可以设置成用内部RC时钟。而且还有许多型号可以选择多种频率的时钟。 如 PICLF1823 内部时钟最高可以到达32MHZ 最低可以达到 31kHz. 这事实上提供了一条降低功耗的新路子。一般的单片机降低功耗常常用的睡眠,而睡眠期间CPU是什么都
[单片机]
PIC<font color='red'>单片机</font>之时钟设置
基于stm32单片机的模拟IIC时序
我下面要说的是基于stm32单片机的模拟IIC时序,以及是一些要注意的事项;结合自己所做的MMA7455加速度传感器,我把模拟IIC的源代码贴了出来,大家可以参考一下。 1.因为在IIC协议中,当总线空闲的时候,SDA和SCL都为高电平,所以硬件电路中SDA和SCL引脚都要接上拉电阻。 2.注意开始信号,停止信号,响应信号,非响应信号的时序,特别是要留意高低电平时间的延时: 3.应答信号分为主机应答和从机应答: 主机应答是在主机从从机中读取数据时每次读取完一个字节的数据后主机给从机的一个应答信号,表示主机已收到数据了。 从机应答是指主机给从机发送数据时从机给主机的应答,给一个应答就代表从机已经收到了数据,为主机
[单片机]
基于stm32<font color='red'>单片机</font>的模拟IIC时序
51单片机实现利用AT24C02进行掉电后的数据保存
一、使用proteus绘制简单的电路图,用于后续仿真 关于IIC的读写: 二、编写程序 /******************************************************************************************************************** ---- @Project: AT24C02 ---- @File: main.c ---- @Edit: ZHQ ---- @Version: V1.0 ---- @CreationTime: 20200721 ---- @ModifiedTime:
[单片机]
51<font color='red'>单片机</font>实现利用AT24C02进行掉电后的数据保存
单片机音乐盒设计
课程设计要求: 1.利用I/O口产生一定频率的方波,驱动蜂鸣器,发出不同的音调,从而演奏乐曲(最少三首乐曲,每首不少于30秒) 2.采用LCD显示信息 3.开机时有英文欢迎提示字符,播放时显示歌曲序号(或名称) 4.可通过功能键选择乐曲,暂停,播放。 5.选作内容:显示乐曲播放时间或剩余时间 硬件电路:本设计中用到了89C51单片机,4*4键盘,蜂鸣器,16*2 LCD,七段 显示数码管LED。(硬件电路原理图附于后页) 原理说明:当键盘有键按下时,判断键值,启动计数器T0,产生一定频率的脉冲,驱动蜂鸣器,放出乐曲。同时启动定时器T1,显示乐曲播放的时间,并驱动LCD,显示歌曲号及播放时间。也可在LED显示歌曲号。
[单片机]
树莓派自主MCU级产品Pico问市,性能更高,I/O 更灵活
日前,树莓派宣布推出首款MCU级产品:树莓派 Pico,售价仅为4美元,基于RP2040 MCU构建,这是树莓派开发的全新芯片。无论您是要寻找用于深层开发的独立开发板还是树莓派计算机的配套产品,还是要使用微控制器迈出第一步,这都是适合您的开发板。 现在已经可以从授权经销商在线购买树莓派 Pico。 微型计算机和微控制器 我们最喜欢的许多项目,从黄瓜分拣机到高空气球,都将树莓派连接到了物理世界:树莓派上运行的软件读取传感器,执行计算,网络对话及驱动执行器。这种桥接软件和硬件世界的能力为树莓派持久流行做出了贡献,迄今为止已售出3700万台。 但是树莓派也有局限性:即使在最低功率模式下,树莓派Zero功耗约100毫瓦;树
[嵌入式]
树莓派自主<font color='red'>MCU</font>级产品Pico问市,性能更高,I/O 更灵活
座舱域控制器硬件架构方案:SoC + MCU
座舱域控制器是什么 座舱域控制器(Cabin Domain Controller)是一种用于航空飞机中的电子系统,用于集中管理和控制飞机内部的各种功能和系统。它是飞机电气系统的关键组件之一。 座舱域控制器的主要功能是将飞机上的各种设备和系统进行集成和协调,以实现对飞机座舱内部的各种功能和服务的控制和管理。它承担了多个子系统的集中控制和管理任务,包括各种显示系统、通信系统、音视频系统、照明系统、环境控制系统、安全系统等。座舱域控制器通过接收和处理来自这些子系统的命令和数据,控制和协调它们的工作状态,并向座舱内的用户提供各种功能和服务。 座舱域控制器还负责监测和诊断座舱各个子系统的状态和健康状况。它可以通过传感器和数据总线获取各个
[嵌入式]
座舱域控制器硬件架构方案:SoC + <font color='red'>MCU</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved