天祥单片机C语言编程汇总.doc_第1页
天祥单片机C语言编程汇总.doc_第2页
天祥单片机C语言编程汇总.doc_第3页
天祥单片机C语言编程汇总.doc_第4页
天祥单片机C语言编程汇总.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机C语言汇总/AD编程/拧动电位器,会在数码管的前三位显示0-255之间的数值。这就是把模拟电压转换成数字信号。/有些拧动电位器后数码管数可能不会动态变化,请用户按下实验板上的S22复位按键可更新数据/这种显象产生的原因是和AD芯片自身的一些特性有关。#include#include #define uint unsigned int#define uchar unsigned charsbit adrd=P37; /IO口定义sbit adwr=P36;sbit diola=P25;sbit dula=P26;sbit wela=P27;unsigned char j,k,adval;void delay(unsigned char i)/延时程序 for(j=i;j0;j-) for(k=125;k0;k-);uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,/数码管编码 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;void display(uchar bai_c,uchar sh_c,uchar g_c)/显示程序 P0=tablebai_c;/显示百位 dula=1; dula=0; P0=0xfe; wela=1; wela=0; delay(5); dula=0; P0=tablesh_c;/显示十位 dula=1; dula=0; wela=0; P0=0xfd; wela=1; wela=0; delay(5); P0=tableg_c;/显示个位 dula=1; dula=0; P0=0xfb; wela=1; wela=0; delay(5);void main()/主程序 uchar a,A1,A2,A2t,A3; while(1) wela=1; P0=0; /选通ADCS adwr=0;/AD写入(随便写个什么都行,主要是为了启动AD转换) _nop_(); adwr=1; P0=0xff; /关闭ADCS delay(10); wela=0; /关闭有AD片选信号锁存器的锁存端以防止在操作数码管时使AD的片选发生变化 for(a=20;a0;a-) /需要注意的是ADC0804在写和读之间的时间间隔要足够长否则无法读出数据 /这里把显示部分放这里的原因也是为了增加写读之间的时间间隔 display(A1,A2,A3); /送去显示各位。 wela=1; /重新打开有AD片选信号锁存器的锁存端 P1=0xff; /读取P1口之前先给其写全1 P0=0; /选通ADCS adrd=0; /AD读使能 adval=P1;/AD数据读取赋给P1口 adrd=1; P0=0xff; /关闭ADCS adwr=0; P1=adval; /同时把AD的值送八个发光二极显示 A1=adval/100;/分出百,十,和个位 A2t=adval%100; A2=A2t/10; A3=A2t%10; ;/4*4键盘检测程序,按下键后相应的代码显示在数码管上#includesbit beep=P23;sbit dula=P26;sbit wela=P27; unsigned char i=100;unsigned char j,k,temp,key;void delay(unsigned char i) for(j=i;j0;j-) for(k=125;k0;k-);unsigned char code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;display(unsigned char num) P0=tablenum; / P0=0xff; dula=1; dula=0; P0=0xc0; wela=1; wela=0;void main() dula=0; wela=0; while(1) P3=0xfe; temp=P3; temp=temp&0xf0; if(temp!=0xf0) delay(10); if(temp!=0xf0) temp=P3; switch(temp) case 0xee: key=0; break; case 0xde: key=1; break; case 0xbe: key=2; break; case 0x7e: key=3; break; while(temp!=0xf0) temp=P3; temp=temp&0xf0; beep=0; beep=1; display(key); / P0=tablekey; /* P0=0xff; dula=1; while(i-); dula=0; P0=0xc0; wela=1; wela=0; dula=0; wela=0; P0=0xff; dula=1; dula=0; P0=0xc5; wela=1; wela=0; */ P1=0xfe; P3=0xfd; temp=P3; temp=temp&0xf0; if(temp!=0xf0) delay(10); if(temp!=0xf0) temp=P3; switch(temp) case 0xed: key=4; break; case 0xdd: key=5; break; case 0xbd: key=6; break; case 0x7d: key=7; break; while(temp!=0xf0) temp=P3; temp=temp&0xf0; beep=0; beep=1; display(key);/* P0=tablekey; dula=1; / while(100-); dula=0; P0=0xc0; wela=1; wela=0; */ P1=0xfc; P3=0xfb; temp=P3; temp=temp&0xf0; if(temp!=0xf0) delay(10); if(temp!=0xf0) temp=P3; switch(temp) case 0xeb: key=8; break; case 0xdb: key=9; break; case 0xbb: key=10; break; case 0x7b: key=11; break; while(temp!=0xf0) temp=P3; temp=temp&0xf0; beep=0; beep=1; display(key); /* P0=tablekey; dula=1; / while(100-); dula=0; P0=0xc0; wela=1; wela=0; */ P1=0xf8; P3=0xf7; temp=P3; temp=temp&0xf0; if(temp!=0xf0) delay(10); if(temp!=0xf0) temp=P3; switch(temp) case 0xe7: key=12; break; case 0xd7: key=13; break; case 0xb7: key=14; break; case 0x77: key=15; break; while(temp!=0xf0) temp=P3; temp=temp&0xf0; beep=0; beep=1; display(key); /* P0=tablekey; dula=1; / while(100-); dula=0; P0=0xc0; wela=1; wela=0; */ P1=0xf0; /十四.用液晶显示的一个时钟#include#define uchar unsigned char #define uint unsigned intsbit dula=P26;sbit wela=P27;sbit rs=P35;sbit lcden=P34;sbit s1=P30;sbit s2=P31;sbit s3=P32;sbit rd=P37;uchar count,s1num;char miao,shi,fen;uchar code table= 2007-7-30 MON;uchar code table1= 00:00:00;void delay(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);void write_com(uchar com)rs=0;lcden=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;void write_date(uchar date)rs=1;lcden=0;P0=date;delay(5);lcden=1;delay(5);lcden=0;void init()uchar num;dula=0;wela=0;lcden=0;/fen=59;/miao=53;/shi=23;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);for(num=0;num15;num+)write_date(tablenum);delay(5);write_com(0x80+0x40);for(num=0;num12;num+)write_date(table1num);delay(5);TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;void write_sfm(uchar add,uchar date)uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_date(0x30+shi);write_date(0x30+ge);void keyscan()rd=0;if(s1=0)delay(5);if(s1=0)s1num+;while(!s1);if(s1num=1)TR0=0;write_com(0x80+0x40+10);write_com(0x0f);if(s1num=2)write_com(0x80+0x40+7);if(s1num=3)write_com(0x80+0x40+4);if(s1num=4)s1num=0;write_com(0x0c);TR0=1;if(s1num!=0)if(s2=0)delay(5);if(s2=0)while(!s2);if(s1num=1)miao+;if(miao=60)miao=0;write_sfm(10,miao);write_com(0x80+0x40+10);if(s1num=2)fen+;if(fen=60)fen=0;write_sfm(7,fen);write_com(0x80+0x40+7);if(s1num=3)shi+;if(shi=24)shi=0;write_sfm(4,shi);write_com(0x80+0x40+4);if(s3=0)delay(5);if(s3=0)while(!s3);if(s1num=1)/*if(miao=0)miao=59;write_sfm(10,miao);write_com(0x80+0x40+10);*/miao-;if(miao=-1)miao=59;write_sfm(10,miao);write_com(0x80+0x40+10);if(s1num=2)fen-;if(fen=-1)fen=59;write_sfm(7,fen);write_com(0x80+0x40+7);if(s1num=3)shi-;if(shi=-1)shi=23;write_sfm(4,shi);write_com(0x80+0x40+4);void main()init();while(1)keyscan();/while(1);void timer0() interrupt 1TH0=(65536-50000)/256;TL0=(65536-50000)%256;count+;if(count=18)count=0;miao+;if(miao=60)miao=0;fen+;if(fen=60)fen=0;shi+;if(shi=24)shi=0;write_sfm(4,shi);write_sfm(7,fen);write_sfm(10,miao);/试验AT24C02EEPROM芯片程序#include#include #define uint unsigned int#define uchar unsigned charunsigned char sec; /定义计数值,每过1秒,sec加1unsigned int tcnt; /定时中断次数bit write=0; /写24C08的标志;sbit sda=P20; /IO口定义sbit scl=P21;sbit dula=P26;sbit wela=P27;unsigned char j,k;void delay(unsigned char i)/延时程序 for(j=i;j0;j-) for(k=125;k0;k-);uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,/数码管编码 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;void display(uchar bai_c,uchar sh_c)/显示程序 dula=0; P0=tablebai_c;/显示百位 dula=1; dula=0; wela=0; P0=0x7e; wela=1; wela=0; delay(5); dula=0; P0=tablesh_c;/显示十位 dula=1; dula=0; wela=0; P0=0x7d; wela=1; wela=0; delay(5);/24C08读写驱动程序/void delay1(unsigned char x) unsigned int i; for(i=0;ix;i+); ;void flash() ; ; void x24c08_init() /24c08初始化子程序 scl=1; flash(); sda=1; flash();void start() /启动I2C总线sda=1; flash(); scl=1; flash(); sda=0; flash(); scl=0; flash();void stop() /停止I2C总线sda=0; flash(); scl=1; flash(); sda=1; flash();void writex(unsigned char j) /写一个字节 unsigned char i,temp; temp=j; for (i=0;i8;i+) temp=temp1; scl=0; flash(); sda=CY; flash(); scl=1; flash(); scl=0; flash(); sda=1; flash();unsigned char readx() /读一个字节 unsigned char i,j,k=0; scl=0; flash(); sda=1; for (i=0;i8;i+) flash(); scl=1; flash(); if (sda=1) j=1; else j=0; k=(k1)|j; scl=0; flash(); return(k);void clock() /I2C总线时钟 unsigned char i=0; scl=1; flash(); while (sda=1)&(i255)i+; scl=0; flash();/从24c02的地址address中读取一个字节数据/unsigned char x24c08_read(unsigned char address) unsigned char i; start(); writex(0xa0); clock(); writex(address); clock(); start(); writex(0xa1); clock(); i=readx(); stop(); delay1(10); return(i);/向24c02的address地址中写入一字节数据info/void x24c08_write(unsigned char address,unsigned char info) EA=0; start(); writex(0xa0); clock(); writex(address); clock(); writex(info); clock(); stop(); EA=1; delay1(50);void t0(void) interrupt 1 using 0 /定时中断服务函数TH0=(65536-50000)/256; /对TH0 TL0赋值TL0=(65536-50000)%256; /重装计数初值tcnt+; /每过250ust tcnt加一if(tcnt=20) /计满20次(1秒)时 tcnt=0; /重新再计 sec+; write=1; /1秒写一次24C08 if(sec=100) /定时100秒,在从零开始计时 sec=0; void main()unsigned char i;TMOD=0x01; /定时器工作在方式1ET0=1; EA=1;x24c08_init(); /初始化24C08sec=x24c08_read(2);/读出保存的数据赋于secTH0=(65536-50000)/256; /对TH0 TL0赋值TL0=(65536-50000)%256; /使定时器0.05秒中断一次TR0=1; /开始计时 while(1) i=10; while(i-) display(sec/10,sec%10); if(write=1) /判断计时器是否计时一秒 write=0; /清零 x24c08_write(2,sec); /在24c08的地址2中写入数据sec /*/* */* ME300B单片机开发系统演示程序 - 128*64LCD显示红外遥控器键值显示 */* */;* LCD型号:TS12864A-3(带汉字库)或兼容型号 控制器ST7920 */;* MCU:AT89S52 ,晶体频率:11.0592MHz */* */ /*【版权】Copyright(C)伟纳电子 All Rights Reserved */*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息! */* */*/#include #include #define uchar unsigned char#define uint unsigned int/*TS12864A-3 端口定义*/#define LCD_data P0 /数据口sbit LCD_RS = P35; /寄存器选择输入 sbit LCD_RW = P36; /液晶读/写控制sbit LCD_EN = P34; /液晶使能控制sbit LCD_PSB = P37; /串/并方式控制sbit wela = P26;sbit dula = P27;uchar code dis1 = 天祥电子;uchar code dis2 = ;uchar code dis3 = TX-1C 学习板 ;uchar code dis4 = 是您最好的选择! ;#define delayNOP(); _nop_();_nop_();_nop_();_nop_();uchar IRDIS2;uchar IRCOM4;void delay0(uchar x); /x*0.14MSvoid beep();void dataconv();void lcd_pos(uchar X,uchar Y); /确定显示位置/*/* */* 延时函数 */* */*/void delay(int ms) while(ms-) uchar i; for(i=0;i250;i+) _nop_(); _nop_();_nop_();_nop_(); /*/* */*检查LCD忙状态 */*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */* */*/bit lcd_busy() bit result; LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; delayNOP(); result = (bit)(P0&0x80); LCD_EN = 0; return(result); /*/* */*写指令数据到LCD */*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */* */*/void lcd_wcmd(uchar cmd) while(lcd_busy(); LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_(); _nop_(); P0 = cmd; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; /*/* */*写显示数据到LCD */*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */* */*/void lcd_wdat(uchar dat) while(lcd_busy(); LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P0 = dat; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; /*/* */* LCD初始化设定 */* */*/void lcd_init() LCD_PSB = 1; /并口方式 lcd_wcmd(0x34); /扩充指令操作 delay(5); lcd_wcmd(0x30); /基本指令操作 delay(5); lcd_wcmd(0x0C); /显示开,关光标 delay(5); lcd_wcmd(0x01); /清除LCD的显示内容 delay(5);/*/* */* 主程序 */* */*/ main(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论