十速单片机TM57MA15---C语言编程应用笔记 [兼容模式]
十速 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语言程序

/*点阵扫描原理是先输出行字模码,再列扫描点阵*/ /*程序功能点阵循环显示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编程手册

1.1 CoDeSys 是什么 ................................................................................................................... 4 1.2 CoDeSys 功能一览................................................................................................................ 4 2. CoDeSys 组成 ............................................................................................................................... 7 2.1 工程组件............................................................................................................................. 7
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基础 笔记

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)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测试............................................................................................... 错误!未定义书签。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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位变量,尤其运算时占用程序更大;
左右
动避开
空间。