编程,用单片机交通灯编程P1.0控制一个灯以100MS为周期闪烁,即50MS亮,50MS灭

定时器计数器_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
定时器计数器
&&单片机原理实验
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢单片机实验指导书_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
单片机实验指导书
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩22页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢豆丁微信公众号
君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
51单片机c语言总结
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口单片机问题:利用T1定时中断控制P1.7驱动发光二极管vd亮一秒灭一秒的闪烁,设时钟频率为12MHZ_百度知道
单片机问题:利用T1定时中断控制P1.7驱动发光二极管vd亮一秒灭一秒的闪烁,设时钟频率为12MHZ
编写程序前他给出的分析是这样的:
时钟频率为12MHz,1个机器周期1 us,1秒闪烁一次,0.5秒
P1.7求反1次。
0.5S=500ms=500000us,方式1最大计数65536,让T1工作于方式1,计数50000次中断一次,初值=6=1H
他计数50000次是怎么得来...
我有更好的答案
才是500ms最大定时时间是达不到500ms的,计数就是50000次,为了定时500ms,需要对T1的50ms的中断计数10次,才有65.536ms,所以,取定时的时间为50ms=50000us
采纳率:91%
来自团队:
为您推荐:
其他类似问题
发光二极管的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。单片机流水灯c语言实现-共享资料网
单片机流水灯c语言实现
实验一C1闪烁的 LedU1220p19XTAL1X1 C2220p CRYSTAL 18 XTAL2R110k9RSTP0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17C310u 29 30 31 PSEN ALE EAR2220RD1LED-RED 1 2 3 4 5 6 7 8 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51//名称:闪烁的 Led //说明:Led 按设定的时间间隔闪烁,约亮 1 秒灭 1 秒 //----------------------------------#include &reg51.h& #define uchar unsigned char//uchar 宏定义 #define uint unsigned int//uint 宏定义 sbit led=P1^0; //----------------------------------//延时子程序 //----------------------------------void delayMs(uint x) {//uchar i 取值为 0-255 while(x--) { for(i=0;i&120;i++);//延时 120 微妙 } } //-----------------------------------//主程序 //----------------------------------void main () { while(1) { led=~ delayMs(2050);//约亮 1 秒灭 1 秒 } }实验二C1 U1220p 19 XTAL1从左到右的流水灯X1 C2220p CRYSTAL 18XTAL2R110k9RSTP0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 171 2 3 4 5 6 7 81234567D1REDD2REDD3REDD4REDD5REDD6REDD7RED8D8REDC310u 29 30 31 PSEN ALE EAR2220RR3220RR4220RR5220RR6220RR7220RR8220RR9220R1 2 3 4 5 6 7 8P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51//名称:从左到右的流水灯 //说明:接在 P0 端口的 8 只 Led 从左到右循环依次点亮,产生走马灯效果 //----------------------------------#include &reg52.h& #include&intrins.h&//循环左移头文件宏定义 #define uchar unsigned char #define uint unsigned int //-----------------------------------//延时函数 void delayMs(uint x) { while(x--) { for(i=0;i&120;i++); } } //------------------------------------//主程序 void main () { P0=0//P0 口初始化值
while(1) { P0=_crol_(P0,1);//P0 口循环左移 1 位 delayMs(150);//晶振为 11.0592 时,0.1594885 秒移动一次 } }实验三C1左右来回循环的流水灯U1220p19X1 C2220p CRYSTAL 18XTAL1XTAL2R110k9RSTP0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17 1 2 3 4 5 6 7 81234567D1REDD2REDD3REDD4REDD5REDD6REDD7RED8D8REDC310u 29 30 31 PSEN ALE EAR2220RR3220RR4220RR5220RR6220RR7220RR8220RR9220R1 2 3 4 5 6 7 8P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51//名称:左右来回循环的流水灯 //说明:程序利用循环移位函数_crol_和_cror 形成来回滚动的效果 //--------------------------------------#include &reg52.h& #include&intrins.h& #define uchar unsigned char #define uint unsigned int //--------------------------------------void delayMs(uint x) { while(x--) { for(i=0;i&120;i++); } } //-------------------------------------void main () { P2=0x01;//P2 端口初始化 while(1)//死循环 { for(i=0;i&7;i++)//i 自加 1,当 i=7 时执行第二个 for 语句 { P2=_crol_(P2,1);//P2 端口循环左移 1 位 delayMs(150); } for(i=0;i&7;i++) { P2=_cror_(P2,1);//P2 端口循环右移 1 位 delayMs(150); } } } //注释 for(i=0;i&7;i++).i 初始值为 0, //i++就是 i 自加 1,每加一次执行 //P2=_crol_(P2,1);//P2 端口循环左移 1 位 //delayMs(150);延时 //当 i=7 时,跳出第一个 for 语句, //执行第二个 for 语句实验四C1花样流水灯U1D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15 D16 D1220p19X1 C2220p CRYSTAL 18XTAL1XTAL2R110k9RSTP0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17D1 D2 D3 D4 D5 D6 D7 D8R2220RD9D9 D10 D11 D12 D13 D14 D15 D16R10220RD2R3 R4 R5 R6 R7 R8 R9D10R11220R220R D3 D11R12220R220R D4 D12R13220RC310u 29 30 31 PSEN ALE EA220R D5 D13R14220R220R D6 D14R15220R220R D7 D151 2 3 4 5 6 7 8R16220RP1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51220R D8 D16R17220R220R//名称:花样流水灯 //说明:16 只 LED 分两段组按预设的多种花样变换显示 //------------------------------------#include &reg51.h& #define uchar unsigned char #define uint unsigned int uchar code pattern_P0[]={0xfc,0xf7,0x5f};//定义 P0 显示数组 uchar code pattern_P2[]={0xff,0x07,0xf5};//定义 P2 显示数组 //调整数组{}里的内容,可以实现自定义的花样显示 //------------------------------------void delayMs(uint x) { while(x--) for(i=0;i&120;i++); } //------------------------------------void main () { while(1) { for(i=0;i&7;i++) { P0=pattern_P0[i];//i 自加 1 次,P0 数组重新扫描 1 次 P2=pattern_P2[i];//i 自加 1 次,P2 数组重新扫描 1 次 delayMs(150); } } } //数组定义格式为 // uchar code pattern_P0[]={0xfc,0xf7}; //uhar 为数组类型,pattern_P0 数组名称 //code 数组存储类型 //{0xfc,0xf7}为数组显示参数,为 0xff 为全部关闭 实验五Led 模拟交通灯P0.3 P0.4 P0.5C1 U1220p 19 XTAL1 P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD 39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17 P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.0D1红D2黄D3绿X1 C2220p CRYSTAL 18R2220RR3220RR4220RXTAL2D4红R110kR5220RR8220RD7P0.09RST红C310u 29 30 31 PSEN ALE EAD5P0.1R6220R vccR9220RD8P0.1黄黄D6P0.2R7220RR10220RD9P0.21 2 3 4 5 6 7 8P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51绿R11220RR12220RR13220R绿D10红D11黄D12绿P0.3P0.4//Led 模拟交通灯 //说明:东西向绿灯亮若干秒,黄灯闪烁,闪烁 5 秒后亮红灯, //红灯亮后,南北向有红灯变为绿灯,若干秒后南北向黄灯闪烁, //闪烁 5 次后,亮红灯,东西向绿灯亮,如此重复 //------------------------------------------------#include &reg51.h& #define uchar unsigned char #define uint unsigned int sbit red_a=P0^0; sbit yellow_a=P0^1; sbit green_a=P0^2; sbit red_b=P0^3 ; sbit yellow_b=P0^4; sbit green_b=P0^5;//sbit 为 LED 控制位定义 uchar Flash_Count=0,Operation_Type=1; //Flash_Count 闪烁次数和 Operation_Type 操作类型变量定义 //--------------------------------------------void delayMs(uint x) { while(x--) { for(i=0;i&120;i++); } } //--------------------------------------------//交通灯切换子程序P0.5 void Traffic_Light() { switch (Operation_Type) { case 1://东西向绿灯亮与南北向红灯亮 red_a=1;yellow_a=1;green_a=0; red_b=0;yellow_b=1;green_b=1; delayMs(2000); Operation_Type=2; case 2://东西向黄灯开始闪烁,绿灯关闭 delayMs(300); yellow_a=!yellow_a; green_a=1; //黄灯闪烁 5 次 if(++Flash_Count!=10) Flash_Count=0; Operation_Type=3; case 3://东西向红灯与南北向绿灯亮 red_a=0;yellow_a=1;green_a=1; red_b=1;yellow_b=1;green_b=0; delayMs(2000); Operation_Type=4;//中断 case3 执行 case4 case 4://南北向黄灯开始闪烁 delayMs(300); yellow_b=!yellow_b; green_b=1; if(++Flash_Count!=10) Flash_Count=0; Operation_Type=1; } } //-------------------------------------------void main () { while(1) Traffic_Light(); } // switch 是多分支选择语句常用格式 //switch(表达式) //{case 常量表达式 1;语句 1 //case 常量表达式 2;语句 2 //case 常量表达式 3;语句 3 //case 常量表达式语句 n //default:语句 n+1} //return 是返回值,break 的返回是指停止这一次执行,返回开始实验六单只数码管循环显示 0--9RP1RESPACK-8C1 U1220p 191P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD 39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17X1 C2220p CRYSTAL 18XTAL1XTAL2R110k9RSTC310u 29 30 31 PSEN ALE EA1 2 3 4 5 6 7 8P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51//单只数码管循环显示 0--9 //说明:主程序中的循环语句反复将 0--9 的段码送至 P0 端口 // 使数字 0--9 循环显示 //-----------------------------------------------#include &reg51.h& #define uchar unsigned char #define uint unsigned int uchar code DSY_CODE []= {0xc0,0xf9,0xa4,0xb0,0x99,0x92, 0x82,0xf8,0x80,0x90,0xff}; //{}内为共阳数码管 0-9 的编码 //--------------------------------------void DelayMs(uint x) { while(x--)for(i=0;i&120;i++); } //---------------------------------------void main () { uchar i=0;2 3 4 5 6 7 8 9 P0=0x00; while(1) { P0=~DSY_CODE[i];//显示数组取反 i=(i+1)%10;// DelayMs(180); } } //说明;电路中数码管接法是共阴,段码表是共阳的 //;所以用 P0=Y~DS_CODE[i]语句取反显示实验七8 只数码管滚动显示单个不同数字16 15 14 13 12 11 10 9RN1RX8C1 U1220p 19 XTAL1P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.71 2 3 4 5 6 7 8X1 C2220p CRYSTAL 18Q0Q1XTAL2R110k9RSTP0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7123Q1TIP31Q2TIP31Q3TIP3141 2 3 4 5 6 7 8Q4TIP31Q2C310u 29 30 31 PSEN ALE EA567Q3Q4Q5Q6Q5TIP31Q6TIP31Q7TIP31Q78Q8TIP311 2 3 4 5 6 7 8P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51用三极管驱动显示不正常,最好去掉三级管驱动 //8 只数码管滚动显示单个不同数字 //说明:数码管从左到右依次滚动显示 0--9, //程序通过每次仅循环选通一只数码管 //-------------------------------------#include &reg51.h& #include&intrins.h& #define uchar unsigned char #define uint unsigned int uchar code DSY_CODE []= {0xc0,0xf9,0xa4,0xb0,0x99,0x92, 0x82,0xf8,0x80,0x90,};//数组定义 //------------------------------------ void DelayMs(uint x) { while(x--) { for(i=0;i&200;i++); } } //----------------------------------void main () { uchar i,k; k=0x80;//K 初始化
while(1) { for(i=0;i&10;i++) { P0=0//关闭显示 P0=DSY_CODE[i];//发送数字段码 k=_crol_(k,1);//P2=k;所以第 1 位右移 P2=k; //发送数码管位码,打开对应的数码管 DelayMs(300); } } } //i=10 是因为数组里有 1-9 共十个段码 //k=0x80;因为移位 P2^8 开始,移动一位才开始 //显示第一位 实验八8 只数码管显示多个不同字符16 15 14 13 12 11 10 9RN1RX8C1 U1220p 19 XTAL1P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.71 2 3 4 5 6 7 8X1 C2220p CRYSTAL 18Q0Q1XTAL2R110k9RSTP0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7123Q1TIP31Q2TIP31Q3TIP3141 2 3 4 5 6 7 8Q4TIP31Q2C310u 29 30 31 PSEN ALE EA567Q3Q4Q5Q6Q5TIP31Q6TIP31Q7TIP31Q78Q8TIP311 2 3 4 5 6 7 8P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51//8 只数码管显示多个不同字符 //说明:数码管动态显示 0--7,(刷新快) //-------------------------------------#include &reg51.h& #include&intrins.h& #define uchar unsigned char #define uint unsigned int uchar code DSY_CODE []= {0xc0,0xf9,0xa4,0xb0,0x99,0x92, 0x82,0xf8,0x80,0x90,0xff};//数码管段码数组定义 //------------------------------------//延时程序 void DelayMs(uint x) { while(x--) for(i=0;i&120;i++); } //----------------------------------//主程序 //---------------------------------void main () { uchar k,m=0x80; //赋初值 while(1) { for(k=0;k&8;k++) { m=_crol_(m,1);//位右移 P2=m;//位码 P0=DSY_CODE[k+1] ;//段码 DelayMs(10);//延时短 } } } //本例刷新速度快!视觉显示多个字符 //如果延时间加长,就是固定位置显示单个字符实验九数码管闪烁显示字符串16 15 14 13 12 11 10 9RN1RX8P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 1 2 3 4 5 6 7 8C1 U1220p 19 XTAL1X1 C2220p CRYSTAL 18Q0Q1XTAL2R110k9RSTP0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7123Q1TIP31Q2TIP31Q2Q3TIP31Q341 2 3 4 5 6 7 8Q4TIP31C310u 29 30 31 PSEN ALE EA567Q4Q5Q6Q5TIP31Q6TIP31Q7TIP31Q78Q8TIP311 2 3 4 5 6 7 8P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51//数码管闪烁显示字符串 //说明:数码管闪烁显示由 0--7 构成的一串数字 // 本例用动态刷新发法显示一串字符,在停止时所有数字显示消失(区别定义两个数组) #include &reg51.h& #define uchar unsigned char #define uint unsigned int //数字 0--9 的数码管段码表 uchar code DSY_CODE []= {0xc0,0xf9,0xa4,0xb0,0x99,0x92, 0x82,0xf8,0x80,0x90}; //数码管位选通索引表(位码表) uchar code DSY_IDX[]= { 0x01,0x02,0x04,0x08,// 0x10,0x20,0x40,0x80}; //--------------------------------//延时程序 //-------------------------------void DelayMs(uint x) { while(x--) for(i=0;i&120;i++); } //---------------------------------//主程序 //---------------------------------void main () { uchar k,m;//赋初值 P0=0//P0 初始化 P2=0x00; //P2 初始化 while(1) {for(k=0;k&30;k++) { for(m=0;m&8;m++) { P2=DSY_IDX[m];//显示位码 P0=DSY_CODE[m];//显示段码 DelayMs(20); } } P2=0x00;//位关闭 DelayMs(1000); } } //第一个 for(k=0;k&30;k++)数码管保持显示时间延时 //第二个 for(m=0;m&8;m++)位码和段码显示位限制实验十8 只数码管滚动显示数字串 16 15 14 13 12 11 10 9RN1RX8C1 U1220p 19 XTAL1P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.71 2 3 4 5 6 7 8X1 C2220p CRYSTAL 18XTAL2R110k9RSTP0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7C310u 29 30 31 PSEN ALE EA1 2 3 4 5 6 7 8P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51//8 只数码管滚动显示数字串 //说明:数码管向左滚动显示 3 个字符构成的字符串 #include &reg51.h& #include&intrins.h& #define uchar unsigned char #define uint unsigned int uchar code DSY_CODE []= {0xc0,0xf9,0xa4,0xb0,0x99,0x92, 0x82,0xf8,0x80,0x90,0xff}; //程序将下面数组看成环形队列显示从 //某个数开始的 8 个数(10 表示黑屏) uchar Num[]={10,10,10,10,10,10 ,10,10,2,8,9}; //-----------------------------------void DelayMs(uint x) { while(x--)for(i=0;i&120;i++); } //-------------------------------------void main () { uchar i,j,k, P0=0Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 P2=0x00; m=0x80; k=0; while(1) { for(i=0;i&10;i++)//显示保持 { for(j=0;j&8;j++) { m=_crol_(m,1); P2=m; //采用环形取法从第 K 开始取 J 个 P0=DSY_CODE[Num[(k+j)%11]]; DelayMs(2); } } //环形队列首指针 K 递增,Num 的下表范围为 //0--10 因此对 11 求余 k=(k+1)%11; } } //在用软件仿真是最好不要加三极管驱动!因程序运行占用 CPU 资源,运行不正常实验十一C1 U1220p 19K1--K4 控制 LEd 移位D1 D2 D3 D4 D5 D6 D7 D8 R2220R D2X1 C2220p CRYSTAL 18XTAL1XTAL2R110k9RSTP0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15 D16D1D9D9 D10 D11 D12 D13 D14 D15 D16R10220RR3 R4 R5 R6 R7 R8 R9D10R11220R220R D3 D11R12220R220R D4 D12R13220RC310u 29 30 31 PSEN ALE EA220R D5 D13R14220R220R D6 D14R15220R220R D7 D15L上移 L下移 R上移 R下移1 2 3 4 5 6 7 8R16220RP1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51220R D8 D16R17220R220R//名称:K1--K4 控制 LEd 移位 //说明:按下 k1 时,P0 端口 LED 向上移动一位 //说明:按下 k2 时,P0 端口 LED 向下移动一位 //说明:按下 k3 时,P2 端口 LED 向上移动一位 //说明:按下 k4 时,P2 端口 LED 向下移动一位 //------------------------------------- #include &reg51.h& #include&intrins.h& #define uchar unsigned char #define uint unsigned int //-------------------------------------void DelayMs(uint x) { while(x--) { for(i=0;i&120;i++); } } //--------------------------------------//根据 P1 端口的按键移动 LED void move_LED () { if((P1&0x10)==0) P0=_cror_(P0,1);//k1 键 P0 左移 else if((P1&0x20)==0) P0=_crol_(P0,1);//k2 键 P0 右移 else if((P1&0x40)==0) P2=_cror_(P2,1);//k3 键 P2 左移 else if((P1&0x80)==0) P2=_crol_(P2,1);//k4 键 P2 右移 } //P1 端口值初始化为 1,有建按下对应键值为 0 //对应键值 P0、P2 的 Led 移位 //--------------------------------------void main () { uchar Recent_ P0=0 P1=0 P2=0 Recent_key=0//按键初始化为高电平 while(1) { if (Recent_key!=P1)//判断是否有键按下 { Recent_key=P1;//保存最近按键值 move_LED();//根据 P1 端口的按键移动 LED DelayMs(10); } } } //调整延时值,可改变流水灯流动速度实验十二K1--K4 按键状态显示 C1 U1220p 19 XTAL1 P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD 39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17L组D1 D2 D3 D4R2220RX1 C2220p CRYSTAL 18R3 R4 R5XTAL2220RR110k9RST220RC310u 29 30 31 PSEN ALE EA220RK1K21 2 3 4 5 6 7 8P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51k3k4k1.k2按下时 LED亮松开时灭 K3.K4按下时LED亮,再次按下时 LED灭//名称:K1--K4 按键状态显示 //说明:按下 k1、k2 时,led 点亮,松开时熄灭 //说明:k3、k4 按下并释放时点亮,再次按下时熄灭 //----------------------------------------#include &reg51.h& #include&intrins.h& #define uchar unsigned char #define uint unsigned int sbit K1=P1^4; sbit K2=P1^5; sbit K3=P1^6; sbit K4=P1^7; sbit D1=P0^0; sbit D2=P0^1; sbit D3=P0^2; sbit D4=P0^3; //-------------------------------------void DelayMs(uint x) { while(x--) { for(i=0;i&120;i++); } } //------------------------------------void main () { P0=0//P0 初始化 P1=0//P1 初始化 while(1) { D1=K1;//按下 K1 键 D1 点亮 D2=K2;//按下 K2 键 D2 点亮 if(K3==0)//判断 K3 是否有键按下 { while (K3==0);//等待按键释放 D3=~D3;//D3 闪烁 } if(K4==0)//判断 K4 是否有键按下 { while (K4==0);//等待按键释放 D4=~D4; } DelayMs(10); } }实验十三K1--K4 分组控制 LED C1 U1220p 19 XTAL1 P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD 39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17 1 2 3 4 5 6 7 8 1D1 D2 D3 D4 D5 D6 D7 D8R2220RX1 C2220p CRYSTAL 18XTAL22R3 R4 R5 R6 R7 R8 R9220R 3R110k9RST220R 4C310u 29 30 31 PSEN ALE EA220R 5220R 6220R 7逐个点亮 上4个亮 下四个亮 关闭1 2 3 4 5 6 7 8P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51220R 8220R//K1--K4 分组控制 LED //说明:每次按下 k1 时,递增点亮一只 LED //全亮时再次按下则再次循环开始 //按下 k2 点亮上面 4 只 LED //按下 k3 点亮下面 4 只 LED //按下 K4 后关闭所有 LED #include &reg51.h& #define uchar unsigned char #define uint unsigned int //----------------------------------void DelayMs(uint x) { while(x--) { for(i=0;i&120;i++); } } //-----------------------------------void main () { uchar k,t,key_ P0=0 P1=0 while(1) { t=P1; if(t!=0xff) { DelayMs(10); if(t!=P1)//再次检查按键值 key_state=~t&&4;//t 取反右移 4 位赋给 key_state k=0; while (key_state!=0)//循环检查 1 所在的位置,累加获取按键号 K { k++;//k 自加 1 key_state&&=1;//当键号右移等于 1 时,跳出 while 语句 } switch (k)//根据按键号 K 进行 4 种处理 { case 1 :if(P0==0x00)P0=0 P0&&=1;//递增点亮 P0 口的 LED DelayMs(200); case 2 : P0=0xf0;//点亮低四位 case 3: P0=0x0f;//点亮高四位 case 4: P0=0 //关闭 p0 口 } } } }实验十四K1--K4 控制数码管移位显示 16 15 14 13 12 11 10 9RN1RX8C1 U1220p 19 XTAL1P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.71 2 3 4 5 6 7 8X1 C2220p CRYSTAL 18XTAL2R110k9RSTP0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7C310u 29 30 31 PSEN ALE EAK1加1 显示 K2减1 显示1 2 3 4 5 6 7 8 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51清零//K1--K4 控制数码管移位显示 //说明:按下 k1 时加 1 计数并增加显示位 //说明:按下 k2 时减 1 计数并减少显示位 //说明:按下 k3 时清零 #include &reg51.h& #define uchar unsigned char #define uint unsigned int //0-9 的段码,0xff 为黑屏 uchar code DSY_CODE[]= {0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90,0xff}; //位码 uchar code DSY_Index[]= {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; //待显示到各数码管的数字缓冲(开始时仅在 0 位显示 0,其他数码管黑屏) uchar Display_Buffer[]= {0,10,10,10,10,10,10,10}; //----------------------------------------------void DelayMs(uint x) { while(x--) { for(i=0;i&120;i++);Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 } } //----------------------------------------------//显示子程序 void Show_Count_ON_DSY() { for(i=0;i&8;i++) { P2=DSY_Index[i]; P0=DSY_CODE[Display_Buffer[i]]; DelayMs(2);//显示延时时间,太短 4 秒后不显,太长动态显示不连贯 } } //----------------------------------------------void main () { uchar key_NO,key_Counts=0; P0=0 P1=0 P2=0x00; while(1) { Show_Count_ON_DSY();//显示 P0=0 key_NO=P1; switch (key_NO) { case 0xFE :key_Counts++ ; //加 1 计数,增加显示位 if(key_Counts&8) key_Counts=8; Display_Buffer[key_Counts-1]=key_C case 0xFD :if(key_Counts&0) //减 1 计数,减少显示位 Display_Buffer[--key_Counts]=10; if(key_Counts==0)Display_Buffer[0]=0; case 0xFB: Display_Buffer[0]=0;//关闭显示,按键清零 for(i=0;i&8;i++) Display_Buffer[i]=10; key_Counts=0; } while(P1!=0xff) //如果按键未释放则仅执行刷新显示,不进行按键扫描 Show_Count_ON_DSY();//显示段码和位码 } }实验十五K1--K4 控制数码管加减演示16 15 14 13 12 11 10 9RN1RX8C1 U1220p 19 XTAL1P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.71 2 3 4 5 6 7 8X1 C2220p CRYSTAL 18XTAL2R110k9RSTP0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7C310u 29 30 31 PSEN ALE EAK1加1 显示 K2减1 显示1 2 3 4 5 6 7 8 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51清零//名称:K1--K4 控制数码管加减演示 //说明:k1 按下加 1 计数 // K2 按下后减 1 计数 // K3 按下后清零 #include &reg51.h& #include&intrins.h& #define uchar unsigned char #define uint unsigned int uchar code DSY_CODE []= {0xc0,0xf9,0xa4,0xb0,0x99,0x92, 0x82,0xf8,0x80,0x90,0xff };//0-9 的段码 uchar Num_Buffer[]={0,0,0};//待显示的 3 位数 uchar key_code,key_Counts=0;//按键代码,按键计数最大值 255 //---------------------------------------------void DelayMs(uint x) { while(x--) for(i=0;i&120;i++); }Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 //---------------------------------------------//显示子程序 void Show_Counts_ON_DSY() { uchar i=0x01; uchar j=0x80;//显示位置初始化 Num_Buffer[0]=key_Counts/100;//分离显示百位 Num_Buffer[1]=key_Counts/10%10;//分离显示十位 Num_Buffer[2]=key_Counts%10;//分离显示个位 for(i=0;i&3;i++) { j=_crol_(j,1); P2=j;//显示位置,j=0x80,从第一位显示,j=0x01 从第二位开始显示 P0=DSY_CODE[Num_Buffer[i]];//显示数组 DelayMs(1); } } //-------------------------------------------------void main () { P0=0 P1=0 P2=0x00; key_code=0 while(1) { Show_Counts_ON_DSY(); P1=0 key_code=P1; if(key_code!=0xff) for(i=0;i&30;i++)Show_Counts_ON_DSY();//有键按下数码管刷新 30 次,延 时 switch(key_code) { case 0xfe: if(key_Counts&255) key_Counts++;//按键加 1 计数 case 0xfd: if(key_Counts&0) key_Counts--;//按键减 1 计数 case 0xfb: key_Counts=0;//清零 } key_code=0//否则按键代码为 0 } } //总结;显示位置,j=0x80,从第一位显示, // j=0x01 从第二位显示 实验十六C14X4 键盘矩阵控制条形 LED 显示U1220p 19X1 C2220p CRYSTAL 18XTAL1XTAL2R110k9RSTP0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17U220 19 18 17 16 15 14 13 12 11 11 12 13 14 15 16 17 18 19 20 1 2 3 4 5 6 7 8 9 10 10 9 8 7 6 5 4 3 2 1RN1220 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 220 16 15 14 13 12 11 10 9 16 15 14 13 12 11 10 9C310u 29 30 31 PSEN ALE EAU3P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.71 2 3 4 5 6 7 8P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51 net=P1.12LED-BARGRAPH-GRNP1.4P1.5P1.6K1K5K9K13P1.0k2K6K110K14P1.1K3K7K11K15P1.2K4K8K12K16P1.3//4//4X4 键盘矩阵控制条形 LED 显示 //说明:运行本例时,按下的按键值越大, //点亮的 LED 就越多,按下 K1 一只 LED 亮,按下 K16 全亮 #include &reg51.h& #include&intrins.h& #define uchar unsigned char #define uint unsigned int //0-9,a-f 数码管段码表,最后一个是黑屏 uchar code DSY_CODE []= {0xc0,0xf9,0xa4,0xb0,0x99,0x92, 0x82,0xf8,0x80,0x90,0x88, 0x83,0xc6,0xa1,0x86,0x8e,0x00 }; //矩阵键盘按键特征扫描码 uchar code keycodetable[]= {0x11,0x12,0x14,0x18,0x21, 0x22,0x24,0x28,0x41,0x42, 0x44,0x48,0x81,0x82,0x84,0x88}; //------------------------------------------------P1.7RN2 void DelayMs(uint x) { while(x--) for(i=0;i&120;i++); } //-------------------------------------------------//键盘矩阵扫描 uchar keys_scan() { uchar scode ,kcode,i,k; { P1=0xf0;//低 4 位置 0,放入 4 行 DelayMs(1);// if((P1&0xf0)!=0xf0)//高 4 位取与之后为 4 个 1, //如果高 4 位列出现 0,则有键按下 { scode=0//行扫描码赋初值 for(k=0;k&4;k++)//对 4 行分别进行扫描 { P1= if((P1&0xf0)!=0xf0)//如果低四位不为 0 { kcode=~P1;//P1 取反后赋给 kcode, for(i=0;i&16;i++)//查表得到按键序号并返回 if(kcode==keycodetable[i]) } else scode=_crol_(scode,1);//扫描码循环右移 } } } return -1; } //--------------------------------------------------------void main() { uchar keyNo=-1;//按键序号-1 表示无按键 uchar i,P2_LED,P3_LED; while(1) { keyNo=keys_scan(); if(keyNo!=-1)//判断有无按键按下 { P2_LED=0 P3_LED=0 for(i=0;i&=keyNo;i++) { if(i&8)//键值大于 8 P3_LED&&=1;//P3 按位右移 else P2_LED&&=1;//P2 按位右移 } P3=P3_LED; P2=P2_LED;//点亮条形 LED } } } //本例键盘矩阵行线连接 P0.0-P0.3,列线连接 P0.4 -P0.7 //1 程序首先判断是否有键按下,在行线上放置 4 个 0,即 P0=0xf0; //如果有键按下,列线上必有一位为 0, //2 如果有键按下,则判断案件所在行、列位置,并返回按键序号 //代码中扫描初值 scode 初值为 0xfe,通该值循环右移,对 4 行逐行发 //送 0,每次扫描后即判断高 4 位的 4 个 1 中是否有 0 出现,如果有 0 出现 //按键在该行上这时将发送的低 4 位和读取的高 4 位取反,也就是 P1 口取反 //P1 口出现两个 1,分别处在高 4 位和低 4 位,共 16 种可能,根据取反的 //的值查询键盘矩阵按键特征码表,即可得到按键序号实验十七数码管显示 4x4 键盘矩阵键序号 RP1RESPACK-8C1 U1220p 191X1 C2220p CRYSTAL 18XTAL1XTAL2R110k9RSTP0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17C310u 29 30 31 PSEN ALE EAP1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.71 2 3 4 5 6 7 8P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51 net=P1.12P1.4P1.5P1.6K0K4K8K12P1.0K1K5K9K13P1.1K2K6K10K14P1.2K3K7K11K15P1.3//--------------------------------//名称;数码管显示 4x4 键盘矩阵键序号 //--------------------------------//说明:按下任意一键时,数码管会显示它在键盘矩阵上的 0-F, //扫描程序首先判断按键发生在那一列,然后根据所发生的行附加不同的值 //从而得到键盘按键号 //--------------------------------------#include &reg51.h& #define uchar unsigned char #define uint unsigned int uchar code DSY_CODE[]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80, 0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00}; sbit BEEP=P3^7;P1.72 3 4 5 6 7 8 9LS1SOUNDER //上次按键和当前按键序号,该矩阵中的序号范围为 0-15,16 表示无按键 uchar pre_keyNo=16,keyNo=16; //---------------------------------------------------------//延时 void DelayMs(uint ms) { while (ms--) for(t=0;t&120;t--); } //----------------------------------------------------------//键盘矩阵扫描 void keys_Scan() { uchar T P1=0x0f;//高 4 位置 1,放入 4 行 DelayMs(1); Tmp=P1^0x0f;//P1 与 0X0F 异或 switch(Tmp)//判断按键发生在那一列 { case 1:keyNo=0 ; case 2:keyNo=1; case 4:keyNo=2; case 8:keyNo=3; default:keyNo=16;//无键按下 } P1=0xf0;//低 4 位置 0,放入 4 列 DelayMs(1); Tmp=P1&&4^0x0f;//P1 逐位右移并且与 0X0F 异或 switch(Tmp)//对 0-3 行分别附加起始值 0,4,8,12. { case 1:keyNo +=0;//第一列行号 0=3 加 0(显示 0.1.2.3) case 2:keyNo +=4;//第二列行号 0-3 加 4(显示 4.5.6.7) case 4:keyNo +=8;//第三列行号 0-3 加 8(显示 8.8.10.11) case 8:keyNo +=12;//第四列行号 0-3 加 12(显示 12.13.14.15) } } //-------------------------------------------------------------void Beep()//蜂鸣器程序 { for(i=0;i&120;i--) { DelayMs(20); BEEP=~BEEP; } BEEP=1; } //-------------------------------------//主程序 //------------------------------------void main() { P0=0x00; while(1) { P1=0xf0; if(P1!=0xf0) keys_Scan();//扫描键盘获取按键序号 if( pre_keyNo!=keyNo)//如果上次和本次序号不一致 { P0=~DSY_CODE[keyNo];//显示本次键号 Beep();//蜂鸣器响 pre_keyNo=keyNo;//本次键号保存 } DelayMs(100); } }实验十八C1开关控制 LDEU1 R2220RD1 D2220p19X1 C2220p CRYSTAL 18XTAL1XTAL2R110k9RSTP0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17R3220RC310u 29 30 31 PSEN ALE EAK11 2 3 4 5 6 7 8 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51 net=P1.12K2//--------------------------------- //名称;开关控制 LDE //--------------------------------//说明:开关 S1、S2、分别控制 D1、D2、 //--------------------------------------#include &reg51.h& #define uchar unsigned char #define uint unsigned int sbit S1=P1^0; sbit S2=P1^1;//按键定义 sbit D1=P0^0; sbit D2=P0^1;//显示定义 //-------------------------------------//主程序 //------------------------------------void main() { while (1) { D1=S1; D2=S2; } }实验十九C1继电器控制照明设备U1220p19X1 C2220p CRYSTAL 18XTAL1XTAL2R110k9RSTP0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17+220C310u 29 30 31 PSEN ALE EAL1220VR21kQ1PNPK11 2 3 4 5 6 7 8 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51RL1RTE24005FD1DIODE//名称;继电器控制照明设备 //说明:按下 k1 时灯点亮,再次按下灯熄灭 //--------------------------------------#include &reg51.h& #define uchar unsigned char #define uint unsigned int sbit k1=P1^0; sbit RELAY=P2^4;//驱动定义 void DelayMS(uint ms) { while(ms--) for(t=0;t&120;t++); } //-------------------------------------//主程序 //------------------------------------void main() { P1=0 RELAY=1;//输出初始化为高电平 while(1) { if(k1==0)//按键检测 { while(k1==0); RELAY=~RELAY;//输出取反 DelayMS(20); } } } 实验二十数码管显示拨码开关编码B.0 B.1 B.2 B.3 B.4 B.5 B.6 B.7RP1 C11U1220p 192 3 4 5 6 7 8 91 2 3 4U2P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD 39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17 1 2 3 4 2 3 4 5 6 7 8 9 19 1 A0 A1 A2 A3 A4 A5 A6 A7 CE AB/BA 74LS245 B0 B1 B2 B3 B4 B5 B6 B7 18 17 16 15 14 13 12 11 B.0 B.1 B.2 B.3 B.4 B.5 B.6 B.7X1 C2220p CRYSTAL 18XTAL1XTAL2R110k9RSTC310u 29 30 31 PSEN ALE EADSW19OFF ON1 2 3 4 5 6 7 81 2 3 4 5 6 7 8P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51DIPSWC_8//名称;数码管显示拨码开关编码 //--------------------------------//说明:系统显示拨码开关所设置的编码 000-255 //--------------------------------------#include &reg51.h& #include &intrins.h& #define uchar unsigned char #define uint unsigned int uchar code DSY_CODE[]= {0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f};//数码管段码定义 uchar DSY_Buffer[]={0,0,0};//显示缓冲 //-----------------------//延时程序 void DelayMS(uint ms) { while(ms--)for(t=0;t&120;t++);} //-------------------------------------//主程序 //------------------------------------void main() { uchar i,m,N P0=0 P2=0 while (1) { m=0 Num=P1;//读取拨码开关的值 DSY_Buffer[0]=Num/100; DSY_Buffer[1]=Num/10%10; DSY_Buffer[2]=Num%10;//分离数组显示个.十.百位 for(i=0;i&3;i++)//刷新显示在数码管上 { m=_crol_(m,1); P2=m;//显示位码 P0=DSY_CODE[DSY_Buffer[i]];//显示段码 DelayMS(10); } } } //拨码开关的编码顺序 1,2,4,8,16,32,64,128,256. 实验二十一C1开关控制报警器U1220p 19X1 C2220p CRYSTAL 18XTAL1XTAL2R110k9RSTP0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17C310u 29 30 31 PSEN ALE EALS11 2 3 4 5 6 7 8 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51SOUNDERSW1SW-SPDT-MOM//--------------------------------//名称:开关控制报警器 //--------------------------------//说明:用 k1 开关控制报警,程序控制 P1.0 输出两种不同的声音。 //模拟很逼真的报警效果 //--------------------------------------#include &reg51.h& #define uchar unsigned char #define uint unsigned int sbit k1=P1^7; sbit SPK=P1^0; //-----------------------//发声程序 void Alarm(uint t) { uchar i,j; for(i=0;i&120;i++) { SPK=~SPK; for(j=0;j&t;j++);//有 t 参数形成不同的频率 } } //-------------------------------------//主程序 //------------------------------------void main() { while(1) { if(k1==1)//如果有键按下 { Alarm(90);//t=90 发声 Alarm(120);//t=120 发声 } } } 实验二十二C1按键发音U1220p 19X1 C2220p CRYSTAL 18XTAL1XTAL2R110k9RSTP0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17C310u 29 30 31 PSEN ALE EAK1 K2 K3 K4LS1SOUNDER1 2 3 4 5 6 7 8P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51//--------------------------------//名称:按键发音 //--------------------------------//说明:本例运行时,按下不同的按键会使 SOUNDER 发出不同 // 频率的声音输出,后续类似案例使用的是定时技术 //--------------------------------------#include &reg51.h& #define uchar unsigned char #define uint unsigned int sbit k1=P1^4; sbit k2=P1^5; sbit k3=P1^6; sbit k4=P1^7; sbit BEEP=P3^7; //----------------------//延时程序 void DelayMS(uint x) { while (x--) for(t=0;t&50;t++); } //-----------------------//按周期 t 发音 void play(uchar t) { for(i=0;i&100;i++) { BEEP=~BEEP; DelayMS(t); } BEEP=0; } //-------------------------------------//主程序 //------------------------------------void main() { P1=0 while(1) { if(k1==0) if(k2==0) if(k3==0) if(k4==0) } } play(1);//延时 1 个周期 play(2);//延时 2 个周期 play(3);//延时 3 个周期 play(4);//延时 4 个周期 实验二十三C1播放音乐U1220p 19X1 C2220p CRYSTAL 18XTAL1XTAL2R110k9RSTP0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17C310u 29 30 31 PSEN ALE EAK1 K2 K3 K41 2 3 4 5 6 7 8 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51LS1SOUNDER//--------------------------------//名称:播放音乐 //--------------------------------//说明:程序运行时播放生日快乐歌,未使用定时中断, // 所有频率输出完全用延时实现。 //--------------------------------------#include &reg51.h& #define uchar unsigned char #define uint unsigned int sbit BEEP=P3^7; //----------------------//生日快乐歌的音符频率表,不同的频率由不同的延时值来决定 uchar code SONG_TONE[]= {212,212,190,212,159,169,212,212,190,212,142,159, 212,212,106,126,159,169,190,119,119,126, 159,142,159,0}; //生日快乐歌节拍表,节拍决定了每个音符的演奏长短 uchar code SONG_LONG[]= {9,3,12,12,12,24,9,3,12,12,12,24, 9,3,12,12,12,12,12,9,3,12,12,12,24,0}; //----------------------//延时 void DelayMS(uint x) { while (x--) for(t=0;t&120;t++); } //-----------------------//播放子程序 void PlayMusic() { uint i=0,j,k; while(SONG_LONG[i]!=0||SONG_TONE[i]!=0)//节拍, 音符两个数末位 0 为结束标志 { //播放各个音符,SONG_LONG 为节拍长度 for(j=0;j&SONG_LONG[i]*20;j++) { BEEP=~BEEP; //SONG_TONE 延时决定了每个音符的频率 for(k=0;k&SONG_TONE[i]/3;k++); } DelayMS(10); i++; } } //-------------------------------------//主程序 //-------------------------------------void main() { while(1) { PlayMusic();//播放生日快乐歌 DelayMS(500);//播放完 之后暂停一下 } } //如果把 uint i=0,j,k;定义为 uchar i=0,j,k;播放时,不能重复播放 //程序中第一个 for 循环内的 20 为延时倍数, //修改这个值可加快或减缓音乐的播放速度,由于 SONG_LONG[i]*20 会超过 //uchar 的最大值,因袭注意 j 定义为 uint 类型,内层 for 循环中的 3 为频率调节 //修改该值会整体调高或调低音调,但注意降低该值,应适当加大延时节拍, //即加大 20,否则可适当将 20 减小实验二十四INT0 中断计数 RP1RESPACK-722pFU1 X119 XTAL1 12M 18 XTAL2 P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD 39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17 p0.0 p0.1 p0.2 p0.3 p0.4 p0.5 p0.6C222pFR110k9RSTp0.02 p0.13 p0.24 p0.35 p0.46 p0.57 p0.68p1.0 p1.1 p1.2 p1.3 p1.4 p1.5 p1.6C11C310uF 29 30 31 PSEN ALE EAp0.0 p0.1 p0.2 p0.3 p0.4 p0.5 p0.6p1.0 p1.1 p1.2 p1.3 p1.4 p1.5 p1.61 2 3 4 5 6 7 8P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51计数 清零//--------------------------------//名称:INT0 中断计数 //--------------------------------//说明:每次按下计数键时触发 INT0,中断程序累加计数, // 计数值显示在三位数码管上,按下清零键时数码管清零 //--------------------------------------#include &reg51.h& #define uchar unsigned char #define uint unsigned int //----------------------//0-9 的数字编码,最后一个为黑屏 uchar code DSY_CODE[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d, 0x7d,0x07,0x7f,0x6f,0x00}; //计数值分解后的各待显示数位 uchar Display_Buffer[3]={0,0,0}; uint Count=0; sbit Clear_key=P3^6;//定义清零键位 //----------------------//在数码管显示计数值 void Show_Count_ON_DSY() { Display_Buffer[2]=Count/100;//分离获取 3 个数位,百位 Display_Buffer[1]=Count%100/10;//十位 Display_Buffer[0]=Count%10;//个位 if(Display_Buffer[2]==0)//如果高位显示 0 不显示 { Display_Buffer[2]=0x0a; //0x0a 指定显示编码显示第十个数 0x00, if(Display_Buffer[1]==0) //高位为 0 是,如果第二位为 0 时同样不显示 Display_Buffer[1]=0x0a; } P0=DSY_CODE[Display_Buffer[0]];//3 只数码管独立显示 P1=DSY_CODE[Display_Buffer[1]]; P2=DSY_CODE[Display_Buffer[2]]; } //-------------------------------------//主程序 //------------------------------------void main() { P0=0 P1=0 P2=0 IE=0x81;//允许 INT0 中断 IT0=1;//触发方式,下降沿触发 while(1) { if(Clear_key==0)//如果清零键按下 Count=0;//计数值清零 Show_Count_ON_DSY(); //持续刷新显示 } } //--------------------------//INT0 中断函数 void EX_INT0() interrupt 0 { Count++;//计数值递增加 1 } //本程序使用 P3.2-INT0 外部中断按键进行计数,使用外部中断 //设置中断寄存器 IE,先开总中断,然后开中断源(5 个)控制位 //EA,CPU 总中断允许位,EA=1,CPU 开放中断,EA=0,屏蔽所有中断请求 //ES:串行中断允许位,ES=1 允许串口中断,ES=0,禁止串口中断 //ET1():T1 溢出中断允许位,=1 时允许,=0 时禁止 //EX1:外部中断 1-INT1 中断控制位,=1 时允许,=0 时禁止 //ET0:T0 溢出中断允许位,=1 时允许,=0 时禁止 //EX0:外部中断 0-INT0 中断允许控制位,=1 时允许,=0 时禁止 //设置 IE=0X8*(*=1-5)分别允许 EX0,ET0,EX1,ET1,ES 中实验二十五C1220pINT0 中断控制 LEDU119D1P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD 39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17 LED-REDR2220RX1 C2220p CRYSTAL 18XTAL1XTAL2R110k9RSTC310u 29 30 31 PSEN ALE EA1 2 3 4 5 6 7 8P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51中断源//--------------------------------//名称:INT0 中断控制 LED //--------------------------------//说明:每次按键时都会触发 INT0 中断,中断发生时将 LDE 状态取反, // 产生 LDE 开关由按键控制效果。 //--------------------------------------#include &reg51.h& #define uchar unsigned char #define uint unsigned int sbit LED=P0^0; //-------------------------------------//主程序 //------------------------------------void main() { LED=1; EA=1;//开总中断 EX0=1;//允许 INT0 中断,EA 和 EX0 也可用 IE=0X81 代替 TCON=0x01;//即 IT0=1,下降沿触发 while(1); } //--------------------------//外部 INT0 中断函数 void External_Interrupt_0() { }interrupt 0LED=!LED;//控制 LED 亮灭,(!求非符号)实验二十六INT0 及 INT1 中断计数C1 U1220p 19 XTAL1 P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD 39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17 P2.0 P2.1 P2.2 P2.3 P2.4 P2.5X1 C2220p CRYSTAL 18XTAL2R110k9RSTC310u 29 30 31 PSEN ALE EARP1RESPACK-8P.0 P.1 P.2 P.3 P.4 P.5 P.6 P.71 2 3 4 5 6 7 8P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51P.0 P.1 P.2 P.3 P.4 P.5 P.6 P.712 3 4 5 6 7 8 9//--------------------------------//名称:INT0 及 INT1 中断计数 //--------------------------------//说明;每次按下第 1 个计数键时,第一组计数值累加并显示在右边的 3 只管上, // 每次按下第 2 个计数键时,第 2 组计数值累加并显示在左边的 3 只管上, // 后两个按键分别清零 //--------------------------------------#include &reg51.h& #define uchar unsigned char #define uint unsigned intP2.0 P2.1 P2.2 P2.3 P2.4 P2.5P.0 P.1 P.2 P.3 P.4 P.5 P.6 P.7K1 计数二 K2计数二清零一 清零 2 sbit k3=P3^4; sbit k4=P3^5; uchar code DSY_CODE[]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92, 0x82,0xf8,0x80,0x90,0xff};//数码管段码 uchar code Scan_BITs[]= {0x20,0x10,0x08,0x04,0x02,0x01};//数码管位码(扫描码) uchar data Buffer_Counts[]={0,0,0,0,0,0};//2 组显示缓冲 uchar Count_A=0 , Count_B=0;//两个计数值(0-255),定义成 uint 型为(0-65535) //--------------------------------------------------------void DelayMs(uint x) { while(x--)for(t=0;t&120;t++); } //---------------------------------------------------------//数据显示程序 void Show_Counts() { //分解计数值 Count_A Buffer_Counts[2]=Count_A/100; Buffer_Counts[1]=Count_A%100/10; Buffer_Counts[0]=Count_A%10; if(Buffer_Counts[2]==0)//如果高位为 0 时 { Buffer_Counts[2]=0x0a;//不显示 if(Buffer_Counts[1]==0) Buffer_Counts[1]=0x0a; } //分解计数值 Count_B Buffer_Counts[5]=Count_B/100; Buffer_Counts[4]=Count_B%100/10; Buffer_Counts[3]=Count_B%10; if(Buffer_Counts[5]==0)//如果高位为 0 时 { Buffer_Counts[5]=0x0a;//高位不显示 if(Buffer_Counts[4]==0) Buffer_Counts[4]=0x0a; } for(i=0;i&6;i++) { P2=Scan_BITs[i];//显示位码 P1=DSY_CODE[Buffer_Counts[i]];//显示段码 DelayMs(1); } } //-----------------------------------------------//主程序 void main() { IT0=1;//T0 下降沿触发 IT1=1;//T1 下降沿触发 PX0=1;//中断优先级设置 IE=0X85;//INT0,INT1 开中断 while(1) { if(k3==0)Count_A=0;//计数值 A 清零键 K3 if(k4==0)Count_B=0;//计数值 B 清零键 K4 Show_Counts();//显示 } } //--------------------------------//INT0 中断函数 //----------------------------------void EX_INT0() interrupt 0 { Count_A++;//计数值 A 自加 1, } //-----------------------------------//INT1 中断函数 //----------------------------------void EX_INT1() interrupt 2 { Count_B++;//计数值 B 自加 1 }实验二十七TIMER0 控制单只 LED 闪烁 C1 U1220p 19D1P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD 39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17 LED-REDR2220RX1 C2220p CRYSTAL 18XTAL1XTAL2R110k9RSTC310u 29 30 31 PSEN ALE EA1 2 3 4 5 6 7 8P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51//--------------------------------//名称:TIMER0 控制单只 LED 闪烁 //--------------------------------//说明:LED 在定时器中断例程控制下不断闪烁 //--------------------------------------#include &reg51.h& #define uchar unsigned char #define uint unsigned int sbit LED=P0^0; uchar T_Count=0; //主程序 //------------------------------------void main() { TMOD=0x00;//定时器 T0 工作于工作模式 0 TH0=()/32;//5ms 定时 TL0=()%32; IE=0x82;//允许 T0 中断 TR0=1;//启动定时器 while(1); } //--------------------------void LED_Flash() interrupt 1 { TH0=()/32; TL0=()%32;//重装定时器初值; if(++T_Count==100)//5ms*100=500ms,实现 0.5s 定时开关 led { LED=!LED;//LED 求非闪烁 T_Count=0;//计数值清零 } } //本例使用的是定时器中断技术,该技术需要完成以下的工作 //1 设置定时器的工作模式(设置 TMOD) //2 设置定时器初值(设置 TH0/TL0 或 TH1/TL1); //3 允许定时器中断(设置 IE 或单独设置 EA,ET0/ET1); //4 启动定时器(设置 TCON 或单独设置 TR0/TR1)实验二十八C1TIMER0 控制流水灯U119 39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17 D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15 D16 D1220pD1 D2 D3 D4 D5 D6 D7 D8R2220RX1 C2220p CRYSTAL 18XTAL1XTAL2R110k9RSTP0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RDD9D9 D10 D11 D12 D13 D14 D15 D16R10220RD2R3 R4 R5 R6 R7 R8 R9D10R11220R220R D3 D11R12220R220R D4 D12R13220RC310u 29 30 31 PSEN ALE EA220R D5 D13R14220R220R D6 D14R15220R220R D7 D151 2 3 4 5 6 7 8R16220RP1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51220R D8 D16R17220R220R//--------------------------------//名称:TIMER0 控制流水灯 //--------------------------------//说明:定时器控制 P0,P2 端口的 LED 滚动显示,本例没有使用中断程序 //使用 while 循环查询 TF0 是否置位, (即 TF0 是否为 1)来判断是否有计数溢出 //为 1 时表示定时 40ms 已到达,定时到达后,用软件将 TF0 清零,并重装定时寄存器 //为了实现更大的计数,本例仍然使用了对计时进行累加的方法 //--------------------------------------#include &reg51.h& #include &intrins.h& #define uchar unsigned char #define uint unsigned int //-------------------------------------//主程序 //------------------------------------void main() { uchar T_Count=0;//累加计数溢出发生的次数 P0=0 P2=0 TMOD=0x01;//定时器 0 工作于方式 1 TH0=()/256;//设置 40ms 定时器 TL0=()%256; TR0=1;//启动定时器 while(1) {//定时器溢出标志为 1 时表示计时溢出 if(TF0==1)//查询是否有计数溢出 { TF0=0;//软件清零 TH0=()/256;//40ms 定时 TL0=()%256;//重装定时器初值 if(++T_Count==5)//40*5=200ms 后 LED 滚动一次 { P0=_crol_(P0,1); P2=_crol_(P2,1);//循环点亮 LED T_Count=0;//计数器溢出清零 } } } } //本例使用的是定时器中断技术,该技术需要完成以下的工作 //1 设置定时器的工作模式(设置 TMOD) //2 设置定时器初值(设置 TH0/TL0 或 TH1/TL1); //3 允许定时器中断(设置 IE 或单独设置 EA,ET0/ET1); //4 启动定时器(设置 TCON 或单独设置 TR0/TR1) //定时器 4 中工作方式定时时间 //模式 0:定时时间 t=(8192-T0 的初值)X 振荡周期 X12,最大计数值 8192 //模式 1:定时时间 t=(65536-T0 的初值)X 振荡周期 X12,最大计数值 65536 //模式 2:定时时间 t=(256-T0 的初值)X 振荡周期 X12,最大计数值 256 //模式 3:T0 可以设为模式 0-2.T1 不可(通常设为模式 2) //当采用 12MHz 晶振时,经 12 分频后,一个机器周期为 1us,计数频率为 1MHz //所以 T0 的初值的值,就是延时的 us(微秒)值 //1s=1000ms=1000000us,1ms=1000实验二十九TIMER0 控制流水灯 C1 U1220p 19 XTAL1 P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD 39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17D1 D2 D3 D4R2 R3 R4 R5220RX1 C2220p CRYSTAL 18XTAL2220RR110k9RST220RC310u 29 30 31 PSEN ALE EA220R1 2 3 4 5 6 7 8P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51//--------------------------------//名称:TIMER0 控制流水灯 //--------------------------------//说明:4 只 LED 在定时器的控制下滚动闪烁 //--------------------------------------#include &reg51.h& #define uchar unsigned char #define uint unsigned int sbit B1=P0^0; sbit G1=P0^1; sbit R1=P0^2; sbit Y1=P0^3; uint i,j,k; //-------------------------------------//主程序 //------------------------------------void main() { i=j=k=0;//开始时全部关闭 P0=0 TMOD=0x02;//定时器工作于模式 2 TH0=256-200; TL0=256-200;//200us 延时 IE=0x82;//允许 T0 中断 TR0=1;//启动定时器 while(1); } //----------------------------------------void LED_Flash_and_Scroll() interrupt 1 { if(++k&350)//每累计 35 次中断(700ms) ,才执行一次闪烁 k=0; switch(i) { case 0: B1=!B1;//蓝灯闪烁 case 1: G1=!G1;//绿灯闪烁 case 2: R1=!R1;//红灯闪烁 case 3: Y1=!Y1;//黄灯闪烁 default: i=0; } if(++j&10)//每次 LED 持续闪烁(除以 2 为闪烁次数)一段时间(5 次) j=0;//关闭 P0=0 i++;//切换到下一 LED } //本例 TMOD=0x02,工作于模式 2,自动 8 位重装,在该方式下中断例程不必再重新赋 值 //TL0 溢出时触发中断,TH0 保存的值被自动重新赋给 TL0 //备注;运行 K 次后。K=0 执行 switch 语句灯取反,K 清零时 j 就加 1. //再次 K0 灯再取反,形成点亮息灭,j 运行 2 次,j 除以 2 就是点亮或熄灭的次数 //j=0 时,切换到下一个灯,i 的取值为 4,因为执行 case0-3 就清零 //如想仔细看程序执行语句状态,可将 i,j 的值取最小实验三十T0 控制 LED 实现二进制计数 D1D2D3D4D5D6D7D8D9D10D11D12D13D14D15D16R2270R3270R4270R5270R6270R7270R8270R9270R10270R11270R12270R13270R14270R15270R16270R17270101112131415C1 U122p 19C222pX1CRYSTAL 18XTAL1XTAL2R110k9RSTP0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17 9 10 11 12 13 14 15 16C310u 29 30 31 PSEN ALE EA1 2 3 4 5 6 7 81 2 3 4 5 6 7 8P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51K1按键计数SW1SW-SPST100Hz时钟设1Hz 流动慢//T0 控制 LED 实现二进制计数 //----------------------------//说明:本例对按键计数没有使用查询法,没有使用外部中断函数, //也没有使用定时中断或计数中断函数,本例启用了计数器, //连接在 T0 引脚的按键在每次按下时会使计数寄存器的值递增, //计数值直接通过 LED 以二进制的形式显示 //----------------------------#include&reg51.h& //--------------void main() { TMOD=0x05;//设置 T0 为计数器,工作于方式 2,最大计数值 65535 TH0=0x00;//初值为 0 TL0=0x00;// TR0=1;//启动定时器 while (1) { P1=TL0;//定时器低 8 位赋给 P1 P2=TH0;//定时器高 8 位赋给 P216123456789 } }//T0 作为计数器使用时,方式 0-3 的设置和计数值如下所述; //方式 0,TMOD=0X04,TH0 和 TL0 构成 13 位计数器最大计数值 819; //方式 1,TMOD=0X05,TH0 和 TL0 构成 16 位计数器最大计数值 6553; //方式 1,TMOD=0X06,TH0 不会变,仅 TL0 用于计数最大计数值 25; //方式 1,TMOD=0x07,该方式下 TH0 和 TL0 是独立的,TL0 的计数溢出 //值不会向 TH0 进位,因此这种方式的技术最大值也为 255.实验三十一C1 U1220p 19 XTAL1TIMER0 与 TIMER1 控制条形 LEDU2P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD 39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17 20 19 18 17 16 15 14 13 12 11 11 12 13 14 15 16 17 18 19 20 1 2 3 4 5 6 7 8 9 10 10 9 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 220RN1220 16 15 14 13 12 11 10 9 16 15 14 13 12 11 10 9X1 C2220p 11.0592MHz 18XTAL2R110k9RSTU3C310u 29 30 31 PSEN ALE EA1 2 3 4 5 6 7 8P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51LED-BARGRAPH-GRNRN2//--------------------------------//名称:TIMER0 与 TIMER1 控制条形 LED //--------------------------------//说明:定时器 T0 控制上一组条形 LED,滚动显示速度较快, // 定时器 T1 控制下一组条形 LED,滚动显示速度较慢, // 速度有两个定时器所设置的不同延时决定 //--------------------------------------#include &reg51.h& #include &intrins.h& #define uchar unsigned char #define uint unsigned int uchar tc0=0,tc1=0; //-------------------------------------//主程序 //------------------------------------void main() { P0=0 P2=0 TMOD=0x11;//定时器 0.1 都工作于方式 2 TH0=()/256; TL0=()%256;//定时器 0:15ms TH1=()/256; TL1=()%256;//定时器 1:50ms IE=0x8a;//允许定时器 0,1 中断 TR0=1;//启动定时器 0 TR1=1;//启动定时器 1 while(1); } //----------------------------------------//T0 中断函数 void Time0 () interrupt 1 { TH0=()/256; TL0=()%256;//T0 重装初值 if(++tc0==10)//15x10=150ms 移动一次 { tc0=0; P0=_crol_(P0,1); } } //-----------------------------//T1 中断函数 void Time1 () interrupt 3 { TH1=()/256; TL1=()%256;//T1 重装初值 if(++tc1==10)//50x10=500ms 移动一次 { tc1=0; P2=_crol_(P2,1); } }实验三十二10s 的秒表(一键三控) C1 U1220p 19 XTAL1 P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD 39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 2 3 4 5 6 7 8RP11 2 3 4 5 6 7 8 9X1 C2220p 11.0592MHz 18XTAL2R110k9RSTC310u 29 30 31 PSEN ALE EA1 2 3 4 5 6 79 10 11 12 13 14 151 2 3 4 5 6 7 8P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C517SEG-17SEG-2开始 /暂停 /清零//--------------------------------//名称:10s 的秒表(一键三控) //--------------------------------//说明:首次按键计时开始,再次按下暂停,第三次按下清零 //--------------------------------------#include &reg51.h& #define uchar unsigned char #define uint unsigned int sbit K1=P3^7; uchar i,Second_Counts,Key_Flag_I bit Key_S uchar code DSY_CODE[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //-------------------------------------------------//延时程序 void DelayMS(uint x) { while(x--) for(t=0;t&120;t++); } //------------------------------------------------//处理按键事件 void Key_Event_Handle() { if(Key_State==0) { Key_Flag_Idx=(Key_Flag_Idx+1)%3;//按键次数加 1 求余 switch(Key_Flag_Idx) { case 1: EA=1;ET0=1;TR0=1;//开始 case 2: EA=0;ET0=0;TR0=0;//停止 case 0: P0=0x3f;P2=0x3f;i=0;Second_Counts=0;//清零 } } } //主程序 //------------------------------------void main() { P0=0x3f;//首先显示 00,即 0.0s P2=0x3f; i=0; Second_Counts=0; Key_Flag_Idx=0;//按键次数(取值为 0,1,2,3) Key_State=1;//按键状态,初始化为 1 TMOD=0x01; TH0=()/256; TL0=()%256; while(1) { if(Key_State!=K1)//如果 K1 不等于 1 { DelayMS(10); Key_State=K1;//K1 值赋给 Key_Event_Handle();//调用按键处理子程序 } } } //----------------------------------------//T0 中断程序 void DSY_Refresh () interrupt 1 { TH0=()/256; TL0=()%256;//50ms 定时 if(++i==2)//每 50X2=100ms 刷新一次 { i=0; ++Second_C//Second_Counts 自加 1 P0=DSY_CODE[Second_Counts/10];//分离显示高位 P2=DSY_CODE[Second_Counts%10];//分离显示低位 if(Second_Counts==100) Second_Counts=0;//如果数等于 100,清零 } } //本例一键实现三项功能,使用查询法,每次按下键时按键的标志索引 //变量会在 0.1.2.3 三个数之间循环取值,实现语句为 //key_Flag_Idx=(key_Flag_Idx+1)%3 //索引为 1 时表示计时开始,定时器中断被许可,定时器启动 //索引为 2 时表示计时停止,定时器中断被禁止,定时器停止运行 //索引为 0 时表示计时清零,0 出现在 2 之后,定时器已停止因此将 //相应的变量清零就可以实验三十三C1用定时器中断实现 100 以内的按键计数RP11U1220p 19X1 C2220p 11.0592MHz 18XTAL1XTAL2R110k9RSTP0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 171 2 3 4 5 6 7 8 9 10 11 12 13 14 151 2 3 4 5 6 7 82 3 4 5 6 7 8 9C310u 29 30 31 PSEN ALE EA1 2 3 4 5 6 79 10 11 12 13 14 151 2 3 4 5 6 7 8P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C517SEG-1k1计数 K2清零7SEG-2//--------------------------------//名称:用定时器中断实现 100 以内的按键计数 //--------------------------------//说明:本例用 T0 中断实现按键计数,由于寄存器的初值为 1, //因此 P3.4 引脚的每次负跳变都会触发 T0 中断,实现计数值累加, //计数值得清零用外部中断 0 控制 //--------------------------------------#include &reg51.h& #define uchar unsigned char #define uint unsigned int uchar Count=0; uchar code DSY_CODE[]= { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f ,0x00}; //---------------------------------------------------//主程序 //------------------------------------- void main() { P0=0x00; P2=0x00; TMOD=0x06;//T0 工作于方式 2 TH0=TL0=256-1;//计数值为 1 ET0=1;//允许 T0 中断 EX0=1;//允许 INT0 中断 EA=1;//开总中断 IP=0x02;//设置优先级 IT0=1;//INT0 设为下降沿触发 TR0=1;//启动定时器 while(1) { P0=DSY_CODE[Count/10];//显示计数值高位 P2=DSY_CODE[Count%10];//显示计数值低位 } } //----------------------------------------//INT0 中断函数 void Clear_Count () interrupt 0 { Count=0;//数清零 } //----------------------------------------//T0 计数中断函数 void Key_Counter () interrupt 1 { Count=(Count+1)%100;//因为只有两个数码管,计数值控制在 100 以内 }实验三十四100000s 以内的计时程序 9 10 11 12 13 14 15 16RP11 2 3 4 5 6 7 8 9U1220p 191 2 3 4 5 6 7 8C1XTAL1 P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RDU239 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17 1 2 3 4 5 6 7 8 RX8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 2 3 4 5 6 7 8 9 19 1 A0 A1 A2 A3 A4 A5 A6 A7 CE AB/BA 74LS245 B0 B1 B2 B3 B4 B5 B6 B7 18 17 16 15 14 13 12 11 9 10 11 12 13 14 15 16X1 C2220p 11.0592MHz 18XTAL2R110k9RSTC310u 29 30 31 PSEN ALE EARN116 15 14 13 12 11 10 9 17 18 19 20 21 221 2 3 4 5 6 7 8P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51//--------------------------------//名称:100000s 以内的计时程序 //--------------------------------//说明:在六只数码管上完成 0-99999.9s 的计时 //--------------------------------------#include &reg51.h& #include &intrins.h& #define uchar unsigned char #define uint unsigned int uchar C sbit Dot=P0^7; uchar code DSY_CODE[]= { 0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f};17 18 19 20 21 22 uchar Digits_of_6DSY[]={0,0,0,0,0,0};//显示数组定义 //---------------------------------//延时程序 //------------------------------------void DelayMS(uint x) { while(x--) for(i=0;i&120;i++); } //-------------------------------------//主程序 //------------------------------------void main() { uchar i,j; P0=0x00; P3=0 Count=0; TMOD=0x01; TH0=()/256; TL0=()%256;//50ms 延时 IE=0x82;//允许定时器 T0 中断 TR0=1;//定时器启动 while(1) { j=0x7F; for(i=5;i!=-1;i--) //显示 Digits_of_6DSY[6]--Digits_of_6DSY[0]的内容 //前面的的是高位,后面的是低位循环中 i!=1 还可以写成 0xff //但不要改写成 i&=0,除非将 i 定义为 char 类型 { j=_crol_(j,1); P3=j; P0=DSY_CODE[Digits_of_6DSY[i]];//显示数位 if(i==1) Dot=1;//加小数点 //if(i==1) P0|=0x80;// DelayMS(2); } } } //----------------------------------------void Clear_Count () interrupt 1 { TH0=()/256; TL0=()%256;//50ms 定时 if(++Count!=2) Count=0; Digits_of_6DSY[0]++;//0.1s 位累加 for(i=0;i&=5;i++)//进位处理 { if(Digits_of_6DSY[i]==10) { Digits_of_6DSY[i]=0; //如果是 0-4 位则分别向高一位进位 if(i!=5)Digits_of_6DSY[i+1]++; } //循环过程中如果某个低位没有进位,则循环可以提前结束 } } //注意数码管的段码必须完整否则不能正常显示,进位时黑屏实验三十五定时器控制数码管动态显示 16 15 14 13 12 11 10 9RN1RX8P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 1 2 3 4 5 6 7 8C1 U1220p 19 XTAL1 P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD 39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17 Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7X1 C2220p CRYSTAL 18XTAL2R110k9RSTC310u 29 30 31 PSEN ALE EA1 2 3 4 5 6 7 8P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51注意再用软件仿真 是 P3 口不要加三极管放大驱动,否则不能正常显示 //--------------------------------//名称:定时器控制数码管动态显示 //--------------------------------//说明:8 只数码管上分两组动态显示年月日和时分秒, //本例的位显示延迟用定时器实现, //未使用前面案例中常用的延时函数 //--------------------------------------#include &reg51.h& #include &intrins.h& #define uchar unsigned char #define uint unsigned int uchar code DSY_CODE[]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92, 0x82,0xf8,0x80,0x90,0xbf};//共阳极数码管段码,0xbf 为’-‘段码, /*{Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 0x3f,0x06,0x5b,0x4f,0x66,0x6b,0x7d, 0x7f,0x6f ,0x00};*///共阴极数码管段码 //待显数字 09-12-25 与 21-57-39 分两组显示 uchar code Table_OF_Digits[][8]= { {0,9,10,1,2,10,2,5} , //年,月,日 {2,1,10,5,7,10,3,9}//时,分,秒 }; uchar i=0,j=0; uint t=0; //---------------------------------//主程序 //------------------------------------void main() { P3=0x80;//位码初值 TMOD=0x00;//T0 工作于方式 0 TH0=()/32; TL0=()%32;//4ms 定时 IE=0x82; TR0=1; while(1);//主程序无限延时,定时器中断持续触发 } //----------------------------------------void DSY_Show () interrupt 1 { TH0=()/32; TL0=()%32;//延时 4ms P3=_crol_(P3,1);//输出位码 P0=DSY_CODE[Table_OF_Digits[i][j]];//输出段码 j=(j+1)%8;//数组 i 行的下一字节索引 if(++t!=350)//每组的 8 个数字保持刷新一段时间 1.25s t=0;//刷新若干遍次数后切换 i=(i+1)%2;//数组行 i=0 时显示年月日,i=1 时显示时分秒 }实验三十六8*8LED 点阵屏显示数字 RP11U1220p 191 2 3 4 5 6 7 8C1XTAL1 P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD2 3 4 5 6 7 8 9U239 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17 A0 A1 A2 A3 A4 A5 A6 A7 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 2 3 4 5 6 7 8 9 19 1 A0 A1 A2 A3 A4 A5 A6 A7 CE AB/BA 74LS245 B0 B1 B2 B3 B4 B5 B6 B7 18 17 16 15 14 13 12 11 9 10 11 12 13 14 15 16X1 C2220p 11.0592MHz 18XTAL2R110k9RSTC310u 29 30 31 PSEN ALE EA1 2 3 4 5 6 7 8P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51几列是由定义的数组决定的A0-A3 控制低四个点亮 A4-A7 控制高四个点亮//--------------------------------//名称:8*8LED 点阵屏显示数字 //--------------------------------//说明:8X8 点阵屏循环显示数字 0-9,刷新过程有定时器操作完成 //--------------------------------------#include &reg51.h& #include &intrins.h& #define uchar unsigned char #define uint unsigned int uchar code Table_OF_Digits[]= { 0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,0x00,//0 0x00,0x00,0x00,0x21,0x7f,0x01,0x00,0x00,//1 0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00,//2 0x00,0x22,0x49,0x49,0x49,0x36,0x00,0x00,//3 0x00,0x0c,0x14,0x24,0x7f,0x04,0x00,0x00,//4 0x00,0x72,0x51,0x51,0x51,0x4e,0x00,0x00,//5 0x00,0x3e,0x49,0x49,0x49,0x26,0x00,0x00,//6 0x00,0x40,0x40,0x40,0x4f,0x70,0x00,0x00,//7 0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00,//8 0x00,0x32,0x49,0x49,0x49,0x3e,0x00,0x00,//9 }; uchar i=0,Num_Index=0;9 10 11 12 13 14 15 16A0 A1 A2 A3 A4 A5 A6 A7 uint t=0; //---------------------------------//主程序 //------------------------------------void main() { P3=0x80; Num_Index=0;//从 0 开始显示 TMOD=0x00;//T0 工作于方式 0 TH0=()/32; TL0=()%32;//4ms 定时 TR0=1; IE=0x82;//允许 T0 外部中断 while(1);//主程序无限延时,定时器持续触发 } //----------------------------------------//T0 中断程序 void LED_Screen_Digplay () interrupt 1 { TH0=()/32; TL0=()%32;//重装定时器延时初值 P3=_crol_(P3,1);//位码 P0=~Table_OF_Digits[Num_Index*8+i];//显示段码 if(++i==8) i=0;//每屏一个数字由 8 字节组成 if(++t==250)//每屏数字刷新显示时间 { t=0x00; if(++Num_Index==10) Num_Index=0;//显示下一数字 } }//变量 Num_Indexs 表明了要显示的数字,取值范围 0--9,变量 i 的取值 //范围为 0-7 表达式 Table_OF_Digits[Num_Index*8+i]使程序取得第 Num_Index //个数的字节。 //每一个数(0x00)扫描一列,由 8 个(0X00)数组成一组扫描 8 行实验三十七8*8LED 点阵屏显示图形 RP11U1220p 191 2 3 4 5 6 7 8C1XTAL1 P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD2 3 4 5 6 7 8 9U239 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 2 3 4 5 6 7 8 9 19 1 A0 A1 A2 A3 A4 A5 A6 A7 CE AB/BA 74LS245 B0 B1 B2 B3 B4 B5 B6 B7 18 17 16 15 14 13 12 11 9 10 11 1

我要回帖

更多关于 单片机编程流水灯 的文章

 

随机推荐