




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、本人对单片机的一些了解,在这里和大家分享。(1)基于AT89C52的同步串口通信 单片机1程序(程序在Kile C51上运行通过。) /* 文件名 : 液晶1602显示.c* 描述 : 该程序实现了对液晶1602的控制。* 创建人 : 东流,2009年4月10日* 版本号 : 2.0*/#include<reg52.h>#define uchar unsigned char#define uint unsigned int/这三个引脚参考资料sbit E=P35;/1602使能引脚sbit RW=P36;/1602读写引脚sbit RS=P37;/1602数据/命令选择引脚sbit
2、 aaa=P10;sbit bbb=P11;sbit aa=P30;sbit bb=P31;/* 名称 : delay()* 功能 : 延时,延时时间大概为140US。* 输入 : 无* 输出 : 无*/void delay()int i,j;for(i=0; i<=100; i+)for(j=0; j<=20; j+);/* 名称 : enable(uchar del)* 功能 : 1602命令函数* 输入 : 输入的命令值* 输出 : 无*/void enable(uchar del)P2 = del;RS = 0;RW = 0;E = 0;delay();E = 1;dela
3、y();/* 名称 : write(uchar del)* 功能 : 1602写数据函数* 输入 : 需要写入1602的数据* 输出 : 无*/void write(uchar del)P2 = del;RS = 1;RW = 0;E = 0;delay();E = 1;delay();/* 名称 : L1602_init()* 功能 : 1602初始化,请参考1602的资料* 输入 : 无* 输出 : 无*/void L1602_init(void)enable(0x01);enable(0x38);enable(0x0c);enable(0x06);enable(0xd0);/* 名称 :
4、 L1602_char(uchar hang,uchar lie,char sign)* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下 L1602_char(1,5,'b')* 输入 : 行,列,需要输入1602的数据* 输出 : 无*/void L1602_char(uchar hang,uchar lie,char sign)uchar a;if(hang = 1) a = 0x80;if(hang = 2) a = 0xc0;a = a + lie - 1;enable(a);write(sign);/* 名称
5、: L1602_string(uchar hang,uchar lie,uchar *p)* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下 L1602_string(1,5,"ab cd ef;")* 输入 : 行,列,需要输入1602的数据* 输出 : 无*/void L1602_string(uchar hang,uchar lie,uchar *p)uchar a;if(hang = 1) a = 0x80;if(hang = 2) a = 0xc0;a = a + lie - 1;enab
6、le(a);while(1)if(*p !='0') write(*p); else break;p+;/* 名称 : Main()* 功能 : 主函数* 输入 : 无* 输出 : 无*/void Main()uchar k="sbuf data:"uchar i = 122,j=1,ti=14;aaa=1;bbb=1;aa=1;bb=1;SM0=0;SM1=0;SM2=0;REN=1;L1602_init();L1602_char(1,5,SBUF);L1602_string(1,1,k); while(ti>=0)while(1)if(aaa=0)
7、bbb=0;break; aaa=1;bbb=1;i-;i-;i-;i-;i-;i-;RI=0;while(1)if(RI!=0)break;L1602_char(2,j,SBUF);j+;ti-; REN=0;RI=1;while(5)i=0; 单片机2程序#include<reg52.h>sbit a=P20;sbit b=P21;sbit C=P31;void main()int i=0 ,j=0;char str20=" " a=1;b=1; SM0=0;SM1=0; SM2=0;/RI=0; while(j<=14)for(i=0;i<=1
8、00;i+);a=0;/SBUF=0;while(1)if(b=0)break;b=1;a=1;SBUF=strj;TI=0;j+;while(1);(2)基于MSP430的科学计算器单片机程序:(程序在IAR430上运行通过。)#include <msp430x24x.h> #include <STDLIB.h> #include <STRING.h> #include <float.h>#include <math.h>unsigned char dis1="WORK START"/状态显示unsigned c
9、har dis2="ALCOHOL TEST"char dis,j,a,c,cls=" "char ak,ch=1,aa20,bb20;char i=0,n=0,m=0,flag=1,pf=1,dnf=0,deng=0,du=0;double sum=0,sum1=0;/int c=7;void delay(unsigned char ms) /延时1unsigned char i,j;while(ms-)for(i=0;i<65;i+)for(j=0;j<50;j+)void delay2(unsigned int time ) /延时2u
10、nsigned int n;n=0;while (n<time) n+;return;char lcd_bz() /LCD判忙char result;P4OUT=0X8E;/rs=0;/rw=1;/ep=1;P1DIR=0X00;result=P1IN&0x80;/ep=0;P4OUT=0X8A;return result;lcd_wcmd(unsigned char cmd) /写指令数据到LCDwhile(lcd_bz()/rs=0;/rw=0;/ep=1;P4OUT=0X8c;P1DIR=0XFf;P1OUT=cmd;/ep=1;P4OUT=0X8C;/ep=0;P4OUT
11、=0X88;lcd_pos(unsigned char pos) /设定显示位置lcd_wcmd(pos | 0x80);lcd_wdat(unsigned char dat) /写入显示数据到LCDwhile(lcd_bz();/rs=1;/rw=0;/ep=0;P4OUT=0X89;P1DIR=0Xff;P1OUT=dat;/ep=1;P4OUT=0X8D;/ep=0;P4OUT=0X89;lcd_init() /LCD初始化lcd_wcmd(0x38);delay(1);lcd_wcmd(0x0c);delay(1);lcd_wcmd(0x06);delay(1);lcd_wcmd(0x
12、01);delay(1);unsigned char key_scan() unsigned char t,k1,k2,key; unsigned int kt; P3DIR=0X00; P5DIR=0Xff; / P3OUT=0XFF; P5OUT=0x00; / P3DIR=0X00; / P3IN|=0XFF; / P3DIR=0X00; t=P3IN; / P3DIR=0XFF; / P6DIR=0XFF; if(t!=0xFF) delay(10); / P3DIR=0X00; t=P3IN; / P3DIR=0XFF; / P6DIR=0X00; if(t!=0xFF) /P3DI
13、R=0XFF; / P3DIR=0X00; k1=P3IN; P5OUT=0X00; P3DIR=0XFF; P5DIR=0X00; / P6OUT|=0xFF; P3OUT=0x00; / P3DIR=0XFF; / P3OUT=0xff;/ P3OUT=0x00; P5DIR=0X00; / P6DIR=0X00; / P6IN|=0XFF; k2=P5IN; P2DIR=0XFF; P2OUT=k2; P3OUT|=0X00;/ k2|=0xC0; kt=k1; kt=kt<<8; kt+=k2; switch(kt) case 0xFEFE: key='3'
14、break;case 0xFDFE: key='2'break;case 0xfbfe: key='1'break;case 0xf7fe: key='B'break;case 0xeffe: key='U'break;/2ndf/case 0xdffe: key=23;break;/case 0xbffe: key=22;break;case 0xfEFD: key='6'break;case 0xFDFD: key='5'break;case 0xfbfd: key='4'bre
15、ak;case 0xf7fd: key='t'break; case 0xeffd: key='r'break;/du/rad/case 0xdffd: key=16;break;/case 0xbffd: key=15;break;case 0xfefb: key='9'break;case 0xfdfb: key='8'break;case 0xfbfb: key='7'break;case 0xf7fb: key='s'break; case 0xeffb: key='Z'br
16、eak;/sin/case 0xdffb: key=9;break;/case 0xbffb: key=8;break;case 0xfef7: key='c'break;case 0xfdf7: key='.'break;case 0xfbf7: key='0'break;case 0xf7f7: key='k'break;/y case 0xeff7: key='y'break;/cos/case 0xdff7: key=2;break;/case 0xbff7: key=1;break; case 0xfee
17、f: key='/'break;case 0xfdef: key='-'break;case 0xfbef: key='P'break; case 0xf7ef: key='D'break;/ 1/x case 0xefef: key='a'break;/tan/case 0xdfef: key=2;break;/case 0xbfef: key=1;break; case 0xfedf: key='='break;case 0xfddf: key='*'break;case 0xf
18、bdf: key='+'break;case 0xf7df: key='p'break;/pi/e case 0xefdf: key='l'break;/log/case 0xdfdf: key=2;break;/case 0xbfdf: key=1;break;default: key=32;break; return key; else return(32); else return(32);void gcvt()char p20="",p120="",k=0;char i=0,b=0;double z
19、;unsigned long y; if(sum<0)pk='-'sum=0-sum;k+; y=(unsigned long)sum; z=sum-y; if(y) while(y) p1b=y%10+0x30;y/=10;b+; else p10=0+0x30; b=strlen(p1); for(i=0;i<strlen(p1);i+,k+,b-) pk=p1b-1; for(i=0;i<20;i+)aai=0;p1i=0; k=0;i=0; p1k='.'k+; while(z!=0.0)&&(i!=6) z=z*10;
20、 y=(int)(z); z-=y; p1k=y+0x30;k+;i+; for(i=0;i<20;i+)aai=0; strcat(p,p1); strcpy(aa,p);void cls_one()char cl=0,cc=16;lcd_pos(0); while(cc)/显示开始工作lcd_wdat(clscl);cl+;cc-;return;void cls_two()char cl=0,cc=16;lcd_pos(0x40); while(cc)/显示开始工作lcd_wdat(clscl);cl+;cc-;return;void main()/double dou;char j
21、j=0, p='-',di=0;P4DIR=0Xff;P1DIR=0Xff;P6DIR=0Xff;P6OUT=0X00;P6OUT|=BIT4;/数据初始化lcd_init();delay(3);lcd_pos(0);dis=0;while(dis1dis!='0')/显示开始工作lcd_wdat(dis1dis);dis+;delay(3);dis=0;lcd_pos(0x43);while(dis2dis!='0')/显示开始测试lcd_wdat(dis2dis);dis+;delay(100);lcd_init();delay(3);lcd
22、_pos(0x40);lcd_wdat(0x30);dis=0;while(1)ak=key_scan();switch(ak) /选择键值 case 32:break; / 无case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':if(flag)lcd_init();for(j=0;j<20;j+)aaj
23、=0;flag=0; if(m=1)i=n;a=ak;aai=ak;i+;deng=0;m=0;lcd_pos(dis);if(dis=15)dis=0x3f;dis+;lcd_wdat(a);break;case '+':case '-':case '*':case '/': if(deng)cls_one();c=ak; strcpy(bb,aa); n=i; for(j=0;j<20;j+) aaj=0; i=0;flag=0;pf=2;m=0; lcd_pos(dis);dis+; lcd_wdat(c);if(di
24、s=15)dis=0x3f;break;case '=':sum1=atof(aa);sum=atof(bb);switch(c)case '+':sum=sum+sum1;break;case '-':sum=sum-sum1;break;case '*':if(sum=sum1)sum=sum-1;sum=sum*sum1+sum1;else sum=sum*sum1;break;case '/':sum=sum/sum1;break;case '':sum=pow(sum,sum1);brea
25、k; case '':sum1=1/sum1; sum=pow(sum,sum1); break;default:goto lloop; gcvt();flag=1;lloop:/lcd_init(); cls_two(); delay(1);lcd_pos(0x40);dis=strlen(aa); j=0;while(dis)/显示开始测试 / aaj+=0x30;lcd_wdat(aaj);dis-;j+;for(j=0;j<20;j+)bbj=0;i=0;c=0;pf=1;n=0;dis=0;deng=1;m=0; sum=0;sum1=0;break;case
26、'.':a='.'aai='.'i+;lcd_pos(dis);if(dis=15)dis=0x3f;dis+;lcd_wdat(a);break; case 'c':lcd_init(); for(int j=0;j<20;j+) aaj=0;bbj=0;i=0;flag=1;c=0;du=0;pf=1;n=0;dnf=0,deng=0,dis=0;sum=0;sum1=0;m=0;lcd_pos(0x40); lcd_wdat(0x30);if(du)P6OUT&=BIT4;P6OUT|=BIT2; else P
27、6OUT&=BIT2;P6OUT|=BIT4; if(dnf)P6OUT|=BIT0;else P6OUT&=BIT0;break;case 'D':sum1=atof(aa);sum=1/sum1;gcvt();flag=1;goto lloop; case 't':sum1=atof(aa);sum=atof(aa);sum=sum-1;sum=sum*sum1+sum1;gcvt();flag=1;goto lloop; case 's':sum1=atof(aa);sum=atof(aa);sum=sum-1;sum=su
28、m*sum1+sum1;sum*=sum1; gcvt();flag=1;goto lloop; case 'B': if(i!=0)i-;aai='0' cls_one(); delay(1);di=0;di=strlen(bb); jj=0; if(c!=0) lcd_pos(0);while(di)/显示开始测试lcd_wdat(bbjj);di-;jj+; di=strlen(bb); lcd_pos(di);lcd_wdat(c); jj=0; di+;delay(1); lcd_pos(di); di=strlen(aa);while(di)/显示开
29、始测试 lcd_wdat(aajj);di-;jj+; elseif(c!=0)c=0;cls_one();delay(1);di=0;lcd_pos(0);di=strlen(bb); jj=0;while(di)/显示开始测试lcd_wdat(bbjj);di-;jj+;elseif(n!=0)n-;bbn='0'cls_one();delay(1);di=0;lcd_pos(0);di=strlen(bb); jj=0;while(dis)/显示开始测试lcd_wdat(bbjj);dis-;jj+;m=1; strcpy(aa,bb);flag=0;if(c!=0)di
30、s=strlen(bb)+i+1;else dis=strlen(aa);break; case 'P':if(i=0)if(pf=1)cls_one();for(jj=0;jj<20;jj+)aajj=0;aa0='-'i+;flag=0;pf=2;lcd_pos(dis); lcd_wdat(p);dis+;elsedis=0;sum=atof(aa);sum=0-sum;gcvt();cls_one(); di=strlen(bb); jj=0; if(c!=0) lcd_pos(dis);while(di)/显示开始测试lcd_wdat(bbjj)
31、;di-;jj+; di=strlen(bb); lcd_pos(dis+di);lcd_wdat(c); jj=0; dis+;delay(1); lcd_pos(dis+di); di=strlen(aa);while(di)/显示开始测试 lcd_wdat(aajj);di-;jj+;flag=0;if(c!=0)dis=strlen(bb)+i+1;else dis=strlen(aa); break; case 'U':dnf=1-dnf;if(dnf)P6OUT|=BIT0;else P6OUT&=BIT0;break; case 'Z':
32、sum=atof(aa);if(dnf=0)sum=sin(sum);else sum=atof(aa); sum=asin(sum); if(du)sum=sum*180/3.14159265; if(-0.000001<sum&&sum<0.000001)sum=0;gcvt(); jj=0; cls_two(); delay(1);lcd_pos(0x40); di=strlen(aa);while(di)/显示开始测试 lcd_wdat(aajj);di-;jj+;flag=1;i=0;dis=0;break; case 'y':sum=atof(aa); if(du)sum=sum/180*3.14159265;if(dnf=0)sum=cos(sum);else sum=atof(aa);sum=acos(sum); if(du)sum=sum*180/3.14159265;if(-0.000001<sum&&sum<0.000001)sum=0;gcvt(); jj=0; cls_two(); delay(1);lcd_p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 专业继续教育试题及答案
- 支原体肺炎护理考试题库及答案解析
- 安全方面的简答题库及答案解析
- 软件评测师历真题及答案
- 医院多重耐药菌感染管理要点试题(含答案)
- 汽车编辑考试试题及答案
- 停电应急预案考试试题及答案
- 江西色彩模拟试题及答案
- 职业指导师测试考核试卷及答案
- 小微信贷员操作考核试卷及答案
- 社团活动管理课件
- 心理治疗中心团队职责与组织架构图解
- 客户转让合同协议书
- 羽绒服购销合同协议
- 设施赔偿协议书范本
- 境外企业租赁合同协议
- 民间道教考试试题及答案
- 北师大版九年级数学上册《知识解读•题型专练》第05讲一元二次方程的应用(知识解读+真题演练+课后巩固)(原卷版+解析)
- 医务人员职业素养提升知识试题及答案
- 保健品会销管理制度
- 消防水泵操作流程
评论
0/150
提交评论