1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 单片机c语言程序设计实训报告 (整理)单片机C语言程序设计实训100例.doc

单片机c语言程序设计实训报告 (整理)单片机C语言程序设计实训100例.doc

时间:2019-05-08 15:09:05

相关推荐

单片机c语言程序设计实训报告 (整理)单片机C语言程序设计实训100例.doc

(整理)单片机C语言程序设计实训100例.doc

.单片机C语言程序设计实训100例基于8051Proteus仿真案例第 01 篇 基础程序设计01闪烁的LED/* 名称闪烁的LED说明LED按设定的时间间隔闪烁*/includereg51.hdefine uchar unsigned chardefine uint unsigned intsbit LEDP10;延时void DelayMSuint xuchar i;whilexfori0;i120;i;主程序void mainwhile1LEDLED;DelayMS150;02 从左到右的流水灯/* 名称从左到右的流水灯说明接在P0口的8个LED从左到右循环依次点亮,产生走马灯效果*/includereg51.hincludeintrins.hdefine uchar unsigned chardefine uint unsigned int延时void DelayMSuint xuchar i;whilexfori0;i120;i;主程序void mainP00 xfe;while1P0_crol_P0,1; P0的值向左循环移动DelayMS150;03 8只LED左右来回点亮/* 名称8只LED左右来回点亮说明程序利用循环移位函数_crol_和_cror_形成来回滚动的效果*/includereg51.hincludeintrins.hdefine uchar unsigned chardefine uint unsigned int延时void DelayMSuint xuchar i;whilexfori0;i120;i;主程序void mainuchar i;P20 x01;while1fori0;i7;iP2_crol_P2,1; P2的值向左循环移动DelayMS150;fori0;i7;iP2_cror_P2,1; P2的值向右循环移动DelayMS150;04 花样流水灯/* 名称花样流水灯说明16只LED分两组按预设的多种花样变换显示*/includereg51.hdefine uchar unsigned chardefine uint unsigned intuchar code Pattern_P0 0 xfc,0 xf9,0 xf3,0 xe7,0 xcf,0 x9f,0 x3f,0 x7f,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff, 0 xe7,0 xdb,0 xbd,0 x7e,0 xbd,0 xdb,0 xe7,0 xff,0 xe7,0 xc3,0 x81,0 x00,0 x81,0 xc3,0 xe7,0 xff, 0 xaa,0 x55,0 x18,0 xff,0 xf0,0 x0f,0 x00,0 xff,0 xf8,0 xf1,0 xe3,0 xc7,0 x8f,0 x1f,0 x3f,0 x7f, 0 x7f,0 x3f,0 x1f,0 x8f,0 xc7,0 xe3,0 xf1,0 xf8,0 xff,0 x00,0 x00,0 xff,0 xff,0 x0f,0 xf0,0 xff, 0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf,0 xbf,0 x7f,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff, 0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 x7f,0 xbf,0 xdf,0 xef,0 xf7,0 xfb,0 xfd,0 xfe, 0 xfe,0 xfc,0 xf8,0 xf0,0 xe0,0 xc0,0 x80,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00, 0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x80,0 xc0,0 xe0,0 xf0,0 xf8,0 xfc,0 xfe, 0 x00,0 xff,0 x00,0 xff,0 x00,0 xff,0 x00,0 xff;uchar code Pattern_P2 0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xfe,0 xfc,0 xf9,0 xf3,0 xe7,0 xcf,0 x9f,0 x3f,0 xff, 0 xe7,0 xdb,0 xbd,0 x7e,0 xbd,0 xdb,0 xe7,0 xff,0 xe7,0 xc3,0 x81,0 x00,0 x81,0 xc3,0 xe7,0 xff, 0 xaa,0 x55,0 x18,0 xff,0 xf0,0 x0f,0 x00,0 xff,0 xf8,0 xf1,0 xe3,0 xc7,0 x8f,0 x1f,0 x3f,0 x7f, 0 x7f,0 x3f,0 x1f,0 x8f,0 xc7,0 xe3,0 xf1,0 xf8,0 xff,0 x00,0 x00,0 xff,0 xff,0 x0f,0 xf0,0 xff, 0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf,0 xbf,0 x7f, 0 x7f,0 xbf,0 xdf,0 xef,0 xf7,0 xfb,0 xfd,0 xfe,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff, 0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xfe,0 xfc,0 xf8,0 xf0,0 xe0,0 xc0,0 x80,0 x00, 0 x00,0 x80,0 xc0,0 xe0,0 xf0,0 xf8,0 xfc,0 xfe,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff, 0 x00,0 xff,0 x00,0 xff,0 x00,0 xff,0 x00,0 xff;延时void DelayMSuint xuchar i;whilexfori0;i120;i;主程序void mainuchar i;while1从数组中读取数据送至P0和P2口显示fori0;i136;iP0Pattern_P0i;P2Pattern_P2i;DelayMS100;05 LED模拟交通灯/*名称LED模拟交通灯说明东西向绿灯亮若干秒,黄灯闪烁5次后红灯亮, 红灯亮后,南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁5此后变红灯,东西向变绿灯,如此重复。*/includereg51.hdefine uchar unsigned chardefine uint unsigned intsbit RED_AP00; 东西向灯sbit YELLOW_AP01;sbit GREEN_AP02;sbit RED_BP03; 南北向灯sbit YELLOW_BP04;sbit GREEN_BP05;uchar Flash_Count0,Operation_Type1; 闪烁次数,操作类型变量延时void DelayMSuint xuchar i;whilex fori0;i120;i;交通灯切换void Traffic_LightswitchOperation_Typecase 1东西向绿灯与南北向红灯亮RED_A1;YELLOW_A1;GREEN_A0;RED_B0;YELLOW_B1;GREEN_B1;DelayMS2000;Operation_Type2;break;case 2东西向黄灯闪烁,绿灯关闭DelayMS300;YELLOW_AYELLOW_A;GREEN_A1;ifFlash_Count10 return; 闪烁5次Flash_Count0;Operation_Type3;break;case 3东西向红灯,南北向绿灯亮RED_A0;YELLOW_A1;GREEN_A1;RED_B1;YELLOW_B1;GREEN_B0;DelayMS2000;Operation_Type4;break;case 4南北向黄灯闪烁5次DelayMS300;YELLOW_BYELLOW_B;GREEN_B1;ifFlash_Count10 return;Flash_Count0;Operation_Type1;主程序void mainwhile1 Traffic_Light;06 单只数码管循环显示09/*名称单只数码管循环显示09说明主程序中的循环语句反复将09的段码送至P0口,使数字09循环显示*/includereg51.hincludeintrins.hdefine uchar unsigned chardefine uint unsigned intuchar code DSY_CODE0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90,0 xff;延时void DelayMSuint xuchar t;whilex fort0;t120;t;主程序void mainuchar i0;P00 x00;while1 /* for;i11;i P0DSY_CODEi; DelayMS300; 注另一方案 */P0DSY_CODEi;ii110;DelayMS300;07 8只数码管滚动显示单个数字/*名称8只数码管滚动显示单个数字说明数码管从左到右依次滚动显示07,程序通过每次仅循环选通一只数码管*/includereg51.hincludeintrins.hdefine uchar unsigned chardefine uint unsigned intuchar code DSY_CODE0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90;延时void DelayMSuint xuchar t;whilex fort0;t120;t;主程序void mainuchar i,wei0 x80;while1fori0;i8;iP20 xff; 关闭显示wei_crol_wei,1;P0DSY_CODEi; 发送数字段码P2wei; 发送位码DelayMS300;08 8只数码管动态显示多个不同字符电路如上图/*名称8只数码管动态显示多个不同字符说明数码管动态扫描显示07。*/includereg51.hincludeintrins.hdefine uchar unsigned chardefine uint unsigned intuchar code DSY_CODE0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90;延时void DelayMSuint xuchar t;whilex fort0;t120;t;主程序void mainuchar i,wei0 x80;while1fori0;i8;iP20 xff;P0DSY_CODEi; 发送段码wei_crol_wei,1;P2wei; 发送位码DelayMS2;09 8只数码管闪烁显示数字串电路如上图/*名称8只数码管闪烁显示数字串说明数码管闪烁显示由07构成的一串数字 本例用动态刷新法显示一串数字,在停止刷新时所有数字显示消失。*/includereg51.hdefine uchar unsigned chardefine uint unsigned int段码表uchar code DSY_CODE0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90;位码表uchar code DSY_IDX0 x01,0 x02,0 x04,0 x08,0 x10,0 x20,0 x40,0 x80;延时void DelayMSuint xuchar t;whilex fort0;t120;t;主程序void mainuchar i,j;while1fori0;i30;iforj0;j8;jP00 xff;P0DSY_CODEj; 发送段码P2DSY_IDXj; 发送位码DelayMS2; P20 x00; 关闭所有数码管并延时DelayMS1000;10 8只数码管滚动显示数字串电路如上图/*名称8只数码管滚动显示数字串说明数码管向左滚动显示3个字符构成的数字串*/includereg51.hincludeintrins.hdefine uchar unsigned chardefine uint unsigned int段码表uchar code DSY_CODE0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90,0 xff;下面数组看作环形队列,显示从某个数开始的8个数(10表示黑屏)uchar Num10,10,10,10,10,10,10,10,2,9,8;延时void DelayMSuint xuchar t;whilex fort0;t120;t;主程序void mainuchar i,j,k0,m0 x80;while1刷新若干次,保持一段时间的稳定显示fori0;i15;iforj0;j8;j发送段码,采用环形取法,从第k个开始取第j个P00 xff;P0DSY_CODENumkj11; m_crol_m,1;P2m; 发送位码DelayMS2; kk111;环形队列首支针k递增,Num下标范围010,故对11取余11 K1-K4 控制LED移位/*名称K1-K4 控制LED移位说明按下K1时,P0口LED上移一位; 按下K2时,P0口LED下移一位; 按下K3时,P2口LED上移一位; 按下K4时,P2口LED下移一位;*/includereg51.hincludeintrins.hdefine uchar unsigned chardefine uint unsigned int延时void DelayMSuint xuchar i;whilex fori0;i120;i;根据P1口的按键移动LEDvoid Move_LEDif P1 K1else ifP1K2else ifP1 K3else ifP1K4主程序void mainuchar Recent_Key;最近按键P00 xfe;P20 xfe;P10 xff;Recent_Key0 xff;while1ifRecent_KeyP1Recent_KeyP1; 保存最近按键Move_LED;DelayMS10;12 K1-K4 按键状态显示/*名称K1-K4 按键状态显示说明K1、K2按下时LED点亮,松开时熄灭, K3、K4按下并释放时LED点亮,再次按下并释放时熄灭;*/includereg51.hdefine uchar unsigned chardefine uint unsigned intsbit LED1P00;sbit LED2P01;sbit LED3P02;sbit LED4P03;sbit K1P10;sbit K2P11;sbit K3P12;sbit K4P13;延时void DelayMSuint xuchar i;whilex fori0;i120;i;主程序void mainP00 xff;P10 xff;while1LED1K1;LED2K2;ifK30whileK30;LED3LED3;ifK40whileK40;LED4LED4;DelayMS10;13 K1-K4 分组控制LED/*名称K1-K4 分组控制LED说明每次按下K1时递增点亮一只LED,全亮时再次按下则再次循环开始, K2按下后点亮上面4只LED,K3按下后点亮下面4只LED,K4按下后关闭所有LED*/includereg51.hdefine uchar unsigned chardefine uint unsigned int延时void DelayMSuint xuchar i;whilex fori0;i120;i;主程序void mainuchar k,t,Key_State;P00 xff;P10 xff;while1tP1;ift0 xffDelayMS10;iftP1 continue;取得4位按键值,由模式XXXX1111X中有一位为0,其他均为1变为模式0000XXXXX中有一位为1,其他均为0Key_Statet4;k0;检查1所在位置,累加获取按键号kwhileKey_State0k;Key_State1;根据按键号k进行4种处理switchkcase 1ifP00 x00 P00 xff;P01;DelayMS200;break;case 2P00 xf0;break;case 3P00 x0f;break;case 4P00 xff;14 K1-K4 控制数码管移位显示/*名称K1-K4 控制数码管移位显示说明按下K1时加1计数并增加显示位, 按下K2时减1计数并减少显示位, 按下K3时清零。*/includereg51.hdefine uchar unsigned chardefine uint unsigned int段码uchar code DSY_CODE0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90,0 xff;位码uchar code DSY_Index0 x80,0 x40,0 x20,0 x10,0 x08,0 x04,0 x02,0 x01;待显示到各数码管的数字缓冲(开始仅在0位显示0,其他黑屏)uchar Display_Buffer0,10,10,10,10,10,10,10;延时void DelayMSuint xuchar i;whilex fori0;i120;i;void Show_Count_ON_DSYuchar i;fori0;i8;iP00 xff;P0DSY_CODEDisplay_Bufferi;P2DSY_Indexi;DelayMS2;主程序void mainuchar i,Key_NO,Key_Counts0;P00 xff;P10 xff;P20 x00;while1Show_Count_ON_DSY;P10 xff;Key_NOP1;P1口按键状态分别为K1-0 xfe,K2-0 xfd,K3-0 xfbswitchKey_NOcase 0 xfeKey_Counts;ifKey_Counts8 Key_Counts8;Display_BufferKey_Counts-1Key_Counts;break;case 0 xfdifKey_Counts0Display_BufferKey_Counts10;break;case 0 xfbDisplay_Buffer00;fori1;i8;i Display_Bufferi10;Key_Counts0;若键未释放则仅刷新显示,不进行键扫描whileP10 xff Show_Count_ON_DSY;15 K1-K4 控制数码管加减演示/*名称K1-K4 控制数码管加减演示说明按下K1后加1计数,按下K2后减1计数,按下K3后清零。*/includereg51.hincludeintrins.hdefine uchar unsigned chardefine uint unsigned int段码uchar code DSY_CODE0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90,0 xff;待显示的3位缓冲uchar Num_Buffer0,0,0;按键代码,按键计数uchar Key_Code,Key_Counts0;延时void DelayMSuint xuchar i;whilex fori0;i120;i;显示函数void Show_Counts_ON_DSYuchar i,j0 x01;Num_Buffer2Key_Counts/100;Num_Buffer1Key_Counts/1010;Num_Buffer0Key_Counts10;fori0;i3;ij_cror_j,1;P00 xff;P0DSY_CODENum_Bufferi;P2j;DelayMS1;主程序void mainuchar i;P00 xff;P10 xff;P20 x00;Key_Code0 xff;while1Show_Counts_ON_DSY;P10 xff;Key_CodeP1;有键按下时,数码管刷新显示30次,该行代码同时起到延时作用ifKey_Code0 xfffori0;i30;i Show_Counts_ON_DSY;switchKey_Codecase 0 xfeifKey_Counts255 Key_Counts;break;case 0 xfdifKey_Counts0 Key_Counts;break;case 0 xfbKey_Counts0;Key_Code0 xff;16 4X4矩阵键盘控制条形LED显示/*名称4X4矩阵键盘控制条形LED显示说明运行本例时,按下的按键值越大点亮的LED越多。*/includereg51.hincludeintrins.hdefine uchar unsigned chardefine uint unsigned int矩阵键盘按键特征码表uchar code KeyCodeTable0 x11,0 x12,0 x14,0 x18,0 x21,0 x22,0 x24,0 x28,0 x41,0 x42,0 x44,0 x48,0 x81,0 x82,0 x84,0 x88;延时void DelayMSuint xuchar i;whilex fori0;i120;i;键盘扫描uchar Keys_Scanuchar sCode,kCode,i,k;低4位置0,放入4行P10 xf0;若高4位出现0,则有键按下ifP1ifP1行扫描码初值fork0;k4;k对4行分别进行扫描P1sCode;ifP1fori0;i16;i查表得到按键序号并返回ifkCodeKeyCodeTableireturni;elsesCode_crol_sCode,1; return-1;主程序void mainuchar i,P2_LED,P3_LED;uchar KeyNo-1;按键序号,-1表示无按键while1KeyNoKeys_Scan;扫描键盘获取按键序号KeyNo ifKeyNo-1P2_LED0 xff;P3_LED0 xff;fori0;iKeyNo;i键值越大,点亮的LED越多ifi8P3_LED1;elseP2_LED1;P3P3_LED; 点亮条形LEDP2P2_LED;17 数码管显示4X4矩阵键盘按键号/*名称数码管显示4X4矩阵键盘按键号说明按下任意键时,数码管都会显示其键的序号,扫描程序首先判断按键发生在哪一列,然后根据所发生的行附加不同的值,从而得到按键的序号。*/includereg51.hdefine uchar unsigned chardefine uint unsigned int段码uchar code DSY_CODE0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90,0 x88,0 x83,0 xc6,0 xa1,0 x86,0 x8e,0 x00;sbit BEEPP37;上次按键和当前按键的序号,该矩阵中序号范围015,16表示无按键uchar Pre_KeyNo16,KeyNo16;延时void DelayMSuint xuchar i;whilex fori0;i120;i;矩阵键盘扫描void Keys_Scanuchar Tmp;P10 x0f;高4位置0,放入4行DelayMS1;TmpP10 x0f;按键后0f变成0000XXXX,X中一个为0,3个仍为1,通过异或把3个1变为0,唯一的0变为1switchTmp判断按键发生于03列的哪一列case 1KeyNo0;break;case 2KeyNo1;break;case 4 KeyNo2;break;case 8KeyNo3;break;defaultKeyNo16;无键按下P10 xf0; 低4位置0,放入4列DelayMS1;TmpP140 x0f;按键后f0变成XXXX0000,X中有1个为0,三个仍为1;高4位转移到低4位并异或得到改变的值switchTmp对03行分别附加起始值0,4,8,12case 1KeyNo0;break;case 2KeyNo4;break;case 4KeyNo8;break;case 8KeyNo12;蜂鸣器void Beepuchar i;fori0;i100;iDelayMS1;BEEPBEEP;BEEP0;主程序void mainP00 x00;BEEP0;while1P10 xf0;ifP10 xf0 Keys_Scan; 获取键序号ifPre_KeyNoKeyNoP0DSY_CODEKeyNo;Beep;Pre_KeyNoKeyNo;DelayMS100;18 开关控制LED/*名称开关控制LED说明开关S1和S2分别控制LED1和LED2。*/includereg51.hsbit S1P10;sbit S2P11;sbit LED1P00;sbit LED2P01;主程序void mainwhile1LED1S1;LED2S2;19 继电器控制照明设备/*名称继电器控制照明设备说明按下K1灯点亮,再次按下时灯熄灭*/includereg51.hdefine uchar unsigned chardefine uint unsigned intsbit K1P10;sbit RELAYP24;延时void De

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。