整个名容易 整个名容易
关注数: 24 粉丝数: 455 发帖数: 4,329 关注贴吧数: 18
从流水灯到电子时钟(C语言+proteus) 51单片机是由英特尔公司设计的单片机,他内部包含了CPU,RAM,ROM(8031以下没有)IO接口等硬件,它被广泛的用于我们生活的每一个角落。 proteus是一款很好的仿真软件,它的原件库中有好多的逻辑器件,它可以很好的仿真单片机,也可以方便的制做电路板。 KEIL是用于开发51单片机的软件,他的界面和VC6很像,他内置了实时操作系统RTOS,无论你是用汇编语言还是用C语言开发单片机,KEIL都是一个不错的选择。 以后我们将会用以上三个软件开始我们的旅程,漫游在单片机的世界中。 我们先来看看一proteus,先试试做流水灯用的原件, 我们启动proteus后会出现如下的界面我们点击工具栏右边那个有一个P的按钮,这时出现了一个新的窗口,这就是选择原件的窗口,我们在找到Optoelectronics这一项,然后在右侧的原件选择窗口串找到LED-RED,LED-GREEN,LED-YELLOW,找到后分别双击它们,这时我们看到proteus主窗口的工具栏右面出现了这三个原件,当然,这表明我们已经从原件库中选择了这三个原件,然后我们再在原件库窗口左边的库分类选择表中找到Switches & Relay,然后在右边的窗口中找到BUTTON,同样双击它,然后关闭原件库,这样我们要用的原件就都选好了, 下一步开始画原理图 我们先在proteus主界面左侧添加的原件中选择LED-RED,这是一个红色的发光二极管,我们用鼠标的左键单击它,然后把鼠标移动到PROTEUS的主界面上,在合适的位置按下鼠标的左键,这时我们看到了原来的画笔被选中的原件代替,我们把原件移动到合适的位置,在次按下鼠标的的左键,原件就被画在了图纸上,是不是这个原件有点太小了,没关系,我们只要转动鼠标的滚轮就可以改变画布的大小,给它放大一些,这样更容易连线 用同样的方法将BUTTON也画到LED的旁边,然后在左边的工具栏中选择终端的选项卡,选择POWER将它画到按钮的旁边,在选择GROUND,将它画到LED的旁边,选好了之后,我们把鼠标移动到原件的引脚处,这时鼠标由画笔变成了方框,这时在单击鼠标,就可以连线了,我们把线连成这样 然后单击界面下面的那个黑色的右侧键头,然后在用鼠标点击图纸上的按按原件,看看郊果
铝合金的你要的程序 这个是main.c文件 #include<at89x52.h> #include<stdio.h> #include"leddrive.c" /************************************************/ #define Spk P2_6//接蜂鸣器 /* extern KeyData; extern LedData[]; extern ledscan(); */ unsigned char comm[7];//通讯缓冲,发送接收都用 unsigned char comprt;//缓冲区指针 unsigned char comtime;//串口接收超时限制 bit cominit;//收到数据指示 ///////////////////////////////////////////////// void beep(char n) { unsigned int i; do { Spk = 0; i = 500; while(i--); Spk = 1; i = 500; while(i--); } while(n--); } comminte()interrupt 4//串口中断 { unsigned char n; if(RI && !cominit)//收到数据 { RI = 0; if(comprt == 0)//接收第一位时清空缓冲区 { for(n=0 ; n<6 ; n++) { comm[n] = 0; } } comm[comprt] = SBUF;//收到的数据存入缓冲 comtime = 10;//10毫秒超时限制 comprt++;//接收缓冲地址加1 } } void comsend(void)//发送缓冲区内的数据 { unsigned char n; for(n=0 ; n<6 ; n++) { if(comm[n] == 0) break; while(!TI); SBUF = comm[n]; TI = 0; } } /*************************************************************/ timer0()interrupt 1//定时器0中断,用于超时限制 { TH0 = 0xfc;//重置定时器 TL0 = 0x66;//定时5ms if(comtime != 0) { comtime--;//计时 if(comtime == 0)//接收超时,表示收到了数据 { cominit = 1;//给主程序一个提示 comprt = 0; } } ledscan();//显示 } /***************************************************************/ FindErr()//检查是否包含非法字符 { unsigned char n; for(n=0 ; n<6 ; n++) { if (comm[n]<0x30 || comm[n]>0x39)//收到非数字的字符 { n = 9; break;//终止执行 } } return n;//返回执行结果 } /****************************************************************/ void exekey(unsigned char n)//执行按键 { switch(n) { case 1://按下1时千位加1 if(++LedData[3]>9) LedData[3] = 0; break; case 2://按下2时百位加1 if(++LedData[2]>9) LedData[2] = 0; break; case 3: if(++LedData[1]>9) LedData[1] = 0; break; case 4: if(++LedData[0]>9) LedData[0] =0; break; case 5: for(n=0 ; n<6 ; n++)//清空通讯缓冲 { comm[n] = 0; } comm[0] = LedData[3]+48;//要发送的数字送到缓冲 comm[1] = LedData[2]+48; comm[2] = LedData[1]+48; comm[3] = LedData[0]+48; comsend();//发送数据 break; } } /******************************************************/ main() { unsigned char n; int i; TMOD = 0x21;//初始化串口 SCON = 0x50; TH0 = 0xFC;//1ms定时 TL0 = 0x66; TH1 = 0xFD;//11.0592mhz时9600位 TL1 = 0xFD; EA = 1; ES = 1; ET0 = 1; TR0 = 1; TI = 1; TR1 = 1;
首页 1 2 下一页