您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 单片机C语言程序设计实训99例
《单片机C语言程序设计实训99例》—青岛大学1《单片机C语言程序设计实训99例》案例第01篇基础程序设计09555定时器实验/*名称:555定时器实验说明:调节外部电阻RV1可改变延时值,从而影响灯点亮延时和发声延时。*/#includereg51.h#defineucharunsignedchar#defineuintunsignedintsbitSignal=P1^0;sbitBEEP=P3^7;//延时voidDelayMS(uintms){uchari;while(ms--)for(i=0;i120;i++);}//主程序voidmain(){while(1){if(Signal){BEEP=~BEEP;DelayMS(3);}}}10BCD译码数码管显示数字/*名称:BCD译码数码管显示数字说明:BCD码经4511译码后输出数码管段码,实现数码管显示(4511驱动数码管)。*/#includereg51.h#defineucharunsignedchar#defineuintunsignedint//数码管位码ucharcodeDSY_Index[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};《单片机C语言程序设计实训99例》—青岛大学2//待显示数字(10为不显示)ucharcodeBCD_CODE[]={2,0,1,0,10,3,10,5};//延时voidDelayMS(uintms){uchari;while(ms--)for(i=0;i120;i++);}//主程序voidmain(){uchark;while(1){for(k=0;k8;k++){P2=DSY_Index[k];P1=BCD_CODE[k];DelayMS(1);}}}11MAX7221控制数码管动态显示/*名称:MAX7221控制数码管动态显示说明:本例用MAX7221控制8只数码管动态显示,这样大大减少了单片机引脚和机器时间的占用。*/#includereg51.h#includeintrins.h#defineucharunsignedchar#defineuintunsignedintsbitDIN=P2^0;sbitCSB=P2^1;sbitCLK=P2^2;ucharDisp_Buffer[]={2,0,1,5,10,5,10,9};//显示缓冲,10为“-”//延时voidDelayMS(uintms){uchari;while(ms--)for(i=0;i120;i++);}//写数据voidWrite(ucharAddr,ucharDat)《单片机C语言程序设计实训99例》—青岛大学3{uchari;CSB=0;for(i=0;i8;i++){CLK=0;Addr=1;DIN=CY;CLK=1;_nop_();_nop_();CLK=0;}for(i=0;i8;i++){CLK=0;Dat=1;DIN=CY;CLK=1;_nop_();_nop_();CLK=0;}CSB=1;}//MAX7221初始化voidInitialise(){Write(0x09,0xff);//编码模式地址0x090x00~0xff,为1的则位选通Write(0x0a,0x07);//亮度地址0x0a0x00~0x0f,0x0f最亮Write(0x0b,0x07);//扫描数码管个数地址0x0b,最多扫描8只数码管Write(0x0c,0x01);//工作模式地址0x0c0x00:关闭;0x01:正常}//主程序voidmain(){uchari;Initialise();//初始化DelayMS(1);for(i=0;i8;i++)//显示8个数码管{Write(i+1,Disp_Buffer[i]);}while(1);}12LCD1602字符液晶滚动演示程序//main.c/*名称:LCD1602字符液晶滚动演示程序说明:K1~K3按钮分别实现液晶垂直或水平滚动显示及暂停与继续控制。*/#includereg51.h#includestring.h#defineucharunsignedchar《单片机C语言程序设计实训99例》—青岛大学4#defineuintunsignedintvoidInitialize_LCD();voidDelayMS(uintms);voidShowString(uchar,uchar,uchar*);sbitK1=P3^0;sbitK2=P3^1;sbitK3=P3^2;ucharcodePrompt[]=PressK1-K3ToStartDemoProg;//待滚动显示的信息段落,每行不超过80个字符,共6行ucharconstLine_Count=6;ucharcodeMsg[][80]={ManyCADusersdismissschematiccaptureasanecessaryevilinthe,processofcreatingPCBlayoutbutwehavealwaysdisputedthispoint,ofview.WithPCBlayoutnowofferingautomationofbothcomponent,canoftenbethemosttimeconsumingelementoftheexercise.,Andifyouusecircuitsimulationtodevelopyourideas,,youaregoingtospendevenmoretimeworkingontheschematic.};//显示缓冲(2行)ucharDisp_Buffer[32];//垂直滚动显示voidV_Scroll_Display(){uchari,j,k=0;uchar*p=Msg[0];uchar*q=Msg[Line_Count]+strlen(Msg[Line_Count]);//以下仅使用显示缓冲的前16字节空间while(pq){for(i=0;i16&&pq;i++){//消除显示缓冲中待显示行首尾可能出现的空格if((i==0||i==15)&&*p=='')p++;if(*p!='\0'){Disp_Buffer[i]=*p++;}else{if(++kLine_Count)break;p=Msg[k];//p指向下一串的首地址Disp_Buffer[i]=*p++;}}//不足16个字符时空格补充《单片机C语言程序设计实训99例》—青岛大学5for(j=i;j16;j++)Disp_Buffer[j]='';//垂直滚动显示while(F0)DelayMS(5);ShowString(0,0,);DelayMS(150);while(F0)DelayMS(5);ShowString(0,1,Disp_Buffer);DelayMS(150);while(F0)DelayMS(5);ShowString(0,0,Disp_Buffer);ShowString(0,1,);DelayMS(150);}//最后清屏ShowString(0,0,);ShowString(0,1,);}//水平滚动显示voidH_Scroll_Display(){uchari,j,k=0,L=0;uchar*p=Msg[0];uchar*q=Msg[Line_Count]+strlen(Msg[Line_Count]);//将32个字符的显示缓冲前16个字符设为空格for(i=0;i16;i++)Disp_Buffer[i]='';while(pq){//忽略缓冲中首尾可能出现的空格if((i==16||i==31)&&*p=='')p++;for(i=16;i32&&pq;i++){if(*p!='\0'){Disp_Buffer[i]=*p++;}else{if(++kLine_Count)break;p=Msg[k];//p指向下一串的首地址Disp_Buffer[i]=*p++;}}//不足32个字符时空格补充for(j=i;j32;j++)Disp_Buffer[j]='';//水平滚动显示《单片机C语言程序设计实训99例》—青岛大学6for(i=0;i=16;i++){while(F0)DelayMS(5);ShowString(0,L,Disp_Buffer+i);while(F0)DelayMS(5);DelayMS(20);}L=(L==0)?1:0;//行号在0,1间交替DelayMS(300);}//如果显示结束时停留在第0行,则清除第1行的内容if(L==1)ShowString(0,1,);}//外部中断0,由K3控制暂停与继续显示voidEX_INT0()interrupt0{F0=!F0;//暂停与继续显示控制标志位}//主程序voidmain(){uintCount=0;IE=0x81;//允许外部中断0IT0=1;//下降沿触发F0=0;//暂停与继续显示控制标志位Initialize_LCD();ShowString(0,0,Prompt);ShowString(0,1,Prompt+16);while(1){if(K1==0){V_Scroll_Display();DelayMS(300);}elseif(K2==0){H_Scroll_Display();DelayMS(300);}}}//LCD1602.c/*名称:液晶控制与显示程序《单片机C语言程序设计实训99例》—青岛大学7说明:本程序是通用的1602液晶控制程序。*/#includereg51.h#includeintrins.h#defineucharunsignedchar#defineuintunsignedintsbitRS=P2^0;sbitRW=P2^1;sbitEN=P2^2;//延时voidDelayMS(uintms){uchari;while(ms--)for(i=0;i120;i++);}//忙检查ucharBusy_Check(){ucharLCD_Status;RS=0;//寄存器选择RW=1;//读状态寄存器EN=1;//开始读DelayMS(1);LCD_Status=P0;EN=0;returnLCD_Status;}//写LCD命令voidWrite_LCD_Command(ucharcmd){while((Busy_Check()&0x80)==0x80);//忙等待RS=0;//选择命令寄存器RW=0;//写EN=0;P0=cmd;EN=1;DelayMS(1);EN=0;}//发送数据voidWrite_LCD_Data(uchardat){while((Busy_Check()&0x80)==0x80);//忙等待RS=1;RW=0;EN=0;P0=dat;EN=1;DelayMS(1);EN=0;}//LCD初始化voidInitialize_LCD(){《单片机C语言程序设计实训99例》—青岛大学8Write_LCD_Command(0x38);DelayMS(1);Write_LCD_Command(0x01);DelayMS(1);//清屏Write_LCD_Command(0x06);DelayMS(1);//字符进入模式:屏幕不动,字符后移Write_LCD_Command(0x0c);DelayMS(1);//显示开,光标关}//显示字符串voidShowString(ucharx,uchary,uchar*str){uchari=0;if(y==0)Write_LCD_Command(0x80|x);//设置显示起始位置if(y==1)Write_LCD_Command(0xc0|x);for(i=0;i16;i++)//输出字符串{Write_LCD_Data(str[i]);}}1319用A
本文标题:单片机C语言程序设计实训99例
链接地址:https://www.777doc.com/doc-6076498 .html