一个把C51 LCD驱动移植到AVR的例子
51&AVR学习板软件使用说明
Copyright © 一学网 mailto: onestudy@51&A VR学习开发用户板51部分演示软件使用说明:本演示软件为该用户板51部分不扩展状态下35个功能中节选的16个功能各异的小模块组成。
“兴趣是最好的老师”,首先我们什么都不做,先试试这块板子可以跑什么程序。
很简单,首先插上电源插座,按一下Reset复位开关,这时第一程序P0运行起来了(数码管显示P0)。
如果要切换到其他程序,只要掰动红色的程序选取开关即可,即由四位DIP开关的不同组合来选择程序(上为1,下为零;左为低位,右为高为)。
如第3个程序,则0011,(ON为1,否则为0),再按RESET按键就可跑起来了!很简单,不是吗?演示0:P0,键盘二~十六进制译码——显示电路,将按键S2~S5的二进制值(按下为1,否则为0)转换成十六进制值并由数码管显示出来,LED指示灯显示相应键位。
演示1:P1,键盘二~十进制译码——显示电路,将按键S2~S5的二进制值(按下为1,否则为0)转换成十进制值并由数码管显示出来,LED指示灯显示相应键位。
演示2:P2,秒表计时电路,按S3开始计时并由数码管显示出来,计满一分种结束,蜂鸣器报警。
演示3:P3,模拟交通灯。
按S3后,红灯亮,数码管从30秒开始倒计时,计至5秒时黄灯开始闪烁,计至0秒时红灯灭绿灯亮,重新从30秒开始倒计时,至5秒时黄灯开始闪烁,至0秒时绿灯灭红灯亮,如此反复循环。
演示4:P4,数码管笔段教学,按S3键切换,L1显示笔段名,L2闪烁显示相应笔段。
演示5:P5,数码管笔段动画效果演示,按S3键开始。
演示6:P6,数码管显示0—F循环,按S3键开始,LED指示二进制值。
演示7:P7,数码管显示0—F左移循环,按S3键开始。
演示8:P8,LED指示灯显示左移循环,按S3键开始。
演示9:P9,LED指示灯扩散,收敛亮灯演示,按S3键开始。
演示10:PA,键盘提示音演示,按下任何键,蜂鸣器发声(跳线器选择BP端)。
天狼星51&AVR单片机程序代码
51篇51单片机第十三课矩阵键盘扫描实验所属类别: 课程代码发布日期: 2011-03-05 点击量: 343#include<reg52.h>#define uchar unsigned char#define uint unsigned intunsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0 x00};unsigned char code smg_we[]={0x08,0x18,0x28,0x38,0x48,0x58,0x68,0x78};//************************************************//延时函数,在12MHz的晶振频率下//大约50us的延时//************************************************void delay_50us(uint t){uchar j;for(;t>0;t--)for(j=19;j>0;j--);}//************************************************//延时函数,在12MHz的晶振频率下//大约50ms的延时//************************************************void delay_50ms(uint t){uint j;for(;t>0;t--)for(j=6245;j>0;j--);}void main(){uchar key_l,key_h;uchar key;while(1){P3=0xf0;key_l=P3;key_l=key_l&0xf0;if(key_l!=0xf0){delay_50us(100);if(key_l!=0xf0){key_l=P3&0xf0; //11100000key_l=key_l|0x0f;//11101111P3=key_l;key_h=P3;key_h=key_h&0x0f;//00001110key_l=key_l&0xf0;//11100000key=key_h+key_l; //11101110//20//06//26}}switch (key){case 0xee:P1=smg_du[0];break; case 0xde:P1=smg_du[1];break; case 0xbe:P1=smg_du[2];break; case 0x7e:P1=smg_du[3];break; case 0xed:P1=smg_du[4];break; case 0xdd:P1=smg_du[5];break; case 0xbd:P1=smg_du[6];break; case 0x7d:P1=smg_du[7];break; case 0xeb:P1=smg_du[8];break; case 0xdb:P1=smg_du[9];break; case 0xbb:P1=smg_du[10];break; case 0x7b:P1=smg_du[11];break; case 0xe7:P1=smg_du[12];break; case 0xd7:P1=smg_du[13];break; case 0xb7:P1=smg_du[14];break; case 0x77:P1=smg_du[15];break;}}}51单片机第十六课串口数据收发实验所属类别: 课程代码发布日期: 2011-03-05 点击量: 358 #include <reg52.h>unsigned char a;unsigned char flag;void main(){TMOD=0x20; //设置定时器1为方式2TH1=0xfd; //装入初值TL1=0xfd;TR1=1; //启动定时器1SM0=0;SM1=1; //设置串口为方式1REN=1; //接受使能EA=1; //打开总中断开关ES=1; //打开串口中断开关while(1){if(flag==1){ES=0;flag=0;SBUF=a;while(!TI); //等待数据发送结束TI=0;ES=1;}}}void serial() interrupt 4{a=SBUF;P1=a;RI=0;flag=1; //标志位}51单片机第十七课字符液晶LCD1602显示所属类别: 课程代码发布日期: 2011-03-05 点击量: 436 #include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit rs=P2^4;sbit rw=P2^5;sbit e=P2^6;uchar table1[]=" ";uchar table2[]="LCD1602 test ok!";//************************************************ //延时函数,在12MHz的晶振频率下//大约50us的延时//************************************************ void delay_50us(uint t){uchar j;for(;t>0;t--)for(j=19;j>0;j--);}//************************************************ //延时函数,在12MHz的晶振频率下//大约50ms的延时//************************************************ void delay_50ms(uint t){uint j;for(;t>0;t--)for(j=6245;j>0;j--);}void write_com(uchar com){e=0;rs=0;rw=0;P0=com;delay_50us(10);e=1;delay_50us(20);e=0;}void write_data(uchar dat){e=0;rs=1;rw=0;P0=dat;delay_50us(10);e=1;delay_50us(20);e=0;}void init(void){delay_50us(300); write_com(0x38); delay_50us(100); write_com(0x38); delay_50us(100); write_com(0x38); write_com(0x38); write_com(0x08); write_com(0x01); write_com(0x06); write_com(0x0c);}void main(){uchar j;init();write_com(0x80);for(j=0;j<16;j++){write_data(table1[j]); delay_50us(10);}write_com(0x80+0x40); for(j=0;j<16;j++){write_data(table2[j]); delay_50us(10);}while(1);}51单片机第二十一课红外遥控解码程序设计所属类别: 课程代码发布日期: 2011-03-05 点击量: 504#include<reg52.h>#define uchar unsigned char#define uint unsigned intunsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0 x00};unsigned char code smg_we[]={0x08,0x18,0x28,0x38,0x48,0x58,0x68,0x78};uchar irtime;uchar startflag;uchar irdata[33];uchar bitnum;uchar irreceok;uchar ircode[4];uchar irprosok;uchar disp[8];//************************************************//延时函数,在12MHz的晶振频率下//大约50us的延时//************************************************void delay_50us(uint t){uchar j;for(;t>0;t--)for(j=19;j>0;j--);}//************************************************//延时函数,在12MHz的晶振频率下//大约50ms的延时//************************************************void delay_50ms(uint t){uint j;for(;t>0;t--)for(j=6245;j>0;j--);}void timer0init(void)TMOD=0x02;TH0=0x00;TL0=0x00;ET0=1;EA=1;TR0=1;}void int0init(void){IT0=1;EX0=1;EA=1;}void irwork(void){disp[0]=ircode[0]/16; disp[1]=ircode[0]%16; disp[2]=ircode[1]/16; disp[3]=ircode[1]%16; disp[4]=ircode[2]/16; disp[5]=ircode[2]%16; disp[6]=ircode[3]/16; disp[7]=ircode[3]%16;}void display(void){uchar i;for(i=0;i<8;i++){P1=smg_du[disp[i]]; P2=smg_we[i];delay_50us(20);}}void irpros(void) //0x1c {uchar k,i,j;uchar value;k=1;for(j=0;j<4;j++){for(i=0;i<8;i++){value=value>>1; //7if(irdata[k]>6) //8{value=value | 0x80;}k++;}ircode[j]=value;}irprosok=1;}void main(){timer0init();int0init();while(1){if(irreceok){irpros();irreceok=0;}if(irprosok){irwork();irprosok=0;}display();}}void timer0 () interrupt 1 {irtime++; //255}void int0 () interrupt 0{if(startflag){if(irtime>32) //检测引导码{bitnum=0;}irdata[bitnum]=irtime;irtime=0;bitnum++;if(bitnum==33){bitnum=0;irreceok=1;}}else{startflag=1;irtime=0;}}51单片机第二十课PS2键盘键值解码所属类别: 课程代码发布日期: 2011-03-05 点击量: 383 #include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit psdata=P3^0;sbit psclk=P3^2;uchar numbit;uchar keyv;uchar key[3];uchar keynum;uchar m,n;unsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0 x00};unsigned char code smg_we[]={0x08,0x18,0x28,0x38,0x48,0x58,0x68,0x78};//************************************************//延时函数,在12MHz的晶振频率下//大约50us的延时//************************************************void delay_50us(uint t){uchar j;for(;t>0;t--)for(j=19;j>0;j--);}//************************************************//延时函数,在12MHz的晶振频率下//大约50ms的延时//************************************************void delay_50ms(uint t){uint j;for(;t>0;t--)for(j=6245;j>0;j--);}void main(){IT0=1; //外部中断下降沿触发EX0=1; //打开外部中断0EA=1; //打开总中断while(1){if(keynum==3){keynum=0; //0x1cn=key[0]/16;m=key[0]%16;}P1=smg_du[m];P2=smg_we[0];delay_50us(20);P1=smg_du[n];P2=smg_we[1];delay_50us(20);}}void int0 () interrupt 0{if((numbit>0)&&(numbit<9)) //>>{keyv=keyv>>1; //001000000if(psdata)keyv=keyv | 0x80; //10000000} //01numbit++; //0if(numbit>10){numbit=0;key[keynum]=keyv;keynum++;}}51单片机第二十三课实时时钟芯片DS1302的读写所属类别: 课程代码发布日期: 2011-03-05 点击量: 531#include<reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit sck=P1^0;sbit io=P1^1;sbit rst=P3^6;sbit smgen=P2^3;unsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0 x00,0x10};unsigned char code smg_we[]={0x08,0x18,0x28,0x38,0x48,0x58,0x68,0x78};uchar time_data[7]={10,6,4,17,11,58,30}; //年周月日时分秒uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};uchar disp[8];void write_ds1302_byte(uchar dat);void write_ds1302(uchar add,uchar dat);uchar read_ds1302(uchar add);void set_rtc(void);void read_rtc(void);void time_pros(void);void display(void);//************************************************ //延时函数,在12MHz的晶振频率下//大约50us的延时//************************************************ void delay_50us(uint t){uchar j;for(;t>0;t--)for(j=19;j>0;j--);}//************************************************ //延时函数,在12MHz的晶振频率下//大约50ms的延时//************************************************ void delay_50ms(uint t){uint j;for(;t>0;t--)for(j=6245;j>0;j--);}void write_ds1302_byte(uchar dat){uchar i;for(i=0;i<8;i++){sck=0;io=dat&0x01;dat=dat>>1;sck=1;}}void write_ds1302(uchar add,uchar dat)rst=0;_nop_();sck=0;_nop_();rst=1;_nop_();write_ds1302_byte(add); write_ds1302_byte(dat);rst=0;_nop_();io=1;sck=1;}uchar read_ds1302(uchar add) {uchar i,value;rst=0;_nop_();sck=0;_nop_();rst=1;_nop_();write_ds1302_byte(add);for(i=0;i<8;i++){value=value>>1;sck=0;if(io)value=value|0x80;sck=1;}rst=0;_nop_();sck=0;_nop_();sck=1;io=1;return value;}void set_rtc(void){uchar i,j;for(i=0;i<7;i++){j=time_data[i]/10;time_data[i]=time_data[i]%10;time_data[i]=time_data[i]+j*16;}write_ds1302(0x8e,0x00); //去除写保护for(i=0;i<7;i++){write_ds1302(write_add[i],time_data[i]); }write_ds1302(0x8e,0x80); //加写保护}void read_rtc(void){uchar i;for(i=0;i<7;i++){time_data[i]=read_ds1302(read_add[i]); }}void time_pros(void){disp[0]=time_data[6]%16;disp[1]=time_data[6]/16;disp[2]=16;disp[3]=time_data[5]%16;disp[4]=time_data[5]/16;disp[5]=16;disp[6]=time_data[4]%16;disp[7]=time_data[4]/16;}void display(void){uchar i;for(i=0;i<8;i++){P1=smg_du[disp[i]];P2=smg_we[i];delay_50us(20);}}void main(void){set_rtc();delay_50us(20);while(1){smgen=0;rst=1;read_rtc();rst=0;time_pros();smgen=1;display();smgen=0;}}51单片机第二十四课数字温度传感器DS18B20测温所属类别: 课程代码发布日期: 2011-03-05 点击量: 506#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit DQ=P2^2;sbit smg1=P2^4;sbit smg2=P2^5;sbit smg3=P2^6;uchar temp;unsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0 x00};unsigned char code smg_we[]={0x08,0x18,0x28,0x38,0x48,0x58,0x68,0x78};void init_ds18b20(void);void delay(uint t);void write_byte(uchar dat);uchar read_byte(void);uchar readtemperature(void);void display(void);//************************************************ //延时函数,在12MHz的晶振频率下//大约50us的延时//************************************************ void delay_50us(uint t){uchar j;for(;t>0;t--)for(j=19;j>0;j--);}void main(void){while(1){temp=readtemperature();display();}}void delay(uint t){while(t--);}void init_ds18b20(void){uchar n;DQ=1;delay(8);DQ=0;delay(80);DQ=1;delay(8);n=DQ;delay(4);}void write_byte(uchar dat){uchar i;for(i=0;i<8;i++){DQ=0;DQ=dat&0x01;delay(4);DQ=1;dat>>=1;}delay(4);}uchar read_byte(void){uchar i,value;for(i=0;i<8;i++){DQ=0;value>>=1;DQ=1;if(DQ)value|=0x80;delay(4);}return value;}uchar readtemperature(void){uchar a,b;init_ds18b20();write_byte(0xcc); //跳过ROM write_byte(0x44); //启动温度测量delay(300);init_ds18b20();write_byte(0xcc);write_byte(0xbe);a=read_byte();b=read_byte();b<<=4;b+=(a&0xf0)>>4; return b;}void display(void){smg3=0;smg2=0;smg1=0;P1=smg_du[temp%10]; delay_50us(20);smg2=0;smg1=1;P1=smg_du[temp/10]; delay_50us(20);}Avr篇lesson 4-1#include <iom16v.h>#include <macros.h>void delay(void){unsigned char a,b;for(a=0;a<240;a++)for(b=0;b<240;b++); }void main(void){DDRB=0xff; PORTB=0xff;DDRA=0xff; PORTA=0xff;while(1){PORTA &=~0x80; delay();PORTA |=0x80; delay();}}lesson 4-2#include <iom16v.h> #include <macros.h>void delay(void){unsigned char a,b; for(a=0;a<240;a++) for(b=0;b<240;b++); }void main(void){DDRB=0xff; PORTB=0xff;DDRA=0xff; PORTA=0xff;while(1){PORTA ^=BIT(7);//PORTA ^=0x80;delay();}}lesson 4-3#include <iom16v.h>#include <macros.h>void main(void){DDRB=0xff;PORTB=0xff;DDRA=0xff;PORTA=0xff;DDRD=0;PORTD=0xff;while(1){if(PIND & 0x04) //00000100PORTA |=BIT(7);elsePORTA &=~BIT(7);}}lesson 5-1#include <iom16v.h>#include <macros.h>#define uchar unsigned charuchar table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; void delay(void){uchar a,b;for(a=0;a<240;a++)for(b=0;b<240;b++);}void main(void){uchar i;DDRB=0xff;PORTB=0xff;DDRA=0xff;PORTA=0xff;while(1){for(i=0;i<8;i++){PORTA=table[i];delay();}}}lesson 5-2#include <iom16v.h>#include <macros.h>#define uchar unsigned charuchar table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};void delay(void){uchar a,b;for(a=0;a<240;a++)for(b=0;b<240;b++);}void main(void){uchar i;DDRB=0xff;PORTB=0xff;DDRA=0xff;PORTA=0xff;while(1){for(i=0;i<8;i++){PORTA &=~BIT(i);delay();PORTA |=BIT(i);}}}lesson 5-3#include <iom16v.h>#include <macros.h>#define uchar unsigned charuchar table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; void delay(void){uchar a,b;for(a=0;a<240;a++)for(b=0;b<240;b++);}void main(void){uchar i;DDRB=0xff;PORTB=0xff;DDRA=0xff;PORTA=0xff;while(1){for(i=0;i<8;i++){// PORTA ^=BIT(i);PORTA ^=(1<<i);delay();PORTA ^=BIT(i);//DDRA |=BIT(DDRA);//a=PINA;}}}lesson 6-1#include <iom16v.h>#define uchar unsigned char#define uint unsigned intunsigned char table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; void delay(void){uchar a,b;uchar c;for(c=0;c<12;c++)for(a=0;a<200;a++)for(b=0;b<200;b++);}void main(){uchar i;DDRB=0xff;PORTB=0xff;DDRA=0xff;PORTA=0xff;while(1){for(i=0;i<8;i++){PORTA=table[i];//11111110delay();}// P0=0xfd;//11111101}lesson 6-2#include <iom16v.h>#include <macros.h>#define uchar unsigned char#define uint unsigned int#define smgen_set PORTC |=BIT(3)#define smgen_clr PORTC &=~BIT(3)#define rs_set PORTD |=BIT(6)#define rs_clr PORTD &=~BIT(6)//sbit smgen=P2^3; //PC.3//sbit rs=P3^6; //PD.6unsigned char table1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c}; unsigned char table2[]={0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70};void delay(unsigned int a){uchar b;for(b=0;b<10;b++){while(a--);}}void main(){unsigned char i; // rs=0;DDRB=0xff;PORTB=0;DDRC=0xff;PORTC=0;DDRD=0xff;PORTD=0;rs_clr;while(1){for(i=0;i<8;i++){PORTC=table2[i];//smgen=1;smgen_set;PORTB=table1[i];delay(200);}}lesson 6-3#include <iom16v.h>#include <macros.h>#define uchar unsigned char#define uint unsigned int#define en1_set PORTC |=BIT(3)#define en1_clr PORTC &=~BIT(3)#define en2_set PORTC |=BIT(0)#define en2_clr PORTC &=~BIT(0)#define rs_set PORTD |=BIT(6)#define rs_clr PORTD &=~BIT(6)//sbit en1=P2^3; //PC.3//sbit en2=P2^0; //PC.0//sbit rs=P3^6; //PD.6uchar table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; uchar table2[]={0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00};void delay(uint a){while(a--);}void main(){uchar i;DDRA=0xff;PORTA=0xff;DDRB=0xff;PORTB=0xff;DDRC=0xff;PORTC=0xff;DDRD=0xff;PORTD=0xff;en1_set;//en1=1;en2_set;//en2=1;rs_clr;//rs=0;while(1){for(i=0;i<8;i++){PORTA=table1[i];PORTB=table2[i];delay(100);}}/*-----------------------------------------------名称:PS/2键盘驱动公司:天狼星电子网站:编写:霖锋日期:2009.5修改:无内容:识别PS/2键盘的第一类按键,用数码管显示------------------------------------------------*/#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit psdata=P3^0;sbit psclk=P3^2;uchar numbit;uchar keyv;uchar key[3];uchar keynum;uchar m,n;unsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0 x00};unsigned char code smg_we[]={0x08,0x18,0x28,0x38,0x48,0x58,0x68,0x78};//************************************************ //延时函数,在12MHz的晶振频率下//大约50us的延时//************************************************ void delay_50us(uint t){uchar j;for(;t>0;t--)for(j=19;j>0;j--);}//************************************************ //延时函数,在12MHz的晶振频率下//大约50ms的延时//************************************************ void delay_50ms(uint t){uint j;for(;t>0;t--)for(j=6245;j>0;j--);}void main(){IT0=1; //外部中断下降沿触发EX0=1; //打开外部中断0EA=1; //打开总中断while(1){if(keynum==4){EA=0;keynum=0; //0x1cn=key[1]/16;m=key[1]%16;EA=1;}P1=smg_du[m];P2=smg_we[0];delay_50us(20);P1=smg_du[n];P2=smg_we[1];delay_50us(20);}}void int0 () interrupt 0{if((numbit>0)&&(numbit<9)){keyv=keyv>>1;if(psdata)keyv=keyv | 0x80;}numbit++;if(numbit>10){numbit=0;key[keynum]=keyv;keynum++;}}AVR单片机第七课AVR单片机中断的原理和使用所属类别: 课程代码发布日期: 2011-03-22 点击量: 575 #include <iom16v.h>#include <macros.h>#define uchar unsigned char#define uint unsigned intvoid delay(void){uint a,b;for(a=0;a<1000;a++)for(b=0;b<500;b++);}void init(void){DDRB|=BIT(6);PORTB|=BIT(6);DDRA=0xff;PORTA=0xff;MCUCR|=0x02;GICR|=BIT(6);DDRD&=~BIT(2);PORTD|=BIT(2);SREG|=BIT(7);}void main(void){init();while(1){PORTA|=BIT(0);delay();PORTA&=~BIT(0);delay();}}#pragma interrupt_handler int0_isr:2void int0_isr(void){PORTA=0;delay();delay();delay();PORTA=0xff;}lesson 7-1#include <iom16v.h>#define uchar unsigned char#define uint unsigned intunsigned char table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; void delay(void){uchar a,b;uchar c;for(c=0;c<12;c++)for(a=0;a<200;a++)for(b=0;b<200;b++);void main(){uchar i;DDRB=0xff;PORTB=0xff;DDRA=0xff;PORTA=0xff;while(1){for(i=0;i<8;i++){PORTA=table[i];//11111110delay();}// P0=0xfd;//11111101}}lesson 7-2#include <iom16v.h>#include <macros.h>#define uchar unsigned char#define uint unsigned int#define smgen_set PORTC |=BIT(3)#define smgen_clr PORTC &=~BIT(3)#define rs_set PORTD |=BIT(6)#define rs_clr PORTD &=~BIT(6)//sbit smgen=P2^3; //PC.3//sbit rs=P3^6; //PD.6unsigned char table1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c}; unsigned char table2[]={0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70};void delay(unsigned int a){uchar b;for(b=0;b<10;b++){while(a--);}}void main(){unsigned char i;// rs=0;DDRB=0xff;PORTB=0;DDRC=0xff;PORTC=0;DDRD=0xff;PORTD=0;rs_clr;while(1){for(i=0;i<8;i++){PORTC=table2[i];//smgen=1;smgen_set;PORTB=table1[i]; delay(200);}}}lesson 7-3#include <iom16v.h>#include <macros.h>#define uchar unsigned char#define uint unsigned int#define en1_set PORTC |=BIT(3)#define en1_clr PORTC &=~BIT(3)#define en2_set PORTC |=BIT(0)#define en2_clr PORTC &=~BIT(0)#define rs_set PORTD |=BIT(6)#define rs_clr PORTD &=~BIT(6)//sbit en1=P2^3; //PC.3//sbit en2=P2^0; //PC.0//sbit rs=P3^6; //PD.6uchar table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; uchar table2[]={0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00};void delay(uint a){while(a--);}void main(){uchar i;DDRA=0xff;PORTA=0xff;DDRB=0xff;PORTB=0xff;DDRC=0xff;PORTC=0xff;DDRD=0xff;PORTD=0xff;en1_set;//en1=1;en2_set;//en2=1;rs_clr;//rs=0;while(1){for(i=0;i<8;i++){PORTA=table1[i];PORTB=table2[i];delay(100);}}}遥控解码程序如下:/*-----------------------------------------------名称:PS/2键盘驱动公司:天狼星电子网站:编写:霖锋日期:2009.5修改:无内容:识别PS/2键盘的第一类按键------------------------------------------------*/#include<reg52.h>#define uchar unsigned char#define uint unsigned intunsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0 x00};unsigned char code smg_we[]={0x08,0x18,0x28,0x38,0x48,0x58,0x68,0x78};uchar irtime;uchar startflag;uchar irdata[33];uchar bitnum;uchar irreceok;uchar ircode[4];uchar irprosok;uchar disp[8];//************************************************//延时函数,在12MHz的晶振频率下//大约50us的延时//************************************************ void delay_50us(uint t){uchar j;for(;t>0;t--)for(j=19;j>0;j--);}//************************************************ //延时函数,在12MHz的晶振频率下//大约50ms的延时//************************************************ void delay_50ms(uint t){uint j;for(;t>0;t--)for(j=6245;j>0;j--);}void timer0init(void){TMOD=0x02;TH0=0x00;TL0=0x00;ET0=1;EA=1;TR0=1;}void int0init(void){IT0=1;EX0=1;EA=1;}void irwork(void){disp[0]=ircode[0]/16;disp[1]=ircode[0]%16;disp[2]=ircode[1]/16;disp[3]=ircode[1]%16;disp[4]=ircode[2]/16;disp[5]=ircode[2]%16;disp[6]=ircode[3]/16;disp[7]=ircode[3]%16;}void display(void){uchar i;for(i=0;i<8;i++){P1=smg_du[disp[i]];P2=smg_we[i];delay_50us(20);}}void irpros(void){uchar k,i,j;uchar value;k=1;for(j=0;j<4;j++){for(i=0;i<8;i++){value=value>>1;if(irdata[k]>6){value=value | 0x80;}k++;}ircode[j]=value;}irprosok=1;}void main(){timer0init();int0init();while(1){if(irreceok){irpros();irreceok=0;}if(irprosok){irwork();irprosok=0;}display();}}void timer0 () interrupt 1{irtime++;}void int0 () interrupt 0{if(startflag){if(irtime>32) //检测引导码{bitnum=0;}irdata[bitnum]=irtime;irtime=0;bitnum++;if(bitnum==33){bitnum=0;irreceok=1;}}else{startflag=1;irtime=0;}}。
Keil C51 与 ARM 并存方法
很多朋友都在想,怎么让keil C51与ARM能够并存使用。
有安装经验的朋友都知道,安好C51后再安ARm,C51不能正常工作;安好ARM后再安C51,ARM不能正常工作.网上也有相关解决办法,不过不怎么样,要么不详细,要么就是复制粘贴。
不多说看图片:第一:先安装C51(必须先安装C51,不能先安装ARM,否则会失败。
)第二:安装keil ARM(不能安装在同一个文件夹下)我当前安装的是mdk arm4.53第三:打开keil c51和keil arm 两个文件夹,分别找到tools.ini分别打开两个“tools.ini”,将keil C51文件夹下的tools.ini文件中[C51]段复制到keil ARM中tools.ini文件的最后;将keil ARM文件夹下的tools.ini文件中[ARM]段复制到keil C51中tools.ini文件的最后:tools.ini -->keil ARM[UV2]ORGANIZATION="小川电子工作室"NAME="小川电子工作室", "小川电子工作室"EMAIL="paulhyde@"ARMSEL=1BOOK0=UV4\RELEASE_NOTES.HTM("uVision Release Notes",GEN)[ARM]PATH="D:\Keil ARM\ARM\"VERSION=4.50PATH1="C:\Program Files\arm-none-eabi-gcc-4_6\"TOOLPREFIX=arm-none-eabi-CPUDLL0=SARM.DLL(TDRV0,TDRV5,TDRV6,TDRV10) # Drivers for ARM7/9 devices CPUDLL1=SARMCM3.DLL(TDRV1,TDRV2,TDRV3,TDRV4,TDRV5,TDRV7,TDRV8,TDR V9,TDRV11,TDRV12,TDRV13) # Drivers for Cortex-M devicesCPUDLL2=SARMCR4.DLL(TDRV7) # Drivers for Cortex-R4 devicesBOOK0=HLP\RELEASE_NOTES.HTM("Release Notes",GEN)BOOK1=HLP\ARMTOOLS.chm("Complete User's Guide Selection",C)BOOK2=HLP\RL_RELEASE_NOTES.HTM("RL-ARM Release Notes",GEN)BOOK3=CMSIS\index.html("CMSIS Documentation",GEN)TDRV0=BIN\UL2ARM.DLL("ULINK2/ME ARM Debugger")TDRV1=BIN\UL2CM3.DLL("ULINK2/ME Cortex Debugger")TDRV2=BIN\AGDIRDI.DLL("RDI Interface Driver")TDRV3=BIN\ABLSTCM.dll("Altera Blaster Cortex Debugger")TDRV4=BIN\lmidk-agdi.dll("Stellaris ICDI")TDRV5=Signum\SigUV3Arm.dll("Signum Systems JTAGjet")TDRV6=Segger\JLTAgdi.dll("J-LINK / J-TRACE")TDRV7=Segger\JL2CM3.dll("Cortex-M/R J-LINK/J-Trace")TDRV8=STLink\ST-LINKIII-KEIL.dll ("ST-Link (Deprecated Version)")TDRV9=BIN\ULP2CM3.DLL("ULINK Pro Cortex Debugger")TDRV10=BIN\ULP2ARM.DLL("ULINK Pro ARM Debugger")TDRV11=NULink\Nu_Link.dll("NULink Debugger")TDRV12=SiLabs\SLAB_CM_Keil.dll("SiLabs UDA Debugger")TDRV13=STLink\ST-LINKIII-KEIL_SWO.dll ("ST-Link Debugger")DELDRVPKG0=ULINK\UninstallULINK.exe("ULINK Pro Driver V1.0")LIC0=ZB48T-RRRXD-GJE6P-M4J11-65JI1-GHTPNBOOK4=Signum\Docs\SigUV3Arm.htm("Signum Systems JTAGjet Driver Documentation",GEN)[ARMADS]PATH="D:\Keil ARM\ARM\"PATH1="BIN40\"CPUDLL0=SARM.DLL(TDRV0,TDRV5,TDRV6,TDRV10) # Drivers for ARM7/9 devices CPUDLL1=SARMCM3.DLL(TDRV1,TDRV2,TDRV3,TDRV4,TDRV5,TDRV7,TDRV8,TDR V9,TDRV11,TDRV12,TDRV13) # Drivers for Cortex-M devicesCPUDLL2=SARMCR4.DLL(TDRV7) # Drivers for Cortex-R4 devicesBOOK0=HLP\RELEASE_NOTES.HTM("Release Notes",GEN)BOOK1=HLP\ARMTOOLS.chm("Complete User's Guide Selection",C)BOOK2=HLP\RL_RELEASE_NOTES.HTM("RL-ARM Release Notes",GEN)BOOK3=CMSIS\index.html("CMSIS Documentation",GEN)BOOK4=Signum\Docs\SigUV3Arm.htm("Signum Systems JTAGjet Driver Documentation",GEN)TDRV0=BIN\UL2ARM.DLL("ULINK2/ME ARM Debugger")TDRV1=BIN\UL2CM3.DLL("ULINK2/ME Cortex Debugger")TDRV2=BIN\AGDIRDI.DLL("RDI Interface Driver")TDRV3=BIN\ABLSTCM.dll("Altera Blaster Cortex Debugger")TDRV4=BIN\lmidk-agdi.dll("Stellaris ICDI")TDRV5=Signum\SigUV3Arm.dll("Signum Systems JTAGjet")TDRV6=Segger\JLTAgdi.dll("J-LINK / J-TRACE")TDRV7=Segger\JL2CM3.dll("Cortex-M/R J-LINK/J-Trace")TDRV8=STLink\ST-LINKIII-KEIL.dll ("ST-Link (Deprecated Version)")TDRV9=BIN\ULP2CM3.DLL("ULINK Pro Cortex Debugger")TDRV10=BIN\ULP2ARM.DLL("ULINK Pro ARM Debugger")TDRV11=NULink\Nu_Link.dll("NULink Debugger")TDRV12=SiLabs\SLAB_CM_Keil.dll("SiLabs UDA Debugger")TDRV13=STLink\ST-LINKIII-KEIL_SWO.dll ("ST-Link Debugger") RTOS0=Dummy.DLL("Dummy")RTOS1=VARTXARM.DLL ("RTX Kernel")DELDRVPKG0=ULINK\UninstallULINK.exe("ULINK Pro Driver V1.0") [C51]PATH="D:\Keil C51\C51\"VERSION=V9.06BOOK0=HLP\Release_Notes.htm("Release Notes",GEN)BOOK1=HLP\C51TOOLS.chm("Complete User's Guide Selection",C) TDRV0=BIN\MON51.DLL ("Keil Monitor-51 Driver")TDRV1=BIN\ISD51.DLL ("Keil ISD51 In-System Debugger")TDRV2=BIN\MON390.DLL ("MON390: Dallas Contiguous Mode") TDRV3=BIN\LPC2EMP.DLL ("LPC900 EPM Emulator/Programmer") TDRV4=BIN\UL2UPSD.DLL ("ST-uPSD ULINK Driver")TDRV5=BIN\UL2XC800.DLL ("Infineon XC800 ULINK Driver")TDRV6=BIN\MONADI.DLL ("ADI Monitor Driver")TDRV7=BIN\DAS2XC800.DLL ("Infineon DAS Client for XC800") TDRV8=BIN\UL2LPC9.DLL ("NXP LPC95x ULINK Driver")RTOS0=Dummy.DLL("Dummy")RTOS1=RTXTINY.DLL ("RTX-51 Tiny")RTOS2=RTX51.DLL ("RTX-51 Full")LIC0=EXTEV-PIY1M-WN1AF-6K3HK-DRA7Y-FBXVWkeil-->c51[UV2]ORGANIZATION="小川工作室"NAME="王川北", "111"EMAIL="111"BOOK0=UV4\RELEASE_NOTES.HTM("uVision Release Notes",GEN) [C51]PATH="D:\Keil C51\C51\"VERSION=V9.06BOOK0=HLP\Release_Notes.htm("Release Notes",GEN)BOOK1=HLP\C51TOOLS.chm("Complete User's Guide Selection",C) TDRV0=BIN\MON51.DLL ("Keil Monitor-51 Driver")TDRV1=BIN\ISD51.DLL ("Keil ISD51 In-System Debugger")TDRV2=BIN\MON390.DLL ("MON390: Dallas Contiguous Mode")TDRV3=BIN\LPC2EMP.DLL ("LPC900 EPM Emulator/Programmer")TDRV4=BIN\UL2UPSD.DLL ("ST-uPSD ULINK Driver")TDRV5=BIN\UL2XC800.DLL ("Infineon XC800 ULINK Driver")TDRV6=BIN\MONADI.DLL ("ADI Monitor Driver")TDRV7=BIN\DAS2XC800.DLL ("Infineon DAS Client for XC800")TDRV8=BIN\UL2LPC9.DLL ("NXP LPC95x ULINK Driver")RTOS0=Dummy.DLL("Dummy")RTOS1=RTXTINY.DLL ("RTX-51 Tiny")RTOS2=RTX51.DLL ("RTX-51 Full")LIC0=8V02Z-JIX83-09VG9-4M1JI-YKSD6-5KBQ3[ARM]PATH="D:\Keil ARM\ARM\"VERSION=4.50PATH1="C:\Program Files\arm-none-eabi-gcc-4_6\"TOOLPREFIX=arm-none-eabi-CPUDLL0=SARM.DLL(TDRV0,TDRV5,TDRV6,TDRV10) # Drivers for ARM7/9 devices CPUDLL1=SARMCM3.DLL(TDRV1,TDRV2,TDRV3,TDRV4,TDRV5,TDRV7,TDRV8,TDR V9,TDRV11,TDRV12,TDRV13) # Drivers for Cortex-M devicesCPUDLL2=SARMCR4.DLL(TDRV7) # Drivers for Cortex-R4 devicesBOOK0=HLP\RELEASE_NOTES.HTM("Release Notes",GEN)BOOK1=HLP\ARMTOOLS.chm("Complete User's Guide Selection",C)BOOK2=HLP\RL_RELEASE_NOTES.HTM("RL-ARM Release Notes",GEN)BOOK3=CMSIS\index.html("CMSIS Documentation",GEN)BOOK4=Signum\Docs\SigUV3Arm.htm("Signum Systems JTAGjet Driver Documentation",GEN)TDRV0=BIN\UL2ARM.DLL("ULINK2/ME ARM Debugger")TDRV1=BIN\UL2CM3.DLL("ULINK2/ME Cortex Debugger")TDRV2=BIN\AGDIRDI.DLL("RDI Interface Driver")TDRV3=BIN\ABLSTCM.dll("Altera Blaster Cortex Debugger")TDRV4=BIN\lmidk-agdi.dll("Stellaris ICDI")TDRV5=Signum\SigUV3Arm.dll("Signum Systems JTAGjet")TDRV6=Segger\JLTAgdi.dll("J-LINK / J-TRACE")TDRV7=Segger\JL2CM3.dll("Cortex-M/R J-LINK/J-Trace")TDRV8=STLink\ST-LINKIII-KEIL.dll ("ST-Link (Deprecated Version)")TDRV9=BIN\ULP2CM3.DLL("ULINK Pro Cortex Debugger")TDRV10=BIN\ULP2ARM.DLL("ULINK Pro ARM Debugger")TDRV11=NULink\Nu_Link.dll("NULink Debugger")TDRV12=SiLabs\SLAB_CM_Keil.dll("SiLabs UDA Debugger")TDRV13=STLink\ST-LINKIII-KEIL_SWO.dll ("ST-Link Debugger")DELDRVPKG0=ULINK\UninstallULINK.exe("ULINK Pro Driver V1.0")LIC0=UJWBS-LNGB0-8FWIE-5N2GJ-UKXD9-NTBGM[ARMADS]PATH="D:\Keil ARM\ARM\"PATH1="BIN40\"CPUDLL0=SARM.DLL(TDRV0,TDRV5,TDRV6,TDRV10) # Drivers for ARM7/9 devices CPUDLL1=SARMCM3.DLL(TDRV1,TDRV2,TDRV3,TDRV4,TDRV5,TDRV7,TDRV8,TDR V9,TDRV11,TDRV12,TDRV13) # Drivers for Cortex-M devicesCPUDLL2=SARMCR4.DLL(TDRV7) # Drivers for Cortex-R4 devicesBOOK0=HLP\RELEASE_NOTES.HTM("Release Notes",GEN)BOOK1=HLP\ARMTOOLS.chm("Complete User's Guide Selection",C)BOOK2=HLP\RL_RELEASE_NOTES.HTM("RL-ARM Release Notes",GEN)BOOK3=CMSIS\index.html("CMSIS Documentation",GEN)BOOK4=Signum\Docs\SigUV3Arm.htm("Signum Systems JTAGjet Driver Documentation",GEN)TDRV0=BIN\UL2ARM.DLL("ULINK2/ME ARM Debugger")TDRV1=BIN\UL2CM3.DLL("ULINK2/ME Cortex Debugger")TDRV2=BIN\AGDIRDI.DLL("RDI Interface Driver")TDRV3=BIN\ABLSTCM.dll("Altera Blaster Cortex Debugger")TDRV4=BIN\lmidk-agdi.dll("Stellaris ICDI")TDRV5=Signum\SigUV3Arm.dll("Signum Systems JTAGjet")TDRV6=Segger\JLTAgdi.dll("J-LINK / J-TRACE")TDRV7=Segger\JL2CM3.dll("Cortex-M/R J-LINK/J-Trace")TDRV8=STLink\ST-LINKIII-KEIL.dll ("ST-Link (Deprecated Version)")TDRV9=BIN\ULP2CM3.DLL("ULINK Pro Cortex Debugger")TDRV10=BIN\ULP2ARM.DLL("ULINK Pro ARM Debugger")TDRV11=NULink\Nu_Link.dll("NULink Debugger")TDRV12=SiLabs\SLAB_CM_Keil.dll("SiLabs UDA Debugger")TDRV13=STLink\ST-LINKIII-KEIL_SWO.dll ("ST-Link Debugger")RTOS0=Dummy.DLL("Dummy")RTOS1=VARTXARM.DLL ("RTX Kernel")DELDRVPKG0=ULINK\UninstallULINK.exe("ULINK Pro Driver V1.0")。
AVR移植51程序
/***************************************************************************标题:数码管的显示效果:显示1234,从这个例子可以学习多位数码管的动态显示技术工作于:LY5A-L2A开发板作者:张玉虎说明:AVR芯片移植51程序2014/8/10******************************************************************************/ //头文件:#include<iom16v.h>#include<macros.h>//变量定义:unsigned char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//表:共阳数码管0-9//引脚定义:#define SMG_q_set PORTB |=BIT(0)#define SMG_q_CLR PORTB &=~BIT(0)#define SMG_b_set PORTB |=BIT(1)#define SMG_b_CLR PORTB &=~BIT(1)#define SMG_s_set PORTB |=BIT(2)#define SMG_s_CLR PORTB &=~BIT(2)#define SMG_g_set PORTB |=BIT(3)#define SMG_g_CLR PORTB &=~BIT(3)/*sbit SMG_q = P1^0; //定义数码管阳级控制脚(千位)PB.0sbit SMG_b = P1^1; //定义数码管阳级控制脚(百位)PB.1sbit SMG_s = P1^2; //定义数码管阳级控制脚(十位)PB.2sbit SMG_g = P1^3; //定义数码管阳级控制脚(个位)PB.3*///函数声明:void delay(void); //延时子函时//主函数,C语言的入口函数:void main(void){DDRB=0XFF;PORTB=0XFF;DDRA=0XFF;PORTA=0XFF;//unsigned char i=0; //作为查表的索引号while(1) //不停的循环扫描,不扫描则不显示或显示不正确,即为动态显示, { //数码管显示1234,可自行修改SMG_q_CLR; //选择千位数码管PORTA=table[1]; //查找"1"定义好的数码管段值与P0口输出,显示相应的1 delay(); //加入短暂延时PORTA=0XFF; //清除数码管显示,因是共阳型,所以不是0SMG_q_set; //关闭千位数码管SMG_b_CLR; //选择百位数码管PORTA=table[2]; //查找"2"定义好的数码管段值与P0口输出,显示相应的2 delay(); //加入短暂延时PORTA=0XFF; //清除数码管显示,因是共阳型,所以不是0SMG_b_set; //关闭百位数码管SMG_s_CLR; //选择十位数码管PORTA=table[3]; //查找"2"定义好的数码管段值与P0口输出,显示相应的2 delay(); //加入短暂延时PORTA=0XFF; //清除数码管显示,因是共阳型,所以不是0SMG_s_set; //关闭十位数码管SMG_g_CLR; //选择个位数码管PORTA=table[4]; //查找"2"定义好的数码管段值与P0口输出,显示相应的2 delay(); //加入短暂延时PORTA=0XFF; //清除数码管显示,因是共阳型,所以不是0SMG_g_set; //关闭个位数码管}}//延时子函数,短暂延时void delay(void){unsigned char i=10;while(i--);}。
从MCS51向AVR的认识转换
国际IT传媒品牌从MCS51向AVR的认识转换于平(中国矿业大学 江苏徐州 221008)摘要:AVR 单片机是目前最新单片机系列之一,其突出特点在于速度高、片内硬件资源丰富、可作为真正意义上的单片机使用。
本文主要采用对比的方式,将MCS51与AVR的不同之处做了简要的讲解,实现从MCS51向AVR的认识转换。
关键词:AVR单片机;MCS51;认识转换中图分类法:TP368.2 文献标识码:A doi:10.3969/j.issn.1003-6970.2010.12.011 The knowledge of Conversion from MCS51 to A VR MicrocontrollerYU Ping(China University of Mining and Technology JiangsuXuzhou 221008)Abstract:A VR microcontroller is one of the latest microcontroller series, and the prominent feature is High-speed、Hardware resource-rich on-chip、be used as a true single chip. By way of contrast, this paper made a brief explanation on the diffi ence of MCS51 and A VR microcontroller, realized a knowledge of conversion from MCS51 to A VR microcontroller.Key words:AVR microcontroller; MCS51; a knowledge of conversion1 引言人们都已经非常熟悉MCS系列的单片机,例如8051、8091 等,但它们都是比较简单的单片机。
AVR单片机C语言编程
AVR单片机广泛应用于各种领域,如智能家居、电子门锁、自动控制等。
AVR单片机的应用领域
AVR单片机的特点和应用领域
AVR单片机的主要产品线
AVR单片机主要有ATmega和ATtiny两个系列,其中ATmega系列单片机具有较高的性能和丰富的外设接口,适用于较为复杂的控制系统。
AVR单片机的主要型号
AVR单片机的起源
1980年代,美国国家半导体公司推出了第一片AVR单片机,它具有高性能、可编程和低功耗的特点。
AVR单片机的诞生
随着技术的不断发展,AVR单片机逐渐被广泛应用于各种领域,包括工业控制、智能家居、汽车电子等。
AVR单片机的成长
AVR单片机具有高性能、可编程、低功耗、易于开发等特点。
内存限制
AVR单片机的寄存器是直接映射到内存中的,必须了解寄存器的使用方法;
寄存器访问
AVR单片机的中断处理需要特别注意,必须了解中断源、中断向量表和中断处理程序编写等。
中断处理
01
关键字
C语言中的关键字和数据类型
02
数据类型
03
特殊关键字
04
数据类型扩展
04
AVR单片机的编程实例
总结词:基本了解
定时器和中断的使用
串口通信的实现
总结词:高级应用
详细描述:串口通信是AVR单片机中非常常用的通信方式之一,通过串口通信可以实现多个设备之间的数据传输和通信。本节将介绍串口通信的基本原理和实现方法,包括串口的接口电路和程序代码,让读者能够了解串口通信的基本框架和应用技巧。同时,通过实际案例来讲解串口通信的实现方法,让读者更好地掌握相关知识。
详细描述:AVR Studio的安装和设置包括以下步骤
RTX51tiny实时操作系统在单片机STC12C5A60S2上的移植
RTX51tiny实时操作系统在单片机STC12C5A60S2上的移植【摘要】RTX51tiny实时操作系统是KeilC51单片机开发集成环境自带的一个实时操作系统,此操作系统功能强大,简单易用,本文讲解把它移植到单片机STC12C5A60S2上的方法。
【关键词】RTX51tiny实时操作系统单片机STC12C5A60S2RTX51tiny实时操作系统是KeilC51单片机集成开发环境自带的一个实时操作系统,它功能强大、简单易用。
它可以应用在所有的8051衍生的单片机系列中。
STC12C5A60S2单片机是深圳宏晶科技有限公司旗下的功能强大的1T单片机。
此单片机是新一代增强型8051单片机,运行的速度是传统8051单片机的8~12倍,这是相当快的速度。
它内部资源丰富,兼容性强,并且内部ROM可达60KB,对于一般的应用已经足够。
在一些比较复杂的应用中,如果使用超级循环进行编程,则在实时性,逻辑性,资源的共享等方面存在较为复杂的关联性,这对编程来说是不利的。
另外在增加与删除功能上也会增加编程的复杂性。
能不能把RTX51tiny操作系统移植到STC12C5A60S2单片机上呢?如果可以则在保证实时性的基础上,编程的复杂性会大幅降低,程序可维护性也会大幅提升。
增加或者删除功能会变得相当容易。
答案是肯定的。
RTX51tiny操作系统完全可以移植到STC12C5A60S2单片机上。
先来看看RTX51tiny操作系统介绍。
一、RTX51tiny操作系统的特性(一)采用时间片轮转调度策略进行任务切换,不支持抢占式任务调度策略。
(二)允许最大16个任务循环切换。
(四)内核很小,最大仅占用900字节。
(五)系统函数仅有13个,非常容易使用。
(六)支持硬件中断功能。
根据它的特点,我们可以得到这样的结论:RTX51tiny操作系统非常适合应用于8051系列单片机,可以实现多任务协同工作。
在实时性上,可以采用硬件中断响应,速度与没有使用操作系统一样快捷。
模拟I_2C总线实现AVR与MCS_51单片机通讯
中图分类号 : TN 913 文献标识码 : A 文3
Simu la ting th e I2 C to Realize AVR and the M CS- 51 Comm unication GAN H u i (T echnical Institute of YiChun University, YiChun J iangX i 336000, China ) Abstrac : t T he I C has the connection si m ply , the easy tooperate , T his techno logy obta ined the w idespread app lication in the industry
第 30 卷
2 uchar rdbyt ( ) /* 从 I C 总线上读 取 1 个数据字节 * /
{ ucha r nn= 0x f,f mm = 0x80 , uu= 0x7 ; f uchar ; j for ( j= 0; SDA = 1; nn= else nn= } re turn ( nn); } ( nn | mm ); nn= cro l ( nn, 1) ; SCL = 0;
2 2 2 2 2 2 2
( 或接收器 ), 这取决 于它所 要完成 的功能。 CPU 发出 的控 制信号分为 地址码 和控 制量两 部分 , 地 址码 用来选 址 , 即 接通需要控 制的电 路 , 确定 控制 的种类 ; 控制量 决定 该调 整的类别及 需要调 整的 量。这样 , 各 控制 电路虽 然挂 在同 一条总线上 , 却彼此独立 , 互不相关。 I2 C 总线在传 送数据 过程中共有三种 类型 信 号 , 它们 分别 是 : 起 始 信号、 结束 信号和应答信 号。起始 信 号 : 电平时 , SCL 为高 电平 时 , SDA 由高 SCL 为低 电平向低电平跳 变 , 开 始 传送 数据。 结束 信 号 :
avr单片机_教程_实例_附电路图
AVR单片机特点每种MCU都有自身的优点与缺点,与其它8-bit MCU相比,AVR 8-bit MCU最大的特点是:● 哈佛结构,具备1MIPS / MHz的高速运行处理能力;● 超功能精简指令集(RISC),具有32个通用工作寄存器,克服了如8051 MCU采用单一ACC 进行处理造成的瓶颈现象;● 快速的存取寄存器组、单周期指令系统,大大优化了目标代码的大小、执行效率,部分型号FLASH非常大,特别适用于使用高级语言进行开发;● 作输出时与PIC的HI/LOW相同,可输出40mA(单一输出),作输入时可设置为三态高阻抗输入或带上拉电阻输入,具备10mA-20mA灌电流的能力;● 片内集成多种频率的RC振荡器、上电自动复位、看门狗、启动延时等功能,外围电路更加简单,系统更加稳定可靠;● 大部分AVR片上资源丰富:带E2PROM,PWM,RTC,SPI,UART,TWI,ISP,AD,Analog Comparator,WDT等;● 大部分AVR除了有ISP功能外,还有IAP功能,方便升级或销毁应用程序。
● 性价比高。
开发AVR单片机,需要哪些编译器、调试器?AVR Studio IDE、汇编编译器ATMEL AVR Studio集成开发环境(IDE),可使用汇编语言进行开发(使用其它语言需第三方软件协助),集软硬件仿真、调试、下载编程于一体。
ATMEL官方及市面上通用的AVR开发工具都支持AVRStudio。
GCCAVR (WinAVR) C编译器GCC是Linux的唯一开发语言。
GCC的编译器优化程度可以说是目前世界上民用软件中做的最好的,另外,它有一个非常大优点是,免费!在国外,使用它的人几乎是最多的。
但,相对而言,它的缺点是,使用操作较为麻烦。
ICC AVRC编译器(集烧写程序功能)市面上(大陆)的教科书使用它作为例程的较多,集成代码生成向导,虽然它的各方面性能均不是特别突出,但使用较为方便。
C51+AVR控制板介绍手册
C51+A VR控制板介绍手册V1.0概述:C51+A VR宝贝车控制板,是鸥鹏科技有限公司开发的,一款拥有C51和A VR功能的单片机控制板。
C51部分采用的是AT89S52单片机,A VR部分采用的是ALTMEGA8的单片机。
89S52的主要性能:¾与MCS-51 单片机产品兼容¾8K 字节在系统可编程Flash 存储器¾1000 次擦写周期¾全静态操作:0Hz~33Hz¾三级加密程序存储器¾32 个可编程I/O 口线¾三个16 位定时器/计数器¾八个中断源¾全双工UART 串行通道¾低功耗空闲和掉电模式¾掉电后中断可唤醒¾看门狗定时器¾双数据指针¾掉电标识符功能特性描述AT89S52 是一种低功耗、高性能CMOS8 位微控制器, 具有8K 在系统可编程Flash 存储器。
使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。
片上Flash 允许程序存储器在系统可编程,亦适于 常规编程器。
在单芯片上,拥有灵巧的8 位CPU 和在系统 可编程Flash ,使得AT89S52 为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89S52 具有以下标准功能:8k 字节Flash,256 字节RAM,32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器, 一个 6 向量 2 级中断结构, 全双工串行口,片内晶振及时钟电路。
另外,AT89S52 可降至0Hz 静态逻辑操作,支持2 种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM 、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM 内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
AVR的主要性能:高性能、低功耗的 8 位AVR® 微处理器先进的RISC 结构130 条指令。
51-avr程序说明
1、51\A VR,双程序提供。
2、程序说明:编写环境:51利用Keil2编写。
A VR利用ICC7.13编写。
实现方案:TTL电平,需要直接TXD-TXD,RXD-RXD,GND-GND.232连接,需要两个公头,将2-3,3-2,5-5即可。
程序实现:1初始化。
-------------------------------------------------------------------P00亮2设置发送类型为TEXT,(PDU的51需要外接存储器太大)。
---P01亮3检测网络注册状态。
----------------------------------------------------P02亮4循环扫描接收短信。
----------------------------------------------------P03亮(该灯常亮时证明进入待发送状态)5删除该短信----------------------------------------------------------------P04亮6利用手机发送0-7(只能是这8个数字)控制P2口的相应管脚。
(亲测可以实现。
)7响应之后,开始设置信息中心号,设置成功后-------------------P05亮8设置目的手机地址(就是对方的手机号)-------------------------P06亮9发送短信内容成功-------------------------------------------------------P07亮10之后返回第4步继续进行扫描--------------------------------------P03亮11如果有任何一步没有成功均返回错误指示-----------------------P21亮12我所写的是51的管脚定义法,A VR的换成ABCD对应。
程序说明:1、内有注解不做过多解释。
C51-AVR-Arduino微控制器 V1.1
C 51/A VR/Aruino Ver1.1C 51/A V R 教学板介绍-兼容a r d u i n o 控制器C51/A VR 微控制器。
它涵盖了由“A T89S52”组成的51单片机最小系统和由“A TMEGA8”组成的A VR 单片机最小系统以及由“Arduino ”组成的A VR 开发模块,他不仅是一个开发板,也是一个工程板。
1. 去除老式的DB 串口头(现今PC 机主板都不预留出串口DB 头),改用USB 直接可实现与PC 机间通信实验。
2.具有各自独立的ISP 接口,实现在系统编程。
3.配备各自独立的20Pin 排母接口,实现与其他模块(如液晶屏、摄像头、颜色传感器等)的连接,以完成更多的实验训练。
4.配备各自独立的4组3Pin电机驱动接口,为机器人的伺服电机提拱电源和驱动信号。
5.提供47mm×36mm的实验面包板,结合单片机各IO 接口,可搭建自由的电路,或传感器模块,完成面包板学习单片机的实验训练。
6.AVR IO 接口标符有Arduino 的标准接口字符,A TMEGA8单片机与A TMEGA328单片机引脚兼容,将在主板同时完成Arduino 的学习和实验。
7. 可通过两个电源跳线,实现C51单片机和A VR 单片机切换工作或同时工作。
在同一块微控制器板上又可通过两个跳线完成C51和A VR 间异种单片机间通信实验。
1. 主控芯片:Atmel A TMEGA8、AT89S52、A TMEGA3282. 编程开发环境:Keil uVision4、A VR Studio 4、Arduino IDE3. 主控芯片工作电压:4.5V~5.5V 4. 输入电源电压:6~9V5. 晶体:11.0592MHz(S52)、16MHz(A VR)6. 外形尺寸:102mm ×97mm1. USB 通信下载线2. 资料光盘和工程教学课本3. 6V 、2A 电源适配器等4. 具有S52、A TEMGA8、ATMEGA328(含固件)芯片的教学板》》产口概述¥ 主要特点 ¥ 技术参数 ¥ 基本配置产品资源介绍C 51/A V R /A r d u i n o 微控制器能做些什么?这不仅仅是一个微控制器,不能单一的说他是一个开发板。
51与AVR的移植
C51移植到AVR在Keil中为了节省数据存储器的空间,通过“code”关键字来定义一个数组或字符串将被存储在程序存储器中:uchar code buffer[]={0,1,2,3,4,5};uchar code string[]="ARM oric" ;而这类代码移值到ICCAVR上时是不能编译通过的。
我们可以通过"const" 限定词来实现对存储器的分配:#pragma data:codeconst unsigned char buffer[]={0,1,2,3,4,5};const unsigned char string[]="ARM oric";#pragma data:data注意:《1》使用ICCAVR6.31时,#pragma data :code ;#pragma data:data ; 这些语法时在"data:cod"、"data:data"字符串中间不能加空格,否则编译不能通过。
《2》const 在ICCAVR是一个扩展关键词,它与ANSIC标准有冲突,移值到其它的编译器使用时也需要修改相关的地方。
在ICCAVR中对数组和字符串的五种不同空间分配:const unsigned char buffer[]={0,1,2,3,4,5}; //buffer数组被分配在程序存储区中const unsigned char string[]="ARM oric" ; //stringp字符串被分配在程序存储区中const unsigned char *pt //指针变量pt被分配在数据存储区中,指向程序存储区中的字符类型数据unsigned char *const pt //指针变量pt被分配在程序存储区中,指向数据存储区中的字符类型数据const unsigned char *const pt //指针变量pt被分配在程序存储区,指向程序存储区中的字符类型数据unsigned char *pt //指针变量pt被分配在数据存储区中,指向数据存储区中的数据如何将ICCAVR程序中的数组存入FLASH中下面是ICCAVR中对字符串和常数表格分配可能出现的五种情况:const int table[]={1,2,3};//table表格只分配进程序存储器中const char string[]="iccavr";//字符串数组只分配进程序存储器中const char *prt1 //指针prt1位于数据存储器空间指向程序存储器空间的字符型数据char *const prt2 //指针prt2位于程序存储器空间指向数据存储器空间的字符型数据const char *const prt3 //指针prt3位于程序存储器空间指向程序存储器空间的字符型数据实际使用中常使用前三种在KEIL中的用法unsigned char code table[]={1,2,3,4};unsigned char code a[]="keil";在IAR中引入"flash"关键字,用法如下:flash unsigned char table[]={1,2,3,4,5};flash unsigned char a[]="IAR";在ICCAVR中的用法是#pragma data:codeconst unsigned char table[]={1,2,3};const unsigned char a[]="ICCAVR";#pragma data:data1.一般最需要注意的是扩展关键字的不同比如端口位的定义:1)在keic c中,有sbit这个关键字,可以定义端口某一个引脚. .2)在IARAVR中, 相应的采用 PORTX_Bitn 来定义端口位.3)在ICCAVR 中则没有相应的端口位定义关键字,只能通过相应的宏文件,采用按位与及按位或的方式控制端口的某一位.还有关于变量存储位置定义的关键字区别:1)keil c中采用data,xdata,code这些关键字可以定义变量或常量存储的位置2)IARAVR中采用__flash _regvar 等来控制变量存储位置.3)ICCAVR中采用同IARAVR类似的关键字如:__flash 来控制存储位置2.另外就是关于数据类型长度的问题比如某些编译器里float是32位,但是某些编译器里float是24位. 另外对于对于char int,这些具体表示有符号数还是无符号数,也会不一样.3. 存储器存储长字节数据的方式也不同:51单片机中,存放int ,long这些大于一个字节长度的数据时, 是低地址存放高位字节, 高地址存放低位字节.而AVR中恰恰相反, 低地址存放低位字节,高地址存放高位字节.因此,如果在程序中涉及采用联合体或是依次访问内存地址的方法对长字节数据分离的话,就要注意低地址里读取的是高字节还是低字节了.顺便提一下51单片机(包括STC的)程序移植到AVR平台上需要注意的地方:1) 头文件, 寄存器名,寄存器设置代码都是要相应修改的.2) IO端口的位操作要做相应的调整.3) 中断服务函数的格式也有不同,需做相应调整4) 51单片机的端口寄存器复位值为1,因此作为输出端口时,即使程序中不作设置,也会输出高电平, 而AVR单片机中端口寄存器PORTX 复位值为0, 因此51单片机的程序移植到avr单片机中时一定要注意端口初始化代码, 假设51程序中没有进行初始化,那么端口默认为高, 到了avr中,如果照搬原来的程序,端口就变成低电平,可能导致系统不能正常运行,而且不好查出来问题.5) 由于两者对于长字节数据存放的方式不同,从地址到高地址, 51平台上依次存放高字节和低字节, AVR上依次存低字节和高字节, 所以如果程序中涉及到采用联合体或是依次访问内存地址的方法对长字节数据进行分离的话,就要注意低地址里读取的是高字节还是低字节了.比如:union UNI_2BYTE{uint dat;uchar tab[2];}wdat;在这个联合体wdat中, 成员dat是个占2个字节长度的整形数, 那么wdat.tab[0]表示dat的低地址的那一个字节,如果是在keil c中, 由于规定低地址存放高字节, 那么wdat.tab[0]就是dat 的高字节.如果是在IARAVR或者ICCAVR中,由于低地址存放低字节, 那么wdat.tab[0]就是dat的低字节。
51单片机驱动LCD1602程序设计(C语言)
4.显示开关控制指令
功能:控制显示器开/关、光标显示/关闭以及光标是否闪烁。参数设定的情况如下: 位名 D C B 设置 0=显示功能关 0=无光标 0=光标闪烁 1=显示功能开 1=有光标 1=光标不闪烁
5.设定显示屏或光标移动方向指令
功能:使光标移位或使整个显示屏幕移位。参数设定的情况如下: S/C 0 0 1 1 0 1 0 1 R/L 设定情况 光标左移 1 格,且 AC 值减 1 光标右移 1 格,且 AC 值加 1 显示器上字符全部左移一格,但光标不动 显示器上字符全部右移一格,但光标不动
10.数据写入 DDRAM 或 CGRAM 指令一览
功能:<1> 将字符码写入 DDRAM,以使液晶显示屏显示出相对应的字符; <2> 将使用者自己设计的图形存入 CGRAM。
11.从 CGRAM 或 DDRAM 读出数据的指令一览
功能:读取 DDRAM 或 CGRAM 中的内容。
基本操作时序:
读状态
从上图可以看出,“A”字的对应上面高位代码为 0100,对应左边低位代码为 0001,合起来就 是 01000001,也就是 41H。可见它的代码与我们 PC 中的字符代码是基本一致的。因此我们在向 DDRAM 写 C51 字符代码程序时甚至可以直接用 P1='A'这样的方法。 PC 在编译时就把“A”先转为 41H 代码了。 字符代码 0x00~0x0F 为用户自定义的字符图形 RAM(对于 5X8 点阵的字符,可以存放 8 组, 5X10 点阵的字符,存放 4 组),就是 CGRAM 了。后面我会详细说的。 0x20~0x7F 为标准的 ASCII 码, 0xA0~0xFF 为日文字符和希腊文字符, 其余字符码(0x10~ 0x1F 及 0x80~0x9F)没有定义。
RTX51tiny实时操作系统在单片机STC12C5A60S2上的移植
RTX51tiny实时操作系统在单片机STC12C5A60S2上的移植作者:余向阳来源:《数字化用户》2013年第06期【摘要】RTX51tiny实时操作系统是Keil C51单片机开发集成环境自带的一个实时操作系统,此操作系统功能强大,简单易用,本文讲解把它移植到单片机STC12C5A60S2上的方法。
【关键词】RTX51tiny 实时操作系统单片机 STC12C5A60S2RTX51tiny实时操作系统是Keil C51单片机集成开发环境自带的一个实时操作系统,它功能强大、简单易用。
它可以应用在所有的8051衍生的单片机系列中。
STC12C5A60S2单片机是深圳宏晶科技有限公司旗下的功能强大的1T单片机。
此单片机是新一代增强型8051单片机,运行的速度是传统8051单片机的8~12倍,这是相当快的速度。
它内部资源丰富,兼容性强,并且内部ROM可达60KB,对于一般的应用已经足够。
在一些比较复杂的应用中,如果使用超级循环进行编程,则在实时性,逻辑性,资源的共享等方面存在较为复杂的关联性,这对编程来说是不利的。
另外在增加与删除功能上也会增加编程的复杂性。
能不能把RTX51tiny操作系统移植到STC12C5A60S2单片机上呢?如果可以则在保证实时性的基础上,编程的复杂性会大幅降低,程序可维护性也会大幅提升。
增加或者删除功能会变得相当容易。
答案是肯定的。
RTX51tiny操作系统完全可以移植到STC12C5A60S2单片机上。
先来看看RTX51tiny操作系统介绍。
一、RTX51tiny操作系统的特性RTX51tiny操作系统是集成在Keil C51开发环境中的实时系统。
它的主要特点如下:(一)采用时间片轮转调度策略进行任务切换,不支持抢占式任务调度策略。
(二)允许最大16个任务循环切换。
(三)支持信号传递,不支持消息处理、队列处理、邮箱等功能。
(四)内核很小,最大仅占用900字节。
(五)系统函数仅有13个,非常容易使用。
普通51单片机驱动3.5寸TFT的应用实例与源代码
普通51单片机驱动3.5寸TFT的应用实例与源代码!前市场流行的3.5寸屏基本上都是只内置了驱动器,而不带控制器,这样给用户的使用造成了一些难度。
基本上很多朋友在用彩屏时选择一些带LCD控制器的ARM7或ARM9去开发,对于不会ARM开发的朋友来说,只使用普通MCU,这样可以选择的3.5寸TFT模块,就很难找到了。
本文就是基于市场上一款比较使用的3.5寸TFT模块编写的,用户只需要帮该TFT模块当作普通的单色液晶的开发思路来使用,就可以很容易去编程。
一、硬件选择1、 MCU:AT89S512、开发编译环境:Keil C513、 3.5寸TFT模块型号:MzT35C1二、TFT模块基本性能:1、基本参数模块结构:内置控制器屏幕大小: 3.5英寸屏幕分辩率:320*240屏幕颜色数:65536色(16位真彩色)工作电压: 3.3V/5V可选总线结构: Intel8080总线宽度: 8Bit背光形式:LED;可指令控制,0-127可调连接方式:排针插座触摸屏:标准配置不带触摸屏;模组留有触摸屏芯片焊盘和触摸屏接口2、接口引脚说明3、操作时序(8位并行Intel 8080总线)MzT35C1模块支持intel8080总线,总线的最高速度可达20MHz(当然总线的速度能否达到最高接口速度,还与用户的总线布线、线长等有关),也就是说,如果控制MCU速度足够快的话,是可以支持视频的显示的。
注意:MzT35C1模块的总线接口是8位的,也就意味着对显存的数据操作时,需要连续进行两次操作方可完成,先传高字节再传低字节;但对于寄存器的操作(写入寄存器地址,即A0为低时的写入操作)8位的操作方可。
三、MzT35C1与51硬件接口连接图本例程使用GPIO来模拟总线时序。
上图的模块供电为5V的模块,而模块的端口电平为3.3V的,所以在所有的51端口与模块间的连接串入了一个100欧的电阻,有关MCS51的其它电路不在图中画出,请用户具体参考其它的开发板文档进行了解。
5110液晶驱动程序--AVR
//*******5110是一个48行*84 的点阵,12列*16的汉字只能显示3行(48/16=3),12*12的汉字可以显示4行(48/12=4),图片取模可以显示出图片*********////端口说明:res、cs、dc、sdin、sclk分别为PA口的0、1、2、3、4位//注意:若把数组放入__flash区,我的数组地址送不出去,不知道为什么!!!!/**************将******************************************************************************* *************************************///LCD_write_byte(0x09,0); //黑屏命令LCD_write_byte(0x0D,0); //反映射输出(反白显示命令)#include <iom128.h>#define uchar unsigned char#define uint unsigned int#define BIT(X) (1 << X)//*******************5110控制端口定义//#define RES 0#define CS 1#define DC 2#define SDIN 3#define SCLK 4//------------------------------取模汉字是12列16的数字------------------------------------------------------------------------------//uchar DA[21][24]={{0x00,0xC0,0xF0,0x30,0x18,0x08,0x08,0x08,0x30,0xF0,0xC0,0x00,0x00,0x07,0x1F,0x18,0 x30,0x20,0x20,0x20,0x18,0x1F,0x07,0x00},//0{0x00,0x00,0x10,0x10,0x10,0xF0,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0 x20,0x3F,0x3F,0x20,0x20,0x20,0x00,0x00},//1{0x00,0x70,0x50,0x08,0x08,0x08,0x08,0x18,0xF0,0x70,0x00,0x00,0x00,0x20,0x30,0x28,0x 24,0x24,0x22,0x21,0x20,0x38,0x00,0x00},//2{0x00,0x30,0x38,0x08,0x88,0x88,0xD8,0x78,0x30,0x00,0x00,0x00,0x00,0x18,0x38,0x20,0 x20,0x20,0x20,0x31,0x1F,0x0E,0x00,0x00},//3{0x00,0x00,0x00,0x80,0x40,0x20,0x10,0xF8,0xF8,0x00,0x00,0x00,0x00,0x06,0x05,0x04,0 x04,0x24,0x24,0x3F,0x3F,0x24,0x24,0x00},//4{0x00,0x00,0xF8,0x08,0x88,0x88,0x88,0x88,0x08,0x08,0x00,0x00,0x00,0x18,0x19,0x21,0x 20,0x20,0x20,0x31,0x1F,0x0F,0x00,0x00},//5{0x00,0xC0,0xE0,0x30,0x98,0x88,0x88,0x88,0x98,0x10,0x00,0x00,0x00,0x0F,0x1F,0x11,0 x20,0x20,0x20,0x20,0x31,0x1F,0x0E,0x00},//6{0x00,0x00,0x30,0x18,0x08,0x08,0x08,0x88,0x68,0x18,0x08,0x00,0x00,0x00,0x00,0x00,0x 00,0x38,0x3E,0x01,0x00,0x00,0x00,0x00},//7{0x00,0x70,0xF0,0x98,0x88,0x88,0x08,0x08,0x98,0x70,0x70,0x00,0x00,0x0C,0x1E,0x31,0 x20,0x21,0x21,0x21,0x33,0x1E,0x0C,0x00},//8{0x00,0xE0,0xF0,0x18,0x08,0x08,0x08,0x08,0x10,0xF0,0xE0,0x00,0x00,0x01,0x11,0x33,0 x22,0x22,0x22,0x32,0x19,0x0F,0x07,0x00},//9{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x 30,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//"."{0x00,0x30,0x90,0x10,0x50,0x0A,0xF4,0x10,0x10,0x30,0x18,0x00,0x00,0x84,0x84,0x47,0 x24,0x14,0x0F,0x14,0x24,0x64,0x04,0x00},//实{0x00,0xFC,0x64,0x9C,0x04,0x44,0x44,0xC4,0x44,0x44,0x44,0x00,0x00,0x7F,0x08,0x0F,0 x18,0x06,0x42,0x7F,0x00,0x06,0x18,0x00},//际{0x00,0x80,0xF8,0x06,0x08,0xC8,0x3C,0x48,0x48,0xE8,0x08,0x00,0x01,0x00,0xFF,0x80,0 x80,0x7F,0x95,0x95,0x95,0x7F,0x40,0x00},//值{0x00,0x40,0xC4,0xC0,0x40,0x3C,0x04,0x04,0x3E,0xA0,0x20,0x00,0x00,0x00,0x0F,0x90, 0x88,0x41,0x2F,0x19,0x27,0x41,0x40,0x00},//设{0x00,0x40,0x5C,0x54,0x4C,0xF4,0x4C,0x54,0xD4,0x5C,0x20,0x00,0x00,0x00,0x40,0x7F, 0x6B,0x6A,0x6B,0x6B,0x7F,0x40,0x40,0x00},//置{0x00,0x80,0xF8,0x06,0x08,0xC8,0x3C,0x48,0x48,0xE8,0x08,0x00,0x01,0x00,0xFF,0x80,0 x80,0x7F,0x95,0x95,0x95,0x7F,0x40,0x00}//值};//---------------------1ms延时函数void delayms(uint ii){uint i , x;for (x = 0 ; x < ii ; x ++){for ( i = 0 ; i < 200 ; i++);}}//----------------------------------------------//-------------液晶写命令函数-------------------void LCD_write_com(uchar dt){uchar i;PORTA &= ~BIT(CS);//片选,低电平有效PORTA &= ~BIT(DC);//DC为低表示输入命令for(i = 0; i < 8;i ++){PORTA &= ~BIT(SCLK); //sdin在时钟正边沿取样if(dt & 0x80) //先送入字节高位PORTA |= BIT(SDIN);elsePORTA &= ~BIT(SDIN);PORTA |= BIT(SCLK);dt = dt << 1; //dt左移一位}PORTA |= BIT(DC);PORTA |= BIT(CS);//片选,低电平有效PORTA |= BIT(SDIN);}//----------------------------------------------//--------------液晶写数据函数------------------//com0dat1 :写数据/命令选择;0 是命令1是数据//----------------------------------------------void LCD_write_dat(uchar dt){uchar i;PORTA &= ~BIT(CS);//片选,低电平有效PORTA |= BIT(DC);//dc为高表示输入数据for(i = 0; i < 8;i ++){PORTA &= ~BIT(SCLK); //sdin在时钟正边沿取样if(dt & 0x80) //先送入字节高位PORTA |= BIT(SDIN);elsePORTA &= ~BIT(SDIN);PORTA |= BIT(SCLK);dt = dt << 1; //dt左移一位}PORTA |= BIT(DC);PORTA |= BIT(CS);//片选,低电平有效PORTA |= BIT(SDIN);}/*---------------------------------------LCD_init: 3310LCD初始化----------------------------------------- */void LCD_init(void){DDRA = 0XFF;PORTA = 0XFF;PORTA &= ~BIT(RES);//复位脉冲复位寄存器,因为接电源后内部寄存器和RAM的值不确定delayms(10); //最多是100msPORTA |= BIT(RES);LCD_write_com(0x21);//初始化Lcd,功能设定使用扩充指令LCD_write_com(0xd0);//设定液晶偏置电压LCD_write_com(0x20);//使用基本指令LCD_write_com(0x0C);//设定显示模式,正常显示// LCD_write_com(0x08);//设定显示为空白显示屏蔽为白屏// LCD_write_com(0x09);//设定显示为全部显示屏幕为黑屏// LCD_write_com(0x0d);//设定显示是反映射的底部是黑的字是白的// LCD_write_com(0x0C);//设定显示是正常模式,底部是白的字是黑的}/*-------------------------------------------LCD_set_XY: 设置LCD坐标函数输入参数:X:0-83 Y:0-5---------------------------------------------*/void LCD_set_XY(uchar X, uchar Y) // X为列Y为行{LCD_write_com(0x40 | Y);//0x40|Y是由于设置行的命令中有0x40,而行取值为0-5,不会出现0x40,所以要|上LCD_write_com(0x80 | X);//0x80 |X是由于设置列的命令中有0x80,而列取值为0-83,不会出现0x80,所以要|上}/*------------------------------------------LCD_clear: LCD清屏函数--------------------------------------------*/void LCD_clear(void){uchar t;uchar k;LCD_set_XY(0,0);for(t=0;t<6;t++) //因液晶可自动向前推进,所以写{ //一次地址即可for(k=0;k<84;k++){LCD_write_dat(0x00);}}}/*------------------------------------------------------------*//* ----------屏幕闪烁函数--制造一种动态效guo------------------*//* --------输入参数n是闪烁的次数------------------------------*/void LCD_scrm_blink( char n){for(;n>0;n--){LCD_write_com(0x08);//显示为空白模式--显示空白不显字delayms(250);LCD_write_com(0x0C);//显示为普通模式--正常显示字符delayms(250);}}/*---------------------------------------------------------------------------------------------------------------------LCD_write_shu: 显示6(宽)*16(高)点阵数字、字母函数输入参数:c:显示的字符;-----------------------------------------------------------------------------------------------------------------------*//*void LCD_write_shu(uchar x, uchar y,uchar c[]) //x:列上第几个字y:行{uchar i;LCD_set_XY(x*12, y);// 列上第几个字符,行for(i=0; i<6;i++) //写入字符上半部分{LCD_write_dat(c[i]);}LCD_set_XY(x*12, y+1);for(i=6; i<12;i++) //写入字符下半部分{LCD_write_dat(c[i]);}} *//*------------------------------------------------------------------------------------------------------LCD_write_hanzi: 显示12(宽)*16(高)点阵汉字函数输入参数:*p:显示的汉字;--------------------------------------------------------------------------------------------------------*/void LCD_write_hanzi_12_16(uchar x, uchar y,uchar *p) //x:列上的第几个汉字y:行(取0--5){uchar i;LCD_set_XY(x*12, y);// 列上的第几个汉字,行for(i=0; i<12;i++) //写汉字的上半部分{LCD_write_dat(*(p+i));}LCD_set_XY(x*12, y+1);// 列,页for(i=12; i<24;i++){LCD_write_dat(*(p+i));}}/*------------------------------------------------------------------------------------------------------write_hanzi: 显示12(宽)*16(高)点阵汉字函数输入参数:*p:显示的汉字数组--即包括所有取模汉字;//x:列上的第几个汉字y:行(取0--5)(x,y)为要写汉字的起始位置,n为要显示的汉字数--------------------------------------------------------------------------------------------------------*/void write_hanzi_12_16(uchar x, uchar y, uchar n, uchar p[21][24]){uchar i;for(i = 0; i < n; i++){if((y + ((x + i) / 7) * 2) < 6)LCD_write_hanzi_12_16((x + i) % 7, y + ((x + i) / 7) * 2, p[i]);elsereturn;}}/*------------------------------------------------------------------------------------------------------------------- LCD_write_hanzi: 显示12(宽)*12(高)点阵汉字函数***********一个12*12汉字分为上、中、下3部分输入参数:x:列上的第几个汉字y:行*p为上面的汉字,*s为下面的汉字---------------------------------------------------------------------------------------------------------------------* //*void LCD_write_hanzi_12_12(uchar x, uchar y,uchar *p,uchar *s){uchar i;uchar temp;LCD_set_XY(x*12, y);//列上的第几个汉字,行for(i=0; i<12;i++) //写上面汉字的上、中部分{LCD_write_dat(*(p+i));}LCD_set_XY(x*12, y+1);for(i=0; i<12;i++) //把上面汉字的下部分和下面汉字上部分和起来写{ temp=*(s+i);temp=temp<<4;temp=temp|(*(p+i+12));LCD_write_dat(temp);}LCD_set_XY(x*12, y+2);for(i=0;i<12;i++) //把下面汉字的中、下部分合起来写{temp=((*(s+i)&0xf0)|*(s+i+12));temp=_crol_(temp,4);//循环左移LCD_write_dat(temp);}}*///**************************************主函数void main(){unsigned char k;DDRA = 0XFF;PORTA = 0XFF;PORTA &= ~BIT(RES);for(k=0;k<250;k++);PORTA |= BIT(RES);LCD_init(); //初始化LCD模块LCD_clear();write_hanzi_12_16(0, 0, 12, DA);delayms(1000);LCD_scrm_blink(5);//屏幕闪烁5次LCD_write_com(0x09); //黑屏命令delayms(500);LCD_write_com(0x0D); //反映射输出(反白显示命令)while(1) ;}。
AVR单片机如何在程序中访问FLASH
• 读取示例: unsigned char i, ram_val; for(i=0; i<10; i ++) // 循环读取每一字节 { ram_val = pgm_read_byte(flash_array + I); … … //处理 }
FLASH 区字符串常量的应用
• • 全局定义形式: const char flash_str*+ PROGMEM = “Hello, world!”; 函数内定义形式: const char *flash_str = PSTR(“Hello, world!”);
• 定义格式: 数据类型 常量名 PROGMEM = 值,如: char val8 PROGMEM = 1 ; int val16 PROGMEM = 1 ; long val32 PROGMEM =1 ; 对于不同长度的整数类型 avr-libc 提供对应的读取函数: pgm_read_byte(prog_void * addr) pgm_read_word(prg_void *addr) pgm_read_dword(prg_void* addr) 另外在pgmspace.h 中定义的8 位整数类型 prog_char 和 prog_uchar 分别指定在FLASH 内的8 位 有符号整数和8 位无符号整数。应用方式如下: char ram_val; //ram 内的变量 const prog_char flash_val = 1; //flash 内常量 ram_val=pgm_read_byte(&flash_val); //读flash 常量值到RAM 变量 对于应用程序FLASH 常量是不可改变的,因此定义时加关键字const 是个好的习惯。
AVR单片机如何在程序中访问FLASH 程序存储器?
字符型LCD与AVR单片机的电路连接
– PB4~PB5作为数据线 根据LCD1602的数据操作模式,AVR与LCD1602的接口电路设计分为2种模式
ATmega16四组通用I/O端口 PB4~PB5作为数据线
– PB0~PB2作为控制线 控制线RS、R/W、E
如何连接?找出来驱动显示电路显示字符A在LCD上。 AVR与LCD1602的2种接口模式 如何连接?找出来驱动显示电路显示字符A在LCD上。 深圳职业技术学院 柴继红 深圳职业技术学院 柴继红 ATmega16最小系统与LCD拨码开关 ATmega16的PB端口连接LCD模块 AVR与LCD1602的2种接口模式 如何连接?找出来驱动显示电路显示字符A在LCD上。 PB4~PB5作为数据线 根据LCD1602的数据操作模式,AVR与LCD1602的接口电路设计分为2种模式 ATmega16最小系统与LCD拨码开关 LCD与AVR单片机 的电路连接 控制线RS、R/W、E PA0~PA7作为数据线 LCD与AVR单片机 的电路连接 LCD与AVR单片机 的电路连接
AVR与LCD1602的2种接口模式
• 根据LCD1602的数据操作模式,AVR与 LCD1602的接口电路设计分为2种模式
– 8位接口模式:DB0~DB7作数据线 – 4位接口模式:采用DB4~DB7作数据线,
DB0~DB3不用
8位模式接口电路
• ATmega16与LCD模块的接口
– PA0~PA7作为数据线 – PC0~PC2作为控制线
ATmega16最小系统与LCD拨码开关
ATmega16实训开发平台
64855124
ATmega16四组通用I/O端口 深圳职业技术学院 柴继红4位模式接口电路 8位口模式:DB0~DB7作数据线
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Jiang Jason
Step1:端口处理
• 包含此头文件Port口需要初始化。
Step2: code区数据处理
包含一下头文件后,可如下实现C51里code的处理:
Step3:处理编译
要注意的问题
• AVR单片机在烧写时默认是用内部时钟,可以用烧写软件修改熔丝来 该成外部时钟。 • 注意LCD电压。一般有两种板子:3.3V 和5V, 如果是5V的,还要看数 据线上有没有串联限流电阻,因为一般TFT的LCD都是3.3v,5V的电平 送到LCD的数据口上会不工作。 • 如果在step2里直接把code删掉(不加PORGMEM),那么这段数据就 会被放在SRAM里,如果AVR单片机的SRAM不够大(MEGA16是1K, MEGA32是2K),要么不工作,要么出现乱码。
源码
C51的:
AVR Mega16的: