51单片机简易程序.docx
- 文档编号:23607947
- 上传时间:2023-05-19
- 格式:DOCX
- 页数:16
- 大小:17.75KB
51单片机简易程序.docx
《51单片机简易程序.docx》由会员分享,可在线阅读,更多相关《51单片机简易程序.docx(16页珍藏版)》请在冰豆网上搜索。
51单片机简易程序
1. 点亮你的LED灯
a. 程序
/**LED接P0,低电平有效**/
#include
typedefunsignedcharuchar; //宏定义,末尾有分号
uchari,j,temp;
voiddelay(unsignedintms) //延时函数
{
uchart;
while(ms--)
for(t=0;t<123;t++);
}
voidmain()
{
P1=0xff;
temp=0xff; //灯全灭
while
(1)
{
for(i=0;i<8;i++)
{
delay(100);
//temp左移i个单位,再按位取反
temp=~(1<
P1=temp;
delay(100);
}
for(j=7;j>0;j--)
{
delay(100);
temp=~(1< P1=temp; delay(100); } } } 2. 数码管显示 共阴极数码管编码: 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; 共阳极数码管编码: 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; /***数码管接P0,1、3显示相同,2、4相同***/ #include typedefunsignedintuint; typedefunsignedcharuchar; voidDelay_1ms(uinti); voiddisplay(intx,inty); //定义一个数组,赋值为0123456789 ucharseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchari,j; voidmain() { while (1) { display(10,10); //x,y初值为10 } } voidDelay_1ms(uinti) //1ms延时 { ucharx,j; for(j=0;j for(x=0;x<=148;x++); } voiddisplay(intx,inty) { inti,j,shi,ge; for(i=x;i>0;i--) { for(j=0;j { shi=i/10; ge=i%10; P2=0X01; //数码管只亮一位 P0=seg[shi]; Delay_1ms(10); P2=0X02; //数码管亮两位 P0=seg[ge]; Delay_1ms(10); } } } 3. 外部中断 外部中断0: 函数名()interrupt0 接P3^2; 定时器计时器0: 函数名()interrupt1; 外部中断1: 函数名()interrupt2 接P3^3; 定时器计时器1: 函数名()interrupt3; 串行口中断: 函数名()interrupt4; EA为CPU中断允许标志。 EA=1时,开放中断,EA=0时,关闭所有中断; ES为串行口中断允许位。 ES=1时,允许串行口中断; ET0为定时器计数器0中断允许位。 ET0=1时,允许T0中断; ET1为定时器计数器1中断允许位。 ET1=1时,允许T1中断; EX0为外部中断0中断允许位。 EX0=1时,允许外部中断0中断; EX1为外部中断1中断允许位。 EX1=1时,允许外部中断0中断; IE1: 外部中断1请求标志; IT1: 外部中断1触发方式选择位; IE0: 外部中断0请求标志; IT0: 外部中断0触发方式选择位; TR1: 定时器1运行控制位。 由软件清‘0’关闭定时器1; TF1: 定时器1溢出标志。 中断优先级: D7 D6 D5 D4 D3 D2 D1 D0 -- -- -- PS PT1 PX1 PT0 PX0 #include voiddelay(unsignedintms); typedefunsignedcharuchar; uchari,j,temp; voiddelay(unsignedintms) //延时函数 { uchart; while(ms--) for(t=0;t<123;t++); } /**************************************** *外部中断0 *灯: P1 *功能: 全亮 ****************************************/ voidISR1()interrupt0 { temp=P1; P1=0X00; delay(200);delay(200);delay(200);delay(200); P1=temp; } /*************************************** *外部中断1 *灯: P1 *功能: 全灭 ****************************************/ voidSISR()interrupt2 { temp=P1; P1=0xFF; delay(200);delay(200);delay(200);delay(200); P1=temp; } voidmain(void) { P1=0xff; temp=0xff; //使外部中断1的优先级高于外部中断0 IP=0x04; IT1=1; EX1=1; EX0=1; EA=1; while (1) { for(i=0;i<8;i++) { delay(100); temp=~(1< P1=temp; delay(100); } for(j=7;j>0;j--) { temp=0xff; delay(100); temp=~(1< P1=temp; delay(100); } } } 4. 定时器0 A. 定时器计时器的核心部件是二进制加1计数器 1. 定时功能: 计数输入信号时内部时钟脉冲,每个机器周期使计数器的值加1; 2. 计数功能: 计数脉冲来自相应的外部引脚,T0为P3^4,T1为P3^5; B. 定时器计数器共有四种工作方式 1. 方式0: 13位方式: 低5为,高8位; 2. 方式1: 16位方式: 低8位,高8位; 3. 方式2: : 8位自动装入时间常数方式; 4.方式3: 双8位方式; #include #include typedefunsignedcharuchar; uchartt,temp; voidT0ISR()interrupt1 { TH1=(65535-10000)/256; TL1=(65535-10000)%256; P0=temp; tt++; if(tt==2) { tt=0; P0=temp; temp=_crol_(temp,1); //temp左移1个单位 } } voidmain(void) { TMOD=0x01; TR0=1; ET0=1; EA=1; temp=0xfe; while (1); } 5. 用液晶屏1602第一行显示英文名字,第二行显示学号 读状态输入: RS=L,RW=H,E=H 输出: D0~D7=状态字 读数据输入: RS=H,RW=H,E=H 输出: 无 写指令输入: RS=L,RW=L,E=高脉冲 输出: D0~D7=状态字 写数据输入: RS=H,RW=L,E=高脉冲 输出: 无 /*********1602接P0********/ /*RS接P2^5 /*RW接P2^6 /*EN接P2^7 /*****************************/ #include #include typedefunsignedcharuchar; typedefunsignedintuint; ucharcodetable[]="Shmily"; ucharcodetable1[]="12054126"; sbitrs=P2^5; sbitrw=P2^6; sbite=P2^7; uchari; voiddelay(unsignedintt) //延时函数 { unsignedinti; for(t;t>0;t--) for(i=120;i>0;i--); } voidwrite_com(ucharcom) //写指令函数 { rs=0; //指令 rw=0; //写入 P0=com;//将要写的命令字送到数据总线上 delay(5); //使能端给一高脉冲,因为初始化函数中将e置零 e=1; delay(5); e=0; } voidwrite_data(uchardat) //写数据函数 { rs=1; //数据 rw=0; //写入 P0=dat; delay(5); e=1; //允许 delay(5); e=0; } voidinit() //初始化函数 { rw=0; e=0; write_com(0x38); //设置八位格式,两行 write_com(0x0c); //整体显示关光标不闪烁 write_com(0x06); //设置输入方式增量不移位 write_com(0x01); //清屏 } voidmain() { init(); while (1) { //命令先将数据指针定位到第一行第一个字处,然后写完第一行要显示的字,在每两个字之间做简短延时 write_com(0x80); for(i=0;i<6;i++) { write_data(table[i]); delay(200); } write_com(0xc0); for(i=0;i<8;i++) { write_data(table1[i]); delay(200); } } } 5.用ADC00808和1602实现AD转换/************************************************* **EN接P2^7 WR接P2^6 RS接P2^5 **ST接P3^0 OE接P3^1 EOC接P3^2 CLK接P3^3 **1602接P0 ADC0808接P1 *************************************************/ #include #include typedefunsignedcharuchar; typedefunsignedintuint; floatgetdata; uinttemp; unsignedchardispbuf[8]={10,10,10,10,10,0,0,0}; uchar*p="0123456789"; sbitST=P3^0; sbitOE=P3^1; sbitEOC=P3^2; sbitCLK=P3^3; sbitrs=P2^5; sbitrw=P2^6; sbite=P2^7; voiddelay(unsignedintt) //延时函数 { unsignedinti; for(t;t>0;t--) for(i=120;i>0;i--); } voidwrite_com(ucharcom) //写指令函数 { rs=0; //选择写命令模式 rw=0; //写入 P0=com; //将要写的命令字送到数据总线上 delay(5); //使能端给一高脉冲,因为初始化函数中将e置零 e=1; delay(5); e=0;//将使能端置0以完成高脉冲 } voidwrite_data(uchardat) //写数据函数 { rs=1; //选择写数据命令模式 rw=0; //写入 P0=dat; delay(5); e=1; delay(5); e=0; } voidinit() //初始化函数 { rw=0; e=0; write_com(0x38); //设置8位格式两行 write_com(0x0c); //整体显示关光标不闪烁 write_com(0x06); //设置输入方式增量不移位 write_com(0x01); //清屏 } voidmain() { init(); ST=0; OE=0; ET0=1; //允许定时器计时器0中断 EA=1; //打开中断总开关 TMOD=0x12; TH0=246; TL0=226; TR0=1; //定时器0运行控制位,当软件清0时,关闭定时器0 ST=0; write_com(0x01); //清屏 while (1) { uchari; if(EOC==1) { OE=1; getdata=P1; OE=0; //AD 转换: 255/5=实(AD)/输出 temp=getdata*5/255*100-1; write_data(p[temp/100]);//输出整数位 write_data('.');//输出小数点 write_data(p[temp/10%10]);//显示小数位 write_data(p[temp%10]); write_data('V'); //显示‘V’ ST=1; //AD转换启动信号 ST=0; //ST由1变为0时,开始转换 } delay(200); write_com(0x01); } } Voidtime0(void)interrupt1using0 //定时器计数器0 { CLK=~CLK; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 简易程序