十速单片机TM57MA15---C语言编程应用笔记 [兼容模式]

合集下载

十速 TM57PE11 8为单片机 说明书

十速 TM57PE11 8为单片机 说明书

Advance Informationtenx technology, inc.TM57PE118位 单片机使用手册Tenx reserves the right to change or discontinue this product without notice.tenx technology inc.CONTENTS1.基本功能 (2)2.系统结构图 (2)3.管脚分配图 (3)4.管脚描述 (3)5.功能描述 (4)5.1 CPU芯片 (4)5.1.1 时钟配置和指令周期 (4)5.1.2 寻址模式 (4)5.1.3 程序计数器和堆栈 (5)5.1.4 ALU和工作寄存器 (5)5.1.5 状态寄存器 (5)5.1.6 中断 (6)5.2 芯片工作模式 (7)5.2.1 复位 (7)5.2.2 系统配置寄存器(SYSCFG) (7)5.2.3 可重复编程 (8)5.2.4 省电模式 (8)5.3 外围功能图 (9)5.3.1 WDT/WKT定时器 (9)5.3.2 可扩展的8位定时计数器(定时器0)(PSC) (9)5.3.3 系统时钟振荡器 (10)5.4 I/O口 (11)5.4.1 PA0-1 (11)5.4.2 PA2-4 (12)5.4.3 PA7 (13)6.内存功能图 (13)F-Plane (13)R-Plane (14)7.指令表 (15)8.电气特性 (26)1 tenx technology, inc.2 tenx technology, inc.1. 基本功能1.ROM :1K ⅹ14 OTP 或者512ⅹ14位 TTP TM (ROM 可编程两次) 2.PAM :48ⅹ8位 3. 堆栈:5级4. I/O 口:可编程三次(最大6脚)5. 定时计数器:带有1-256预分频的8位定时控制器6. 看门狗/唤醒定时器:基于内部RC 振荡,唤醒时间为20-160毫秒的芯片定时器7. 复位:电源复位,看门狗复位,低电压复位,外部复位8. 系统时钟模式:- 内部RC :4MHZ - 外部RC 9. 工作电压:LV 复位电压至5.5V 10. 指令:36个11. 中断:两个管脚中断,定时器0中断和唤醒定时器中断 12. 支持省电模式2. 系统结构图3 tenx technology, inc.3. 管脚分配图VDD 1 U 8VSSXrc/PA4 2 7PA0/INT0 CLKO/PA33 TM57PE116PA1 VPP/INT2/nRESET/PA745PA2/T0I4. 管脚描述管脚名称输入/输出管脚描述PA0–PA1 I/O位编程I / O 端口,可施密特触发输入或CMOS 推挽输出或者伪开漏式输出。

10天学单片机全套C语言程序

10天学单片机全套C语言程序

/*点阵扫描原理是先输出行字模码,再列扫描点阵*/ /*程序功能点阵循环显示1~9数字*/#include"reg51.h"#define uchar unsigned char#define uint unsigned intsbit we=P2^7;sbit du=P2^6;uchar rowtab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; ucharcoltab[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; ucharzhong[]={0x10,0xFE,0x92,0x92,0xFE,0x92,0x10,0x10}; uchar ling[]={0x18,0x24,0x24,0x24,0x24,0x24,0x24,0x18}; uchar yi[]={0x8,0x18,0x28,0x8,0x8,0x8,0x8,0x8};uchar er[]={0x30,0x48,0x48,0x8,0x10,0x20,0x78,0x0}; uchar san[]={0x30,0x48,0x8,0x10,0x30,0x8,0x48,0x30}; uchar si[]={0x24,0x24,0x24,0x24,0x3F,0x4,0x4,0x4}; uchar wu[]={0x3C,0x20,0x20,0x3C,0x4,0x4,0x3C,0x0}; uchar liu[]={0x1C,0x20,0x20,0x20,0x3C,0x24,0x24,0x18}; uchar qi[]={0x7C,0x4,0x8,0x10,0x10,0x10,0x10,0x10}; uchar ba[]={0x18,0x24,0x24,0x18,0x18,0x24,0x24,0x18}; uchar jiu[]={0x18,0x24,0x24,0x1C,0x4,0x8,0x10,0x0};#define aport P1#define kport P0void delay(uint x){ uchar y;for(;x>0;x--)for(y=100;y>0;y--);}void main(){uchar i,j;we=0;du=0;//关闭数码管while(1){for(i=0;i<8;i++)//列扫描{aport=coltab[i];kport=0;delay(1000);}for(j=0;j<200;j++){for(i=0;i<8;i++){kport=rowtab[i];aport=yi[i];delay(10);}}for(j=0;j<200;j++){for(i=0;i<8;i++){kport=rowtab[i];aport=er[i];delay(10);}}for(j=0;j<200;j++){for(i=0;i<8;i++){kport=rowtab[i];aport=san[i];delay(10);}}for(j=0;j<200;j++){for(i=0;i<8;i++){kport=rowtab[i];aport=si[i];delay(10);}}for(j=0;j<200;j++){for(i=0;i<8;i++){kport=rowtab[i];aport=wu[i];delay(10);}}for(j=0;j<200;j++){for(i=0;i<8;i++){kport=rowtab[i];aport=liu[i];delay(10);}}for(j=0;j<200;j++){for(i=0;i<8;i++){kport=rowtab[i];aport=qi[i];delay(10);}}for(j=0;j<200;j++){for(i=0;i<8;i++){kport=rowtab[i];aport=ba[i];delay(10);}}for(j=0;j<200;j++){for(i=0;i<8;i++){kport=rowtab[i];aport=jiu[i];delay(10);}}}}/*********************************************** ***24C02.C功能描述:PC端发送3个数据n0,n1,n2.n0=0,写,将n1写入n2地址中n0=1,读,读出n1地址中的数据,n2不起作用,但必须有收到一个字节后,将其地址值显示在数码管第1、2位上,数值显示在第5、6位上读出一个字节后,将其地址值显示在数码管第1、2位上,读出的值显示在第5、6位上;**************************************************/#define uchar unsigned char#define uint unsigned int#define Slaw 0x0a; //写命令字#define Slar 0xa1; //读命令字#include "reg52.h"#include "intrins.h"sbit Scl=P2^1; //串行时钟sbit Sda=P2^0; //串行数据bit Rec; //接收到数据的标志uchar RecBuf[3]; //接收缓冲区#define Hidden 0x10; //消隐字符在字形码表中的位置sbit we=P2^7;sbit du=P2^6;uchar code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; uchar code disptab[]={0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x0};uchar DispBuf[6];uchar code TH0Val=(65535-3000)/256;uchar code TL0Val=(65535-3000)%256;uchar code th1=0xfd;uchar code tl1=0xfd;//以下是中断程序,用于显示void timer0() interrupt 1{static uchar count;uchar tmp;P0|=0x3f;we=1;tmp=dispbit[count];P0&=tmp;we=0;du=1;tmp=DispBuf[count];tmp=disptab[tmp];P0=tmp;du=0;count++;if(count==6)count=0;TH0=TH0Val;TL0=TL0Val;}/*发送起始条件*/void Start(void) /*起始条件*/ {Sda=1;Scl=1;_nop_ ();_nop_ ();_nop_ ();_nop_ ();Sda=0;_nop_ ();_nop_ ();_nop_ ();_nop_ ();}void Stop(void) /*停止条件*/{Sda=0;Scl=1;_nop_ ();_nop_ ();_nop_ ();_nop_ ();Sda=1;_nop_ ();_nop_ ();_nop_ ();_nop_ ();}void Ack(void) /*应答位*/{Sda=0;_nop_ ();_nop_ ();_nop_ ();_nop_ ();Scl=1;_nop_ ();_nop_ ();_nop_ ();_nop_ ();Scl=0;}void NoAck(void) /*反向应答位*/ {Sda=1;_nop_ ();_nop_ ();_nop_ ();_nop_ ();Scl=1;_nop_ ();_nop_ ();_nop_ ();_nop_ ();Scl=0;}void Send(uchar Data) /*发送数据子程序,Data为要求发送的数据*/{uchar BitCounter=8; /*位数控制*/uchar temp; /*中间变量控制*/do{temp=Data;Scl=0;_nop_ ();_nop_ ();_nop_ ();_nop_ ();if((temp&0x80)==0x80)/* 如果最高位是1*/Sda=1;elseSda=0;Scl=1;temp=Data<<1; /*RLC*/Data=temp;BitCounter--;}while(BitCounter);Scl=0;}uchar Read(void) /*读一个字节的数据,并返回该字节值*/{uchar temp=0;uchar temp1=0;uchar BitCounter=8;Sda=1;do{Scl=0;_nop_ ();_nop_ ();_nop_ ();_nop_ ();Scl=1;_nop_ ();_nop_ ();_nop_ ();_nop_ ();if(Sda) /*如果Sda=1;*/temp=temp|0x01; /*temp的最低位置1*/elsetemp=temp&0xfe; /*否则temp的最低位清0*/if(BitCounter-1){ temp1=temp<<1;temp=temp1;}BitCounter--;}while(BitCounter);return(temp);}void WrToROM(uchar Data[],uchar Address,uchar Num) {uchar i=0;uchar *PData;PData=Data;Start();Send(0xa0);Ack();Send(Address);Ack();for(i=0;i<Num;i++){Send(*(PData+i));Ack();}Stop();}void RdFromROM(uchar Data[],uchar Address,uchar Num){uchar i=0;uchar *PData;PData=Data;for(i=0;i<Num;i++){Start();Send(0xa0);Ack();Send(Address+i);Ack();Start();Send(0xa1);Ack();*(PData+i)=Read();Scl=0;NoAck();Stop();}}void Recive() interrupt 4 //串行中断程序{ static uchar Count=0;if(TI){ TI=0;return; //如果是发送中断,直接退出}RI=0; //清RI标志RecBuf[Count]=SBUF;Count++;Rec=0;if(Count>=3){ Count=0;Rec=1; //置位标志}}void Init(){ TMOD=0x21;RI=0;TH1=0xfd;TL1=0xfd;PCON|=0x80;TR1=1;SCON=0x50;TH0=TH0Val;TL0=TL0Val;ET0=1; //开T0中断EA=1; //开总中断ES=1;TR0=1; //T0开始运行TR1=1;}void Calc(uchar Dat1,uchar Dat2) //第一个参数放在第1、2位,第二个参数放入第5、6位{ DispBuf[0]=Dat1/16;DispBuf[1]=Dat1%16;DispBuf[4]=Dat2/16;DispBuf[5]=Dat2%16;}void main(){ uchar RomDat[4];Init(); //初始化DispBuf[2]=Hidden;DispBuf[3]=Hidden;for(;;){Calc(RecBuf[1],RomDat[0]); //分别显示地址和数据if(Rec) //接收到数据{ Rec=0; //清除标志if(RecBuf[0]==0) //第一种功能,写入{ RomDat[0]=RecBuf[2];WrToROM(RomDat,RecBuf[1],1);SBUF=RomDat[0];}else{ RdFromROM(RomDat,RecBuf[1],1);SBUF=RomDat[0];}}}}/*程序功能:向0x03地址写入0xAA(170),然后读取显示接线顺序P3.3--------CSP3.4--------CLKP3.5--------DIP3.6--------DO *//*********************************包含头文件******************************/#include <reg51.h>#include <intrins.h>/*********************************数据定义********************************/#define OP_EWEN_H 0x00 // 00write enable#define OP_EWEN_L 0x60 // 11X XXXXwrite enable#define OP_EWDS_H 0x00 // 00disable#define OP_EWDS_L 0x00 // 00X XXXXdisable#define OP_WRITE_H 0x40 // 01 A6-A0write data#define OP_READ_H 0x80 // 10 A6-A0read data#define OP_ERASE_H 0xc0 // 11 A6-A0erase a word#define OP_ERAL_H 0x00 // 00erase all#define OP_ERAL_L 0x40 // 10X XXXXerase all#define OP_WRAL_H 0x00 // 00write all#define OP_WRAL_L 0x20 // 01X XXXXwrite all/*********************************端口定义**********************************/sbit CS = P3^3;sbit SK = P3^4;sbit DI = P3^5;sbit DO = P3^6;sbit we=P2^7;sbit du=P2^6;code unsigned char disptab[]={0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x0};code unsigned char dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};unsigned int dispbuf[6];/********************************定义全局变量*******************************/unsigned char readdata; //从93C46读出的数据/*********************************************** *****************************函数功能:读写延时子程序入口参数:ms出口参数:*********************************************** *****************************/void delayms(unsigned char ms){unsigned char i;while(ms--){for(i = 0; i < 120; i++);}}/*********************************************** *****************************函数功能:数码管显示子程序入口参数:出口参数:*********************************************** *****************************/void display(){static unsigned char count=0;unsigned char tmp;P0=0x80;we=1;tmp=dispbit[count];P0=P0|tmp;we=0;P0=disptab[16];du=1;tmp=dispbuf[count];tmp=disptab[tmp];P0=tmp;du=0;count++;if(count==6){count=0;}}/*********************************************** *****************************函数功能:写入指令和地址子程序入口参数:op_h,op_l出口参数:****************************************************************************/void inop(unsigned char op_h, unsigned char op_l){unsigned char i;SK = 0; // 开始位DI = 1;CS = 1;_nop_();_nop_();SK = 1;_nop_();_nop_();SK = 0; // 开始位结束DI = (bit)(op_h & 0x80); // 移入指令码高位SK = 1;op_h <<= 1;SK = 0;DI = (bit)(op_h & 0x80); // 移入指令码低位SK = 1;_nop_();_nop_();SK = 0;op_l <<= 1; // 移入余下的指令码或地址数据for(i = 0; i < 7; i++){DI = (bit)(op_l & 0x80);// 先移入高位SK = 1;op_l <<= 1;SK = 0;}DI = 1;}/*********************************************** *****************************函数功能:写入数据子程序入口参数:indata出口参数:*********************************************** *****************************/void shin(unsigned char indata){unsigned char i;for(i = 0; i < 8; i++){DI = (bit)(indata & 0x80); // 先移入高位SK = 1;indata <<= 1;SK = 0;}DI = 1;}/*********************************************** *****************************函数功能:写入数据使能子程序入口参数:出口参数:*********************************************** *****************************/void ewen(){inop(OP_EWEN_H, OP_EWEN_L);CS= 0;}/*********************************************** *****************************函数功能:写入数据禁止子程序入口参数:出口参数:*********************************************** *****************************/void ewds(){inop(OP_EWDS_H, OP_EWDS_L);CS= 0;}/*********************************************** *****************************函数功能:数据清除子程序入口参数:出口参数:*********************************************** *****************************/void erase(){inop(OP_ERAL_H, OP_ERAL_L);delayms(30);CS = 0;} /*********************************************** *****************************函数功能:写入数据子程序入口参数:addr,indata出口参数:*********************************************** *****************************/void write(unsigned char addr, unsigned char indata) {inop(OP_WRITE_H, addr); //写入指令和地址shin(indata); //写入数据CS = 0;delayms(10);}/*********************************************** *****************************函数功能:读出数据子程序入口参数:出口参数:outdata*********************************************** *****************************/unsigned char shout(void){unsigned char i, out_data;for(i = 0; i < 8; i++){SK = 1;out_data <<= 1;SK = 0;out_data |= (unsigned char)DO;}return(out_data);}/*********************************************** *****************************函数功能:读出某地址数据子程序入口参数:addr出口参数:out_data*********************************************** *****************************/unsigned char read(unsigned char addr){unsigned char out_data;inop(OP_READ_H, addr);out_data = shout();CS = 0;return out_data;}/*********************************************** *****************************函数功能:主程序入口参数:出口参数:*********************************************** *****************************/void main(void){unsigned char i;CS = 0; //初始化端口SK = 0;DI = 1;DO = 1;ewen(); //使能写入操作erase(); //擦除全部内容write(0x08, 0x55); //向0x02地址写入0x55(85)write(0x09, 0xAA); //向0x03地址写入0xAA(170)while(1){readdata=read(0x09); //读取其中一个地址内数据验证dispbuf[0]=readdata/1000;dispbuf[1]=readdata/100;dispbuf[2]=readdata%100/10;dispbuf[3]=readdata%100%10;display(); //显示数据}}/*============================================== ==============使用1602液晶显示PS/2键盘输入的字符=============================================== ==============*/#include <reg51.h>#include "scancodes.h"#define uchar unsigned char#define uint unsigned int#define lcd_Data P0sbit du=P2^6; sbit we=P2^7;sbit rs=P3^5;//H数据,L命令sbit lcden=P3^4;//高脉冲使能,使能脉宽最小150ns sbit Key_Data=P3^2 ;//定义Keyboard引脚sbit Key_CLK=P3^3;unsigned char code ceshi[] = {" Keyboard Test "}; unsigned char code shuzi[] = {" 0123456789 "}; unsigned char code cls[] = {" "};static unsigned char IntNum = 0; //中断次数计数static unsigned char KeyV; //键值static unsigned char DisNum = 0; //显示用指针static unsigned char Key_UP=0, Shift = 0;//Key_UP是键松开标识,Shift是Shift键按下标识static unsigned char BF = 0; //标识是否有字符被收到void delay(uchar x){ uint y;for(;x>0;x--){for(y=100;y>0;y--){};}}void lcdwrdata(uchar dat){ rs=1;//写数据时RS拉高lcden=1;lcd_Data=dat;delay(6);lcden=0;delay(6);}void lcdwrcom(uchar cdat)//写指令数据到LCD{ rs=0;//写指令时RS拉低lcden=1;lcd_Data=cdat;//delay(6);//不加此延时将导致不能写入指令,但能写入显示数据lcden=0;delay(6);}void lcd_init(){lcdwrcom(0x38);//0x38设置显示模式为:16X2 显示,5X7 点阵,8 位数据接口lcdwrcom(0x0c);//打开显示光标闪烁lcdwrcom(0x06);//lcdwrcom(0x01);//}//按指定位置显示一个字符void DisplayOneChar(uchar X, uchar Y, uchar DData){Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; //算出指令码lcdwrcom(X); //发命令字lcdwrdata(DData); //发数据}//按指定位置显示一串字符void DisplayListChar(uchar X, uchar Y, uchar code *DData) {uchar ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1while (DData[ListLength]>0x19) //若到达字串尾则退出{if (X <= 0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符ListLength++;X++;}}}void Keyboard_out(void) interrupt 2{if ((IntNum > 0) && (IntNum < 9)){KeyV = KeyV >> 1; //因键盘数据是低>>高,结合上一句所以右移一位if (Key_Data) KeyV = KeyV | 0x80; //当键盘数据线为1时为1到最高位}IntNum++;while (!Key_CLK); //等待PS/2CLK拉高if (IntNum > 10){IntNum = 0; //当中断11次后表示一帧数据收完,清变量准备下一次接收BF = 1; //标识有字符输入完了EA = 0; //关中断等显示完后再开中断(注:如这里不用BF和关中断直接调Decode()则所Decode中所调用的所有函数要声明为再入函数)}}void Decode(uchar ScanCode) //注意:如SHIFT+G为12H 34H F0H 34H F0H 12H,也就是说shift的通码+G的通码+shift的断码+G的断码{unsigned char TempCyc;if (!Key_UP) //当键盘松开时{switch (ScanCode){case 0xF0 : // 当收到0xF0,Key_UP置1表示断码开始Key_UP = 1;break;case 0x12 : // 左SHIFTShift = 1;break;case 0x59 : // 右SHIFTShift = 1;break;default:if (DisNum > 15){DisplayListChar(0, 1, cls);//清LCD第二行DisNum = 0;}if(!Shift) //如果SHIFT没按下{for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示if(UnShifted[TempCyc][0] == ScanCode) DisplayOneChar(DisNum, 1, UnShifted[TempCyc][1]);DisNum++;}else //按下SHIFT{for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示if(Shifted[TempCyc][0] == ScanCode) DisplayOneChar(DisNum, 1, Shifted[TempCyc][1]);DisNum++;}break;}}else{Key_UP = 0;switch (ScanCode) //当键松开时不处理判码,如G 34H F0H 34H 那么第二个34H不会被处理{case 0x12 : // 左SHIFTShift = 0;break;case 0x59 : // 右SHIFTShift = 0;break;}}BF = 0; //标识字符处理完了}void main(){du=0;we=0;//关闭数码管lcd_init(); //LCM初始DisplayListChar(0, 0, ceshi);DisplayListChar(0, 1, shuzi);delay(250);delay(250);delay(250);//延时DisplayListChar(0, 1, cls);IT1 = 0; //设外部中断1为低电平触发EA = 1;EX1 = 1; //开中断do{if (BF)Decode(KeyV);elseEA = 1; //开中断}while(1);}/*程序功能调节W3电位器ADC0804模数转换后的数字量会显示在数码管上*/#include "reg51.h"#define uchar unsigned char#define uint unsigned intsbit wr=P3^6;sbit rd=P3^7;sbit we=P2^7;sbit du=P2^6;sbit dio=P2^5;uchar code th0=(65535-5000)/256;uchar code tl0=(65535-5000)%256;uchar dispbuf[6];uchar code disptab[]={0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x0};uchar code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; uchar a;void delay( uint x){uchar y;for(;x>0;x--)for(y=100;y>0;y--);}void Init_timer0(){TMOD=0x01;TH0=th0;TL0=tl0;EA=1;ET0=1;TR0=1;}void timer0() interrupt 1{ uchar tmp;static uchar count;P0|=0x3f;we=1;tmp=dispbit[count];P0&=tmp;we=0;du=1;tmp=dispbuf[count];tmp=disptab[tmp];P0=tmp;du=0;count++;if(count==6){count=0;}TH0=th0;TL0=tl0;dispbuf[0]=a/100;dispbuf[1]=a%100/10;dispbuf[2]=a%100%10;}void main(){Init_timer0();dispbuf[5]=16;dispbuf[4]=16;dispbuf[3]=16;//关闭数码管dio=1;we=1;P0&=0x7f;we=0;while(1){wr=0;delay(1);wr=1;delay(20);rd=0;delay(1);rd=1;a=P1;delay(200);}}/*D15发光二极管做亮暗显示,指示DAC0832将数字量转换为模拟量的结果*/#include "reg52.h"#define uchar unsigned char#define uint unsigned intsbit we=P2^7;sbit du=P2^6;sbit csda=P3^2;sbit wr=P3^6;void delay(uchar x){ uint y;for(;x>0;x--)for(y=500;y>0;y--);}void main(){we=0;du=0;csda=0;while(1){wr=0;P0=0x0;wr=1;delay(200);wr=0;P0=0x38;wr=1;delay(200);wr=0;P0=0x82;wr=1;delay(200);wr=0;P0=0xff;wr=1;delay(200);}}//程序功能:通过DS18B20测试当前环境温度, 并通过数码管显示当前温度值#include "reg52.h"#include<intrins.h>#include <math.H> //要用到取绝对值函数abs()#define uchar unsigned char#define uint unsigned intsbit we=P2^7;//数码管位选sbit du=P2^6; //数码管段选sbit dio=P2^5;sbit ds=P2^2;int tempValue1;unsigned int temp;uchar code th0=(65535-3000)/256;uchar code tl0=(65535-3000)%256;uchar dispbuf[6];uchar code disptab[]={0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x0};uchar code disptabwithdot[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0xa 7,0xff,0xef,0xf7,0xfc,0xb9,0xf9,0xf1};uchar code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//延时函数, 对于11.0592MHz时钟, 例i=10,则大概延时10ms.void delay(unsigned int i){unsigned int j;while(i--){for(j = 0; j < 125; j++);}}void dsInit(){//对于11.0592MHz时钟, unsigned int型的i, 作一个i++操作的时间大于?usunsigned int i;ds = 0;i = 100; //拉低约800us, 符合协议要求的480us 以上while(i>0) i--;ds = 1; //产生一个上升沿, 进入等待应答状态i = 4;while(i>0) i--;}void dsWait(){unsigned int i;while(ds);while(~ds); //检测到应答脉冲i = 4;while(i > 0) i--;}//向DS18B20读取一位数据//读一位, 让DS18B20一小周期低电平, 然后两小周期高电平,//之后DS18B20则会输出持续一段时间的一位数据bit readBit(){unsigned int i;bit b;ds = 0;i++; //延时约8us, 符合协议要求至少保持1usds = 1;i++; i++; //延时约16us, 符合协议要求的至少延时15us以上b = ds;i = 8;while(i>0) i--; //延时约64us, 符合读时隙不低于60us要求return b;}//读取一字节数据, 通过调用readBit()来实现unsigned char readByte(){unsigned int i;unsigned char j, dat;dat = 0;for(i=0; i<8; i++){j = readBit();//最先读出的是最低位数据dat = (j << 7) | (dat >> 1);}return dat;}//向DS18B20写入一字节数据void writeByte(unsigned char dat){unsigned int i;unsigned char j;bit b;for(j = 0; j < 8; j++){b = dat & 0x01;dat >>= 1;//写"1", 将DQ拉低15us后, 在15us~60us内将DQ拉高, 即完成写1if(b){ds = 0;i++; i++; //拉低约16us, 符号要求15~60us 内ds = 1;i = 8; while(i>0) i--; //延时约64us, 符合写时隙不低于60us要求}else //写"0", 将DQ拉低60us~120usds = 0;i = 8; while(i>0) i--; //拉低约64us, 符号要求ds = 1;i++; i++; //整个写0时隙过程已经超过60us, 这里就不用像写1那样, 再延时64us了}}//向DS18B20发送温度转换命令void sendChangeCmd(){dsInit(); //初始化DS18B20, 无论什么命令, 首先都要发起初始化dsWait(); //等待DS18B20应答delay(1); //延时1ms, 因为DS18B20会拉低DQ 60~240us作为应答信号writeByte(0xcc); //写入跳过序列号命令字Skip Rom writeByte(0x44); //写入温度转换命令字Convert T }//向DS18B20发送读取数据命令void sendReadCmd(){ EA=0;//关闭中断是因为进入显示中断会影响到DS18B20的读写时序dsInit();dsWait();delay(1);writeByte(0xcc); //写入跳过序列号命令字Skip Rom writeByte(0xbe); //写入读取数据令字Read ScratchpadEA=1;}//获取当前温度值int getTmpValue(){unsigned int tmpvalue;int value; //存放温度数值float t;unsigned char low, high;EA=0;sendReadCmd();//连续读取两个字节数据low = readByte();high = readByte();//将高低两个字节合成一个整形变量//计算机中对于负数是利用补码来表示的//若是负值, 读取出来的数值是用补码表示的, 可直接赋值给int型的valuetmpvalue = high;tmpvalue <<= 8;tmpvalue |= low;value = tmpvalue;//使用DS18B20的默认分辨率12位, 精确度为0.0625度, 即读回数据的最低位代表0.0625度t = value * 0.0625;//将它放大100倍, 使显示时可显示小数点后两位, 并对小数点后第三进行4舍5入//如t=11.0625, 进行计数后, 得到value = 1106, 即11.06 度//如t=-11.0625, 进行计数后, 得到value = -1106, 即-11.06 度value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0减0.5return value;EA=1;}void Init_timer0(){TMOD=0x01;TH0=th0;TL0=tl0;EA=1;ET0=1;TR0=1;}void timer0() interrupt 1{ uchar tmp;uchar tmp1;static uchar count;P0|=0x3f;we=1;tmp=dispbit[count];tmp1=tmp;P0&=tmp;we=0;du=1;tmp=dispbuf[count];if(tmp1==0xfb){tmp=disptabwithdot[tmp];}else{tmp=disptab[tmp];}P0=tmp;du=0;count++;if(count==6){count=0;}//unsigned int temp = abs(tempValue);dispbuf[0] = temp/ 10000;dispbuf[1] = temp % 10000 / 1000;dispbuf[2] =temp % 1000 / 100;dispbuf[3] = temp % 100 / 10;dispbuf[4] = temp % 10;TH0=th0;TL0=tl0;}void main(){ dio=0;Init_timer0();/*dispbuf[5]=0xf;dispbuf[4]=0xf;dispbuf[3]=0xf;dispbuf[2]=0;dispbuf[1]=0;dispbuf[0]=0;*/while(1){//启动温度转换sendChangeCmd();tempValue1 = getTmpValue();temp = abs(tempValue1);// temp=getTmpValue();}}/*DS1302测试程序程序功能:写入一个时间09年12月12日星期六21:21:00*/#include "reg51.h"#include <intrins.h>#define uchar unsigned charsbit we=P2^7;sbit du=P2^6;sbit DS1302_CLK = P1^0;sbit DS1302_IO = P1^1;sbit DS1302_RST = P1^2;sbit ACC0=ACC^0;sbit ACC7=ACC^7;code unsigned char disptab[]={0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x0};code unsigned char dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};uchar dispbuf[6];unsigned char second,minute,hour,week,day,month,year;//秒、分、时、星期、日、月、年unsigned char time[]={0x09,0x12,0x12,0x06,0x21,0x21,0x00}; //初始时间数组09年12月12日21点21分00秒/****************************************************************************函数功能:数码管显示子程序入口参数:出口参数:*********************************************** *****************************/void display(){static uchar count=0;unsigned char tmp;P0=0x80;we=1;tmp=dispbit[count];P0=P0|tmp;we=0;P0=disptab[16];du=1;tmp=dispbuf[count];tmp=disptab[tmp];P0=tmp;du=0;count++;if(count==6){count=0;}}/*********************************************** ******************************函数功能:向DS1302送一字节数据子程序入口参数:出口参数:*********************************************** ******************************/void InputByte(unsigned char byte1){ unsigned char i;ACC=byte1;for(i=8;i>0;i--){DS1302_IO=ACC0;DS1302_CLK=1;DS1302_CLK=0;ACC=ACC>>1;}return;} /*********************************************** ******************************函数功能:读DS1302一个字节子程序入口参数:出口参数:*********************************************** ******************************/unsigned char OutputByte(){unsigned char i;for(i=8;i>0;i--){ ACC=ACC>>1;ACC7=DS1302_IO;DS1302_CLK=1;DS1302_CLK=0;}return(ACC);}/*********************************************** ******************************函数功能:向DS1302某地址写一字节数据子程序入口参数:addr,TDat出口参数:*********************************************** ******************************/void write_ds1302(unsigned char addr,unsigned char TDat) {DS1302_RST=0;_nop_();DS1302_CLK=0;_nop_();DS1302_RST=1;InputByte(addr);_nop_();InputByte(TDat);DS1302_CLK=1;_nop_();DS1302_RST=0;}/*********************************************** ******************************函数功能:读DS1302地址子程序入口参数:add出口参数:timedata*********************************************** ******************************/unsigned char read_ds1302(unsigned char addr){unsigned char timedata;DS1302_RST=0;_nop_();DS1302_CLK=0;_nop_();DS1302_RST=1;InputByte(addr);timedata=OutputByte();DS1302_CLK=1;_nop_();DS1302_RST=0;return(timedata);}/*********************************************** ******************************函数功能:初始化DS1302子程序入口参数:time[](全局变量)出口参数:*********************************************** ******************************/void initial_ds1302(){write_ds1302(0x8e,0x00); //写保护寄存器,在对时钟或RAM写前WP一定要为0write_ds1302(0x8c,time[0]); //年write_ds1302(0x88,time[1]); //月write_ds1302(0x86,time[2]); //日write_ds1302(0x8A,time[3]); //星期write_ds1302(0x84,time[4]); //时write_ds1302(0x82,time[5]); //分write_ds1302(0x80,time[6]); //秒write_ds1302(0x8e,0x80); //写保护寄存器}/*********************************************** ******************************函数功能:读DS1302时间子程序入口参数:出口参数:全局变量(second,minute,hour,week,day,month,year)*****************************************************************************/void read_time(){second=read_ds1302(0x81); //秒寄存器minute=read_ds1302(0x83); //分hour=read_ds1302(0x85); //时week=read_ds1302(0x8B); //星期day=read_ds1302(0x87); //日month=read_ds1302(0x89); //月year=read_ds1302(0x8d); //年}/*********************************************** ******************************函数功能:主程序入口参数:出口参数:*********************************************** ******************************/void main(){initial_ds1302(); //初始化DS1302while(1){read_time();//读取时间dispbuf[5]=second%16;dispbuf[4]=second/16;dispbuf[3]=minute%16;dispbuf[2]=minute/16;dispbuf[1]=hour%16;dispbuf[0]=hour/16;display(); //显示时间}}//程序功能1602液晶第一行显示"0123456789ABCDEF";第二行显示"!@#$%^&*()<>{}?+";#include "reg52.h"#define uchar unsigned char#define uint unsigned intsbit du=P2^6;sbit we=P2^7;sbit rs=P3^5;//H数据,L命令sbit lcden=P3^4;//高脉冲使能,使能脉宽最小150ns//sbit rw=P2^1;uchar code table[]="0123456789ABCDEF";uchar code table1[]="!@#$%^&*()<>{}?+";void delay(uchar x){ uint y;for(;x>0;x--){for(y=100;y>0;y--){};}}void lcdwrdata(uchar dat){ rs=1;//写数据时RS拉高lcden=1;P0=dat;delay(6);lcden=0;delay(6);}void lcdwrcom(uchar cdat)//写指令数据到LCD{ rs=0;//写指令时RS拉低lcden=1;P0=cdat;//delay(6);//不加此延时将导致不能写入指令,但能写入显示数据lcden=0;delay(6);}void lcd_init(){lcdwrcom(0x38);//0x38设置显示模式为:16X2 显示,5X7 点阵,8 位数据接口lcdwrcom(0x0c);//打开显示光标闪烁lcdwrcom(0x06);//lcdwrcom(0x01);//}void main(){ uchar n;du=0;we=0;delay(200);lcden=0;lcd_init();lcdwrcom(0x00|0x80);for(n=0;n<16;n++){lcdwrdata(table[n]);delay(100);}lcdwrcom(0x40|0x80);for(n=0;n<16;n++){lcdwrdata(table1[n]);delay(100);}while(1){}}#include "reg52.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned intvoid delay ( uchar x){uint y;for (; x > 0 ; x-- )for( y=500 ;y>0;y--); }void main(){ uchar a=0x7f;uchar b=0x7f;uchar c;while(1){ for( c=7;c>0;c--){P1=b;b=_cror_(a,1);a=b;delay(100);}for( c=7 ;c >0;c--){P1=b;b=_crol_(a,1);a=b;delay(100);}a=0x7f;b=0x7f;}}。

codesys编程手册

codesys编程手册
程序................................................................................................................................... 11 2.2 语言...................................................................................................................................14
1.1 CoDeSys 是什么 ................................................................................................................... 4 1.2 CoDeSys 功能一览................................................................................................................ 4 2. CoDeSys 组成 ............................................................................................................................... 7 2.1 工程组件............................................................................................................................. 7

C51单片机定时计数器应用编程归纳总结

C51单片机定时计数器应用编程归纳总结

C51 T and C● 80C51单片机内部有两个定时/计数器T0和T1,其核心是计数器,基本功能是加1。

● 对外部事件脉冲(下降沿)计数,是计数器;对片内机周脉冲计数,是定时器。

● 计数器由二个8位计数器组成。

● 定时时间和计数值可以编程设定,其方法是在计数器内设置一个初值,然后加1计满后溢出。

调整计数器初值,可调整从初值到计满溢出的数值,即调整了定时时间和计数值。

● 定时/计数器作为计数器时,外部事件脉冲必须从规定的引脚Tx(P3.4、P3.5)输入。

且外部脉冲的最高频率不能超过时钟频率的1/24一、定时/计数器的结构定时/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器组成。

TMOD 是定时/计数器的工作方式寄存器,确定工作方式和功能;TCON 是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。

二、定时/计数器的工作原理加1计数器输入的计数脉冲有两个来源,一个是由系统的时钟振荡器输出脉冲经12分频后送来;一个是T0或T1引脚输入的外部脉冲源。

每来一个脉冲计数器加1,当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出使TCON 中TF0或TF1置1,向CPU 发出中断请求(定时/计数器中断允许时)。

如果定时/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。

可见,由溢出时计数器的值减去计数初值才是加1计数器的计数值。

设置为定时器模式时,加1计数器是对内部机器周期计数(1个机器周期等于12个振荡周期,即计数频率为晶振频率的1/12)。

计数值N 乘以机器周期Tcy 就是定时时间t 。

设置为计数器模式时,外部事件计数脉冲由T0或T1引脚输入到计数器。

在每个机器周期的S5P2期间采样T0、T1引脚电平。

当某周期采样到一高电平输入,而下一周期又采样到一低电平时,则计数器加1,更新的计数值在下一个机器周期的S3P1期间装入计数器。

由于检测一个从1到0的下降沿需要2个机器周期,因此要求被采样的电平至少要维持一个机器周期。

51基础 笔记

51基础 笔记

Keil –C51基础应用1、十六进制数与ASCII码的转换凡是大于等于10的十六进制数加37H,凡是小于10的十六进制数加30H便可得到相应的ASCII码。

具体程序如下:#include<reg52.h>#define unchar unsigned charunchar slz_asc(unchar shuru);void main(){P1=slz_asc(0x30);通过P1口输出转换结果while(1){}}unchar slz_asc(unchar shuru)转换子函数{if(shuru<10)shuru=shuru+0x30;shuru=shuru+0x07;return (shuru);}2、二进制数与BCD码的转换将二进制数除以100得到百位的BCD码,余数除以10得到十位BCD码,再得余数为个位BCD码。

具体程序如下:#include<reg52.h>#define unchar unsigned charunchar shu_chu[3]; 转换结果存储数组void main()转换主函数{unchar shuru,i,j,k,p;shuru=0x10;i=shuru/100;j=shuru%100/10;k=shuru%100%10;shu_chu[p++]=i;shu_chu[p++]=j;shu_chu[p++]=k;while(1){}}3、BCD码与ASCII码的转换一位BCD码加30H即为ASCII码,将ASCII码减去30H如果结果为0~9时则为所求的ASCII码,结果<0或>=10则结果单元送0FFH。

具体程序如下:#include<reg52.h>#define unchar unsigned charunchar BCDzhuanASCII(unchar shuru);unchar ASCIIzhuanBCD(unchar shuru1);void main(){P1=BCDzhuanASCII(0x019);通过P1口输出BCD码19转换成ASCII码的结果P2=ASCIIzhuanBCD(0x033);通过P2口输出ASCII码33H转换成BCD码的输出结果while(1){}}unchar ASCIIzhuanBCD(unchar shuru1) ASCII码转换成BCD码的子函数{char zhong;zhong=shuru1-0x30;if(zhong>10)return 0xff;if(zhong<0){zhong=zhong+0x29;shuru1=zhong&0xf0;shuru1>>=4;zhong=zhong&0x0f;zhong=shuru1*10+zhong;return(zhong);}return(zhong);}unchar BCDzhuanASCII(unchar shuru) BCD码转换成ASCII码的子函数{unchar zhong;zhong=shuru&0xf0;zhong>>=4;shuru=shuru&0x0f;shuru=zhong*10+shuru;if(shuru<10)shuru=shuru+0x30;shuru=shuru+0x07;return(shuru);}4、二进制与雷格码的转换若二进制数为b n-1b n-2...b 1b 0,其对应的格雷码为g n-1g n-2...g 2g 1,则有g n-1=b n-1g i=b i+1xor b i若格雷码为g n-1g n-2...g 2g 1, ,其对应的二进制数为b n-1b n-2...b 1b 0,则有b n-1=g n-1 b i= b i+1 xor g i具体程序如下:#include<reg52.h>#define unchar unsigned charunchar Er_zhuan_gelei(unchar shuru);unchar Gelei_zhuan_er(unchar shuru);void main(){unchar a,b;a=Er_zhuan_gelei(0xf1); a中是二进制转格雷码的转换结果b=Gelei_zhuan_er(a);b中是格雷码转二进制的转换结果P1=b;结果通过P1口输出while(1);}unchar Er_zhuan_gelei(unchar shuru)二进制转格雷码的子函数{unchar zhong;zhong=shuru>>1;zhong=(zhong|shuru)&~(zhong&shuru);return(zhong);}unchar Gelei_zhuan_er(unchar shuru)格雷码转二进制的子函数{unchar zhongjian,i,zhong,chu,cong,kong=0x01;zhong=shuru&0x80;chu=shuru&0x80;cong=chu;for(i=0;i<8;i++){zhongjian=cong>>1;zhongjian=zhongjian^shuru;cong=zhongjian&kong<<7-i;zhong=zhong|cong;}return(zhong);}五、中断设置与应用MCS-51 单片机提供了5个中断源它们在程序存储器中各有固定的中断入口地址,并由此进入中断服务程序,5个中断源的符号、中断向量入口地址、中断触发条件如下。

单片机 学习笔记

单片机 学习笔记

压缩BCD码与非压缩BCD码的压缩BCD码的每一位用4位二进制表示,一个字节表示两位十进制数。

例如1001区别——0110B表示十进制数96D;非压缩BCD码用1个字节表示一位十进制数,高四位总是0000,低4位的0000~1001表示0~9.例如00001000B表示十进制数8.中断控制技术的作用:速度匹配故障处理实时处理微处理器的两种结构从内核访问指令和数据的不同空间与总线结构,可以把处理器分为哈佛结构和普林斯顿结构(或冯.诺伊曼结构)。

冯.诺伊曼结构的机器指令、数据和I/O共用一条总线,这样内核在取指时就不能进行数据读写,反之亦然。

这在传统的非流水线处理器(如MCS51)上是没有什么问题的,它们取指、执行分时进行,不会发生冲突。

但在现代流水线处理器上,由于取指、译码和执行是同时进行的(不是同一条指令),一条总线就会发生总线冲突,必须插入延迟等待,从而影响了系统性能。

ARM7TDMI 内核就是这种结构的。

而哈佛结构的处理器采用独立的指令总线和数据总线,可以同时进行取指和数据读写操作,从而提高了处理器的运行性能。

ARM Cortex-M3、ARM966E、ARM926EJ、ARM1136JF等内核都采用了哈佛结构。

简单指令集的CPU在处理一些特定的运算时速度远高于复杂指令集,所以它常被用在工业领域,比如某些软件的专用服务器,流水线操作等方面。

RISC是英文“Reduced Instruction Set Computing ” 的缩写,中文意思是“精简指令集”。

它是在CISC指令系统基础上发展起来的,有人对CISC机进行测试表明,各种指令的使用频度相当悬殊,最常使用的是一些比较简单的指令,它们仅占指令总数的20%,但在程序中出现的频度却占80%。

复杂的指令系统必然增加微处理器的复杂性,使处理器的研制时间长,成本高。

并且复杂指令需要复杂的操作,必然会降低计算机的速度。

基于上述原因,20世纪80年代RISC型CPU诞生了,相对于CISC型CPU ,RISC型CPU不仅精简了指令系统,还采用了一种叫做“超标量和超流水线结构”,大大增加了并行处理能力。

十速单片机各型号介绍

十速单片机各型号介绍

十速8位机资料TM57PE111. 1K ROM, 每条指令占一行, 最大写1024条指令, 仅有8脚封装.2. 支持TTP(TWO TIME PROGRAM, 两次烧录), 当程序小於0.5K时可选择烧在上半部或下半部, 另外一半可下次再使用3. 有48个内存, 5层堆栈4. 最大6个I/O, 单个I/O驱动电流推出25mA, 拉入30mA, 可直推LED; 多个I/O推出共可承受80mA, 拉入共可承受150mA5. 有上电内部复位, 看门狗复位, 外部复位, 低电压复位四种复位方式6. 低电压复位可选择2.2V或3.2V7. 仅支持两种震荡模式: 内部RC震荡或外部RC震荡, 程序中无法在两种模式间切换, 仅能选择一种8. 内振精度: 4MHz±3%@5V, 3.9MHz±3%@3V; 目前5V精度可在3%内, 3V差异较大, 约2.5M~2.8M@3V9. 支持深睡眠模式, 此时震荡频率停止, 亦即所有事都无法做. 三种方式可唤醒: 复位, 2个外部中断, 唤醒计时器10. 有下列中断: 2个外部中断, TIMER0中断, 唤醒计时器中断11. 唤醒计时器可设置20ms/40ms/80ms/160ms四种时间的其中一种来唤醒或产生中断, 但时间不是很准12. 不支持绿色休眠模式, 故较为耗电不适用於电池为电源之产品13. 工作电压: 低电压复位之电压~5.5V14. 工作温度范围: -40℃~ +85℃TM57PA101. 1K ROM, 每条指令占一行, 最大写1024条指令, 有8/16脚两种封装. 脚位较特殊, 与其他厂牌不兼容2. 57PA10为TTP, 当程序小於0.5K时可选择烧在上半部或下半部, 另外一半可下次再使用;3. 有64个内存, 5层堆栈4. 最大14个I/O(8脚的只有6个I/O), 单个I/O驱动电流推出25mA, 拉入30mA, 可直推LED; 多个I/O推出共可承受80mA, 拉入共可承受150mA5. 有6个通道12-BIT的A/D(8-PIN只有2组A/D), 57PA10精度准到10-BIT57PA10内部无稳压电路, 使用A/D功能时外部需加稳压电路确保电源稳定6. 有2个通道的PWM(8-PIN只有1组PWM)7. 有上电内部复位, 看门狗复位, 外部复位, 低电压复位四种复位方式8. 低电压复位可选择2.0V或2.9V9. 支持内部RC震荡或外部RC震荡, 外部慢钟, 外部快钟(最大24MHz)4种震荡模式; 程序中无法在各种模式间切换, 仅能选择一种10. 内振精度: 4MHz±3%@5V, 3.9MHz±3%@3V; (初版内振为8MHz)11. 支持深睡眠模式, 此时震荡频率停止, 亦即所有事都无法做. 三种方式可唤醒: 复位, 3个外部中断, 唤醒计时器12. 有下列中断: 3个外部中断(8-PIN只有2个外部中断), TIMER0/TIMER1中断, 唤醒计时器中断13. 唤醒计时器可设置13ms/25ms/50ms/100ms四种时间的其中一种来唤醒或产生中断, 但时间不是很准, 误差约+/-10%14. 不支持绿色休眠模式, 故较为耗电不适用於电池为电源之产品15. 工作电压: 低电压复位之电压~5.5V16. 工作温度范围: -40℃~ +85℃TM57PA20/FA20 (OTP约於09年12月批量生产)1. 2K ROM, 每条指令占一行, 最大写2048条指令, 有16/20脚封装.2. 与其他TM57PA系列不同, 无法支持TTP烧录, 仅能烧录一次. 单价低於57PA40 RMB0.13. 有184个内存, 6层堆栈4. 最大18个I/O, 单个I/O驱动电流推出25mA, 拉入30mA, 可直推LED; 多个I/O推出共可承受80mA, 拉入共可承受150mA5. 有8个通道12-BIT的A/D, 57PA20精度准到10-BIT, 57FA20准到8-BIT; 三星S3C9454有9通道8-BIT的A/D57PA20内部无稳压电路, 使用A/D功能时外部需加稳压电路确保电源稳定6. 有2个通道的PWM, 三星S3C9454只有一个PWM; 很少有案子要用到很多A/D, 故我们取消一组A/D改成PWM有些需要触摸按键的案子会采用A/D来做, 一个按键需要1个A/D7. 除了将第13脚的A/D取消以外, 第12脚多了1组PWM外, 与三星9454脚位基本兼容8. 有上电内部复位, 看门狗复位, 外部复位, 低电压复位四种复位方式9. 低电压复位可选择2.1V或2.9V10. 支持内部RC震荡或外部RC震荡, 外部慢钟, 外部快钟(最大12MHz)4种震荡模式; 程序中无法在各种模式间切换, 仅能选择一种11. 内振精度: 4MHz±3%@5V, 3.9MHz±3%@3V; S3C9454内振误差可达10%; 中微CMS69P02误差可达20%12. 支持深睡眠模式, 此时震荡频率停止, 亦即所有事都无法做. 三种方式可唤醒: 复位, 3个外部中断, 唤醒计时器13. 有下列中断: 3个外部中断, TIMER0/TIMER1中断, 唤醒计时器中断14. 唤醒计时器可设置13ms/25ms/50ms/100ms四种时间的其中一种来唤醒或产生中断, 但时间不是很准15. 不支持绿色休眠模式, 故较为耗电不适用於电池为电源之产品16. (兼容)有三星S3C9454, 芯睿MK7A22, 中微CMS69P02等17. 工作电压: 低电压复位之电压~5.5VTM57PA40/FA401. 4K ROM, 每条指令占一行, 最大写4096条指令, 有8/16/20脚3种封装.2. 57PA40为TTP, 当程序小於2K时可选择烧在上半部或下半部, 另外一半可下次再使用;57FA40为FLASH版本可多次烧录, 报价比OTP贵RMB0.2以上; 两种IC间烧录程序不需修改, 仅需注意A/D精度问题3. 有184个内存, 6层堆栈4. 最大18个I/O, 单个I/O驱动电流推出25mA, 拉入30mA, 可直推LED; 多个I/O推出共可承受80mA, 拉入共可承受150mA5. 有8个通道12-BIT的A/D, 57PA40精度准到10-BIT, 57FA40准到8-BIT; 三星S3C9454有9通道8-BIT的A/D57PA40内部无稳压电路, 使用A/D功能时外部需加稳压电路确保电源稳定6. 有2个通道的PWM, 三星S3C9454只有一个PWM; 很少有案子要用到很多A/D, 故我们取消一组A/D改成PWM有些需要触摸按键的案子会采用A/D来做, 一个按键需要1个A/D7. 除了将第13脚的A/D取消以外, 第12脚多了1组PWM外, 与三星9454脚位基本兼容8. 有上电内部复位, 看门狗复位, 外部复位, 低电压复位四种复位方式9. 低电压复位可选择2.1V或2.9V10. 支持内部RC震荡或外部RC震荡, 外部慢钟, 外部快钟(最大12MHz)4种震荡模式; 程序中无法在各种模式间切换, 仅能选择一种11. 内振精度: 4MHz±3%@5V, 3.9MHz±3%@3V; S3C9454内振误差可达10%; 中微CMS69P02误差可达20%12. 支持深睡眠模式, 此时震荡频率停止, 亦即所有事都无法做. 三种方式可唤醒: 复位, 3个外部中断, 唤醒计时器13. 有下列中断: 3个外部中断, TIMER0/TIMER1中断, 唤醒计时器中断14. 唤醒计时器可设置13ms/25ms/50ms/100ms四种时间的其中一种来唤醒或产生中断, 但时间不是很准15. 不支持绿色休眠模式, 故较为耗电不适用於电池为电源之产品16. (兼容)有三星S3C9454, 芯睿MK7A22, 中微CMS69P02等17. 工作电压: 低电压复位之电压~5.5VTM57FLA801. 8K ROM, 每条指令占一行, 最大写8192条指令, 有LQFP48/DICE两种封装.2. 57FLA80为FLASH版本可多次烧录, 支持4线式在线烧录3. 有368个内存, 8层堆栈, 最大45个I/O4. LCD可规划为8*20, 4*24, 3*24, 并有8阶亮度控制5. 有6个通道12-BIT的A/D, 精度准到10-BIT, 内部无稳压电路, 使用A/D功能时外部需加稳压电路确保电源稳定6. 有2个通道的PWM7. 有快钟及慢钟. 快钟可选晶振(1~12M)/内部RC 4M/外部RC; 慢钟可选晶振(32.768K)或外部RC, 可任意切换及支持多种省电模式内振精度: 4MHz±3%@5V, 3.9MHz±3%@3V8. 有上电内部复位, 看门狗复位, 外部复位, 低电压复位四种复位方式9. 低电压复位可选择2.1V或2.9V10. 最大可做16个触摸键11. 有串口及SPI介面12. 支持闲置模式, 此时仅跑慢钟, CPU休眠; 停止模式, 所有时钟停止13. 有下列中断: 8个外部中断, TIMER0/TIMER1/TIMER2中断, 唤醒计时器中断, PWM中断, 串口及SPI中断14. 唤醒计时器可设置15ms/30ms/60ms/120ms四种时间的其中一种来唤醒或产生中断, 但时间不是很准15. 支持绿色休眠模式, 故较为省电, 适用於电池为电源之产品16. 工作电压: 低电压复位之电压~5.5V。

AM57x开发板程序入门教程(1-10)

AM57x开发板程序入门教程(1-10)

AM57x开发板快速体验(1)Revision HistoryDraftDate Revision No. Description2017/04/07 V1.6 1.添加加密芯片使用例程。

2.添加LCD屏幕切换方法。

3.AM57x与FPGA Artix-7板卡测试。

4.AM57x与DSP TMS320C66x板卡测试。

2017/03/01 V1.5 1.添加3G模块测试、FAN测试、HDMI音频测试。

2017/02/10 V1.4 1.添加PCIe测试。

2017/01/03 V1.3 1.增加USB声卡测试。

2.系统信息查询。

3.Helloworld应用程序。

4.固定网络IP方法。

5.上电自启程序方法。

6.4G模块测试。

B鼠标测试。

8.远程访问Matrix用户界面。

9.修改HDMI显示测试。

2016/12/21 V1.2 1.添加USB、SATA、SPI、eMMC、SD、网口速度测试2016/12/19 V1.1 1.修正LED、按键和温度测试。

2016/08/31 V1.0 1.初始版本。

目录1开发板系统启动 (4)2拷贝文件到开发板方法 (7)3 Helloworld应用程序演示 (11)4 LED测试 (13)5按键测试 (14)6温度传感器 (14)7 FAN测试 (15)8时钟设置 (15)9系统信息查询 (17)10 RS232 UART1 (20)11 RS485测试............................................................................................ 错误!未定义书签。

12 CAN测试............................................................................................... 错误!未定义书签。

单片机应用-MCS-51单片机指令系统

单片机应用-MCS-51单片机指令系统

单片机应用-MCS-51单片机指令系统单片机应用 MCS-51 单片机指令系统在当今的电子技术领域,单片机的应用可谓无处不在。

从家用电器到工业自动化,从医疗设备到航空航天,单片机都扮演着至关重要的角色。

而在众多单片机中,MCS-51 单片机以其经典的架构和丰富的指令系统,成为了学习和应用单片机的重要基础。

MCS-51 单片机的指令系统是其能够实现各种功能的核心。

指令就像是单片机的“语言”,通过这些指令,我们可以让单片机执行各种各样的任务,如数据的运算、存储和传输,控制外部设备的工作,实现复杂的逻辑判断等等。

MCS-51 单片机的指令可以分为五大类:数据传送指令、算术运算指令、逻辑运算指令、控制转移指令和位操作指令。

数据传送指令是最基本也是最常用的指令类型。

它包括了将数据从一个存储单元传送到另一个存储单元,或者将立即数传送到寄存器或存储单元等操作。

例如,“MOV A, 50H”这条指令就是将立即数 50H 传送到累加器 A 中。

通过数据传送指令,我们可以在单片机内部实现数据的灵活调配和共享。

算术运算指令则用于进行加、减、乘、除等基本的数学运算。

这些指令能够对寄存器中的数据或者立即数进行操作,并将结果存放在指定的寄存器中。

比如,“ADD A, R0”指令会将累加器 A 的值和寄存器R0 的值相加,结果存放在累加器 A 中。

算术运算指令在实现数据处理和计算功能时非常有用。

逻辑运算指令主要包括与、或、异或等操作。

这些指令可以对寄存器中的数据进行位级的逻辑运算,从而实现对数据的筛选、组合和变换。

例如,“ANL A, R0”指令会对累加器 A 和寄存器 R0 的值进行按位与操作。

控制转移指令是实现程序流程控制的关键。

它们可以让程序根据特定的条件跳转到不同的地址执行,或者在一定的范围内循环执行一段代码。

常见的控制转移指令有无条件转移指令(如“LJMP addr16”)、条件转移指令(如“JC rel”)和循环指令(如“DJNZ Rn, rel”)。

单片机MCS

单片机MCS

单片机MCS-51系列指令快速记忆法随着微电子技术和超大规模集成电路技术的发展,单片微型计算机以其体积小、性价比高、功能强、可靠性高等独有的特点,在各个领域(如工业控制、家电产品、汽车电子、通信、智能仪器仪表)得到了广泛的应用。

学习、使用单片机的人越来越多,而生产单片机的厂家很多,单片机种类繁杂,不知如何选择。

据统计,八位单片机占全球单片机销量的65%。

在八位单片机中,Intel公司的8051单片机内核已成为8位单片机事实上的标准。

因此,对初学者而言,选择8051单片机来学习不失为明智的选择。

学习单片机,除了搞清单片机内部功能、存储空间分配及I/O接口外,还应掌握其指令系统。

MCS-51共有111条指令,现介绍我们总结出的快速记忆MCS-51指令的方法,供大家参考。

大家都知道,汇编语言指令由操作码、操作数两部分组成。

MCS-51使用汇编语言指令,它共有44个操作码助记符,33种功能,其操作数有#data、direct、Rn、@Ri等。

这里先介绍指令助记符及其相关符号的记忆方法。

一、助记符号的记忆方法1?表格列举法把44个指令助记符按功能分为五类,每类列表记忆。

此处从略,请读者自己总结。

2?英文还原法单片机的操作码助记符是该指令功能的英文缩写,将缩写还原成英语原文,再对照汉语有助于理解其助记符含义,从而加强记忆。

例如:增量INC-Incremect减量DNC-Decrement短转移SJMP-Short jump 长转移LJMP-Long jump比较转移CJNE-Compare jump not equality绝对转移AJMP-Absolute jump空操作NOP-No operation交换XCH-Exchange加法ADD-Addition乘法MUL-Multiplication除法DIV-Division左环移RL-Rotate left进位左环移RLC-Rotateleft carry右环移RR-Rotate right进位右环移RRC-Rotateright carry3?功能模块记忆法单片机的44个指令助记符,按所属指令功能可分为五大类,每类又可以按功能相似原则为2~3组。

新手学习单片机C语言

新手学习单片机C语言

51单片机C语言学习杂记学习单片机实在不是件易事,一来要购买高价格的编程器,仿真器,二来要学习编程语言,还有众多种类的单片机选择真是件让人头痛的事。

在众多单片机中51架构的芯片风行很久,学习资料也相对很多,是初学的较好的选择之一。

51的编程语言常用的有二种,一种是汇编语言,一种是C语言。

汇编语言的机器代码生成效率很高但可读性却并不强,复杂一点的程序就更是难读懂,而C语言在大多数情况下其机器代码生成效率和汇编语言相当,但可读性和可移植性却远远超过汇编语言,而且C语言还可以嵌入汇编来解决高时效性的代码编写问题。

对于开发周期来说,中大型的软件编写用C语言的开发周期通常要小于汇编语言很多。

综合以上C语言的优点,我在学习时选择了C语言。

以后的教程也只是我在学习过程中的一些学习笔记和随笔,在这里加以整理和修改,希望和大家一起分享,一起交流,一起学习,一起进步。

*注:可以肯定的说这个教程只是为初学或入门者准备的,笔者本人也只是菜鸟一只,有望各位大侠高手指点错误提出建议。

明浩2003-3-30pnzwzw@第一课建立您的第一个C项目使用C语言肯定要使用到C编译器,以便把写好的C程序编译为机器码,这样单片机才能执行编写好的程序。

KEIL uVISION2是众多单片机应用开发软件中优秀的软件之一,它支持众多不同公司的MCS51架构的芯片,它集编辑,编译,仿真等于一体,同时还支持,PLM,汇编和C语言的程序设计,它的界面和常用的微软VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。

因此很多开发51应用的工程师或普通的单片机爱好者,都对它十分喜欢。

以上简单介绍了KEIL51软件,要使用KEIL51软件,必需先要安装它。

KEIL51是一个商业的软件,对于我们这些普通爱好者可以到KEIL中国代理周立功公司的网站上下载一份能编译2K的DEMO版软件,基本可以满足一般的个人学习和小型应用的开发。

51单片机教材(免费完整版)

51单片机教材(免费完整版)

单片机教程原作:进墨者目录单片机教程第一课:单片机概述 (2)单片机教程第二课:单片机的内部、外部结构(一) (2)单片机教程第三课:几个基本概念 (5)单片机教程第四课:第一个小程序 (8)单片机教程第五课:延时程序分析 (10)单片机教程第六课:单片机的内外部结构分析(四) (12)单片机教程第七课:单片机内部结构分析(五) (15)单片机教程第八课(寻址方式与指令系统) (19)单片机教程第九课:数据传递指令 (22)单片机教程第十课数据传递类指令指令 (25)单片机教程第十一课:算术运算类指令 (28)单片机教程第十二课:逻辑运算类指令: (32)单片机教程第十三课:逻辑与指令 (34)单片机教程第十四课:条件转移指令 (38)单片机教程第十五课:位及位操作指令 (41)单片机教程第十六课:计数器与定时器 (44)单片机教程第十七课:定时/计数器的方式控制字 (46)单片机教程第十八课:中断系统 (49)单片机教程第十九课:定时、中断练习一 (52)单片机教程第二十课:定时/计数器实验2 (57)单片机教程第二十一课:串行接口 (60)单片机教程第二十二课:串行口应用编程实例 (65)单片机教程第二十三课:LED数码显示器的连接与编程 (68)单片机教程第二十四课:动态扫描显示接口 (72)单片机教程第二十五课:键盘接口与编程 (78)单片机教程第二十六课:矩阵式键盘接口技术及编程 (83)单片机教程第二十七课:初学单片机几个不易掌握的概念 (87)单片机教程第二十八课:单片机音乐程序的设计与实验 (90)单片机教程第一课:单片机概述1、何谓单片机一台能够工作的计算机要有这样几个部份构成:CPU(进行运算、控制)、RAM(数据存储)、ROM(程序存储)、输入/输出设备(例如:串行口、并行输出口等)。

在个人计算机上这些部份被分成若干块芯片,安装一个称之为主板的印刷线路板上。

而在单片机中,这些部份,全部被做到一块集成电路芯片中了,所以就称为单片(单芯片)机,而且有一些单片机中除了上述部份外,还集成了其它部份如A/D,D/A等。

单片机指令10到15

单片机指令10到15

单片机指令(四)算术运算类指令1.不带进位位的加法指令ADD A,#DATA ;例:ADD A,#10HADD A,direct ;例:ADD A,10HADD A,Rn ;例:ADD A,R7ADD A,@Ri ;例:ADD A,@R0用途:将A中的值与其后面的值相加,最终结果否是回到A中。

例:MOV A,#30HADD A,#10H则执行完本条指令后,A中的值为40H。

下面的题目自行练习MOV 34H,#10HMOV R0,#13HMOV A,34HADD A,R0MOV R1,#34HADD A,@R12.带进位位的加法指令ADDC A,RnADDC A,directADDC A,@RiADDC A,#data用途:将A中的值和其后面的值相加,并且加上进位位C中的值。

说明:由于51单片机是一种8位机,所以只能做8位的数学运算,但8位运算的范围只有0-255,这在实际工作中是不够的,因此就要进行扩展,一般是将2个8位的数学运算合起来,成为一个16位的运算,这样,可以表达的数的范围就可以达到0-65535。

如何合并呢?其实很简单,让我们看一个10进制数的例子:66+78。

这两个数相加,我们根本不在意这的过程,但事实上我们是这样做的:先做6+8(低位),然后再做6+7,这是高位。

做了两次加法,只是我们做的时候并没有刻意分成两次加法来做罢了,或者说我们并没有意识到我们做了两次加法。

之所以要分成两次来做,是因为这两个数超过了一位数所能表达的范置(0-9)。

在做低位时产生了进位,我们做的时候是在适当的位置点一下,然后在做高位加法是将这一点加进去。

那么计算机中做16位加法时同样如此,先做低8位的,如果两数相加产生了进位,也要“点一下”做个标记,这个标记就是进位位C,在PSW中。

在进行高位加法是将这个C加进去。

例:1067H+10A0H,先做67H+A0H=107H,而107H显然超过了0FFH,因此最终保存在A中的是7,而1则到了PSW中的CY位了,换言之,CY就相当于是100H。

单片机应用技术C语言版MCS51指令系统及汇编

单片机应用技术C语言版MCS51指令系统及汇编
3.1.1 汇编语言格式 3.1.2 指令中常用符号 3.1.3 寻址方式
2019/12/10
3
3.1.1 汇编语言格式
一、指令和指令系统
指令:是计算机中CPU根据人的意图来 执行某种操作的命令。
指令系统:是一台计算机(CPU)所能 执行的全部指令的集合。
2019/12/10
4
二、程序和程序设计语言
2019/12/10
36
指令概述(P266 附录C)
MCS-51单片机指令系统有111条指令, 分类如下。
1、按字节分类
单字节指令:49条; 双字节指令:45条 三字节指令:17条
2、按执行时间分类
单周期指令:64条; 双周期指令:45条 四周期指令:2条(乘、除指令)
2019/12/10
37
3、按功能分类(分为5大类)
程序:人们编写的、使计算机完成某项 工作的指令序列,称为程序。
程序设计语言:编写程序的一整套规则、 方法。
程序设计语言分类:分为机器语言、汇 编语言和高级语言等。
2019/12/10
5
三、机器语言
机器语言:用二进制编码表示每条指令,是 计算机能够直接识别和执行的语言。
目标程序:用机器语言编写的程序。 例如“13+25” ,在MCS-51中的机器码为 01110100 00001101 00100100 00011001
2019/12/10
39
一、普通传送指令
普通传送指令以助记符MOV为基础,分 为: 片内数据存储器传送指令,用MOV 片外数据传送指令,用MOVX 程序存储器传送指令,用MOVC
2019/12/10
40
1、片内数据存储器传送指令MOV

C51编程语句总结

C51编程语句总结

⒊ do-while语句 语句 先执行内嵌的语句, 先执行内嵌的语句, 若 do-while语句一般格式: 表达式的值为非 时,则 语句一般格式: 表达式的值为非0时 do 语句 while (表达式);循环;当表达式的值为 循环;当表达式的值为0 ⒋ for语句 语句 for语句的一般形式: 语句的一般形式: for (表达式 ;表达式 ;表达式 )语句 (表达式1;表达式 ;表达式3)语句 ;表达式2;表达式
C51编程常用语句总结 编程常用语句总结
定义SFR 一、C51定义 定义 定义方法:两个关键字: 和 定义方法:两个关键字:sfr和sbit 1.定义特殊功能寄存器用 定义特殊功能寄存器用sfr 定义特殊功能寄存器用 例如: 例如: sfr PSW=0xD0;/*定义程序状态字 ; 定义程序状态字PSW的地址为 的地址为D0H*/ 定义程序状态字 的地址为 sfr TMOD=0x89;/*定义定时器/计数器方式控制寄存器 TMOD=0x89;/*定义定时器 定义定时器/计数器方式控制寄存器 TMOD的地址为 的地址为89H*/ 的地址为 sfr P1=0x90;/*定义 口的地址为 定义P1口的地址为 ; 定义 口的地址为90H*/ 2.定义可位寻址的特殊功能寄存器的位用 定义可位寻址的特殊功能寄存器的位用sbit 定义可位寻址的特殊功能寄存器的位用 例如: 例如: sbit CY=0xD7;/*定义进位标志 的地址为D7H*/ ; 定义进位标志CY的地址为 定义进位标志 的地址为 sbit AC=0xD0^6;/*定义辅助进位标志 的地址为 定义辅助进位标志AC的地址为 ; 定义辅助进位标志 的地址为D6H*/ sbit RS0=0xD0^3;/*定义 定义RS0的地址为 的地址为D3H*/ ; 定义 的地址为

C语言入门第六章知识点总结

C语言入门第六章知识点总结

传智播客C/C++课堂笔记C语言入门66.1如何节约内存-位运算内存单元,即1B,我们说char型占1个内存单元(1B),而short型占2个内存单元(2B)。

1B被当成整体来看。

但同时1 B = 8 bits1个字节有8个位,每个位有0、1两个取值。

总体来说,C语言中的位运算符有以下两类:位逻辑运算符:(位逻辑运算以位(bit)为单位)&(位“与”)、^(位“异或”)、|(位“或”)、~(位“取反”)。

移位运算符:<<(左移)、>>(右移)位“取反”:操作符为“~”,如果A为10101010,那么~A返回的结果为01010101,即每位都取反,0变成1,1变成0,需要注意的是,位取反运算并不改变操作数的值位“与”:操作符为&,将对两个操作数的每一位进行与运算,位“与”运算的准则如下:1 & 1=1 1 & 0=0 0 & 1=0 0 & 0=0位“或”:操作符为|,将对两个操作数的每一位进行或运算,位“或”运算的准则如下:1 | 1=1 1 | 0=1 0 | 1=1 0 | 0=0位“异或”:操作符为^,将对两个操作数的每一位进行异或运算。

通俗地讲,如果两个位相同(同为0或同为1),结果为0,若两个位不同(一个为0,另一个为1),结果为1,对应的准则为:1 ^ 1=0 1 ^ 0=1 0 ^ 1=1 0 ^ 0=0移位运算表达式的基本形式为:A << n; /*左移*/或A >> n; /*右移*/A称为操作数,其必须为数字型变量或数字型常量,此处的数字型包括整型、浮点型和char型,A中存储的0、1序列向左或右移动n位,移动后的值作为整个表达式的输出,执行移位运算并不改变操作数A的值。

小结:位运算主要分为位逻辑运算和移位运算两大类,位逻辑运算主要有位取反运算、位或运算、位与运算和位异或运算,使用时应注意和普通变量的逻辑运算区分。

单片机c语言开发sbit使用方法

单片机c语言开发sbit使用方法

单片机C语音开发sbit使用方法··1.bit和sbit都是C51扩展的变量类型。

bit和int char之类的差不多,只不过char=8位, bit=1位而已。

都是变量,编译器在编译过程中分配地址。

除非你指定,否则这个地址是随机的。

这个地址是整个可寻址空间,RAM+FLASH+扩展空间。

bit只有0和1两种值,意义有点像Windows下VC中的BOOL。

sbit是对应可位寻址空间的一个位,可位寻址区:20H~2FH。

一旦用了sbi xxx = REGE^6这样的定义,这个sbit量就确定地址了。

sbit大部分是用在寄存器中的,方便对寄存器的某位进行操作的。

2.bit位标量bit位标量是C51编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。

它的值是一个二进制位,不是0就是1,类似一些高级语言中的Boolean类型中的True和False。

3.sfr特殊功能寄存器sfr也是一种扩充数据类型,点用一个内存单元,值域为0~255。

利用它可以访问51单片机内部的所有特殊功能寄存器。

如用sfr P1 = 0x90这一句定P1为P1端口在片内的寄存器,在后面的语句中我们用以用P1 = 255(对P1端口的所有引脚置高电平)之类的语句来操作特殊功能寄存器。

sfr P1 = 0x90; //定义P1 I/O 口,其地址90Hsfr 关键定后面是一个要定义的名字,可任意选取,但要符合标识符的命名规则,名字最好有一定的含义如P1 口可以用P1 为名,这样程序会变的好读好多.等号后面必须是常数,不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内(80H-FFH),具体可查看附录中的相关表.sfr 是定义8 位的特殊功能寄存器而sfr16 则是用来定义16 位特殊功能寄存器,如8052 的T2 定时器,可以定义为:sfr16 T2 = 0xCC; //这里定义8052 定时器2,地址为T2L=CCH,T2H=CDH用sfr16 定义16 位特殊功能寄存器时,等号后面是它的低位地址,高位地址一定要位于物理低位地址之上.注意的是不能用于定时器0 和1 的定义.sbit 可定义可位寻址对象.如访问特殊功能寄存器中的某位.其实这样应用是经常要用的如要访问P1 口中的第2 个引脚P1.1.我们可以照以下的方法去定义:(1) sbit 位变量名=位地址sbit P1_1 = Ox91;这样是把位的绝对地址赋给位变量.同sfr 一样sbit 的位地址必须位于80H-FFH 之间.(2) sbit 位变量名=特殊功能寄存器名^位位置sft P1 = 0x90;sbit P1_1 = P1 ^ 1; //先定义一个特殊功能寄存器名再指定位变量名所在的位置,当可寻址位位于特殊功能寄存器中时可采用这种方法(3) sbit 位变量名=字节地址^位位置sbit P1_1 = 0x90 ^ 1;这种方法其实和2 是一样的,只是把特殊功能寄存器的位址直接用常数表示. 在C51存储器类型中提供有一个bdata 的存储器类型,这个是指可位寻址的数据存储器,位于单片机的可位寻址区中,可以将要求可位录址的数据定义为bdata,如:unsigned char bdata ib; //在可位录址区定义ucsigned char 类型的变量ibint bdata ab[2]; //在可位寻址区定义数组ab[2],这些也称为可寻址位对象sbit ib7=ib^7 //用关键字sbit 定义位变量来独立访问可寻址位对象的其中一位sbit ab12=ab[1]^12;操作符"^"后面的位位置的最大值取决于指定的基址类型,char0-7,int0-15,long0-31. sfr 并标准C 语言的关键字,而是Keil 为能直接访问80C51 中的SFR 而提供了一个新的关键词,其用法是:sfrt 变量名=地址值。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

十速单片机TM57MA15
---C语言编程应用笔记
Tomson.Liu Aug.17,2016
All for dream
一切为了梦想
一、端口设置的注意事项
1. PA7端口
PA7端口既可以作为复位端口,也可以作为普通IO口使用,作为普通IO口时,可作为的输入口。

具体设置如下:
INT2
PA7 端口作为INT2中断源时,只能是下降沿中断;
一、端口设置的注意事项
2. PA7以外的端口
在设置单片机的端口方向时,如果将端口设置为施密特输入端口时,必须在初始化端口初始值时,将该端口置为高,否则端口输出为低电平,无法读取状态。

------该单片机不像普通的51单片机,只需要设置端口方向后,就可以直接读取端口状态,而需要将端口初始化赋值为高,方可。

关于端口设置的描述,详见TM57MA15的datasheet中描述,如下:
二、寄存器使用时注意的事项
该单片机的内部寄存器分为F寄存器和R寄存器,由R寄存器只能写入,因此在程序中定义R寄存器变量时,该变量只能进行赋值,不能进行逻辑和算术运算。

否则会出现一些意想不到的问题。

另外对RAM中使用的关键变量,初始化时需要清零。

RAM上电后,为不定态。

在程序空间允许的情况下,上电后对使用的连续RAM空间进行清零操作。

三、端口初始化注意的事项
TM57MA15单片机,我公司有使用10Pin的小封装,该封装只有PA端口和PD0口。

该单片机的标准封装为SOP-16,具有PA,PB和PD端口。

10Pin的小封装,只是将未用引脚对外引出而已,芯片内部仍存在。

因此初始化时,仍需对PB等未用的端口进行初始化,否则很难较低静态功耗。

四、程序中变量和标志位的用法
1. 标志位
该编译平台,在C语言中不支持二进制写法,因此不能对变量进行二进制赋值,对标志位和端口不支持二进制操作,如取反。

举例如下:
bit PowerOnFlag; PA1定义为输入口
if(!PowerOnFlag) if( !pad1)
四、程序中变量和标志位的用法
2. 中断程序中使用了自带的入栈和出栈数据保护子程序时需注意
在TL-TICE99_C_Complier特殊用法一文中,有说到中断函数的使用,在新建项目时,。

如下:
选用C语言,勾选了中断功能,则自动在主函数中生成中断函数
这两个子
77H~7EH
断中
五、关于低功耗使用的相关注意事项
我公司的产品均要求在静态时低的功耗,静态电流至少在10uA以内。

因此单片机在使用中,必须要降低静态电流,对于该单片机而言,通常从以下几个方面注意:
1. 对于未使用的端口,通常设置为输入口,使用内部上拉;
2. 将未使用的相关功能模块进行关闭,如T2定时器,看门狗功能,定时唤醒功能,
PWM功能(未使用),OPA(运放)功能等。

在睡眠前,建议即将AD功能关闭,也会省
六、压缩程序空间的相关建议
TM57MA15芯片只有1K的程序空间,在用C语言编写程序时,非常容易出现程序
空间不够的情况。

TICE99编译器,在编译时并未提供优化功能,因此在编写程序时一定注意程序的相关写法,以达到节省空间的目的。

具体可从以下几个方面入手:
1. 程序中尽量不用复杂的算法运算,如果必须用的话,写程序时也要用简短的方式来实现;
2. 程序中尽量少用16位变量,尤其运算时占用程序更大;
左右
动避开
空间。

相关文档
最新文档