嵌入式课程设计源代码
嵌入式课程设计--红外遥控小车程序

#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit IRIN = P3^3;sbit P1_0=P1^0; //数码管动态扫描接口sbit P1_1=P1^1;sbit P1_5=P1^5; //蜂鸣器报警接口sbit P2_0=P2^0; //控制两个直流电机的控制端口sbit P2_1=P2^1;sbit P2_2=P2^2;sbit P2_3=P2^3;sbit P2_4=P2^4;sbit P2_5=P2^5;bit flag; //红外解码判断标志位,0有效uchar IR_buf[4]={0x00,0x00,0x00,0x00};//IR_buf[0]、IR_buf[1]为用户码低位、用户码高位接收缓冲区// IR_buf[2]、IR_buf[3]为键数据码和键数据码反码接收缓冲区uchar disp_buf[4]={0x00,0x00,0x40,0x00}; //显示缓冲单元ucharseg_data[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x 8e};//0~F符的显示码(字形码)void delay(uchar x); //延时函数void Delay_ms(uint xms); //延时void init();void car_forward(); //小车前进函数void car_back(); //小车后退函数void car_Leftturn(); //小车左转弯函数void car_Rightturn(); //小车右转弯函数void car_stop(); //小车停止函数void Display(uint m); //数码管显示函数void aralm();void car_jiaspeed();void car_jianspeed();/********以下是主函数********/void main(){init();while(1){Display(disp_buf[2]);switch(disp_buf[2]){case 0x46: car_forward();break;case 0x15: car_back();break;case 0x44: car_Leftturn();break;case 0x43: car_Rightturn();break;case 0x40: car_stop();break;case 0x47:car_jiaspeed();break;case 0x45:car_jianspeed();break;default: aralm();break;}}}void init(){EA=1;EX1=1; //允许总中断中断,使能INT1 外部中断IT1 = 1; //触发方式为脉冲负边沿触发IRIN=1; //遥控输入脚置1P2_0=0;P2_1=0;P2_2=0;P2_3=0;P2_4=1;P2_5=1;}void car_jiaspeed(){P2_4=1;P2_5=1;}void car_jianspeed(){while(1){P2_4=1;P2_5=0;Delay_ms(200);P2_4=0;P2_5=1;Delay_ms(200);if(disp_buf[2]!=0x45){break;}}}/********以下是0.14ms的x倍延时函数********/void delay(uchar x) //延时x*0.14ms{uchar i;while(x--)for (i = 0; i<13; i++);}/********以下是延时函数********/void Delay_ms(uint xms){uint i,j;for(i=xms;i>0;i--) //i=xms即延时约xms毫秒for(j=110;j>0;j--);}/********以下是显示函数********/void Display(uint m){uint a,b;a=m;b=m;a=a>>4;b=b&0x0f;P1_0=0;P1_1=1;P0=seg_data[a];Delay_ms(5);P1_0=1;P1_1=0;P0=seg_data[b];Delay_ms(5);}void car_forward() {P2_4=1;P2_5=1;P2_0=1;P2_1=0;P2_2=1;P2_3=0;}void car_back() {P2_4=1;P2_5=1;P2_0=0;P2_1=1;P2_2=0;P2_3=1;}void car_Leftturn() {P2_0=1;P2_1=0;P2_2=0;P2_3=0;}void car_Rightturn(){P2_0=0;P2_1=0;P2_2=1;P2_3=0;}void car_stop(){P2_0=0;P2_1=0;P2_2=0;P2_3=0;}void aralm(){P1_5=0;Delay_ms(500);P1_5=1;Delay_ms(500);}/********以下是外中断1函数********/void IR_decode() interrupt 2{uchar i,j,k,count=0;EX1 = 0; //暂时关闭外中断1中断请求delay(20); //延时20*0.14=2.8msif (IRIN==1) //等待IRIN低电平出现{EX1 =1; //开外中断0return; //中断返回}while (!IRIN) delay(1); //等待IRIN变为高电平,跳过9ms的低电平引导码for (j=0;j<4;j++) //收集四组数据,即用户码低位、用户码高位、键值数据码和键值数码反码{for (k=0;k<8;k++) //每组数据有8位{while (IRIN) //等待IRIN变为低电平,跳过4.5ms的高电平引导码信号。
linux嵌入式课程设计--源代码分析

目录1.进程的概念 (1)2.进程切换的三个层次 (1)3.Linux 中进程的特点 (1)4.task struct (2)5.进程之间的状态转换的系统调用 (5)6.进程的创建:TASK_RUNNING (5)7.进程的调度 ( schedule() ) (8)8.进程转换 (9)9.Semaphores (信号灯) (13)10.锁机制 (18)11.管道(流) (21)12.进程的终止 (23)13.总结 (26)14.参考文献 (26)1.进程的概念进程执行操作系统的任务。
程序是存放在磁盘上的包括一系列机器代码指令和数据的可执行的映像,因此是一个被动的实体。
进程可以看作是一个执行中的计算机程序。
它是动态的实体,在处理机执行机器代码时不断改变。
进程包括处理程序的指令和数据,以及程序计数器、其他CPU的寄存器和包括临时数据(例如:例程参数、返回地址和保存的变量)的堆栈。
当前执行的程序,或者说进程,包括微处理器中所有的当前活动。
进程是操作系统的最小调度单位。
2.进程切换的三个层次(1)用户数据的保存: 包括正文段(TEXT), 数据段(DATA,BSS), 栈段(STACK),共享内存段(SHARED MEMORY保存。
(2)寄存器数据的保存:包括PC(program counter,指向下一条要执行的指令的地址),PSW(processor status word, 处理机状态字), SP(stackpointer, 栈指针), PCBP(pointer ofprocess control block, 进程控制块指针), FP(frame pointer, 指向栈中一个函数的local 变量的首地址), AP(augument pointer, 指向栈中函数调用的实参位置), ISP(interrupt stackpointer, 中断栈指针), 以及其他的通用寄存器等。
(3)系统层次的保存:包括proc,u, 虚拟存储空间管理表格, 中断处理栈。
嵌入式课件代码嵌入式课件代码完美版 (2)

CPU对各种功能部件的管理、控制、监视是采用特殊功能寄存器(SFR special function register )的集中控制方法。
GPC1_3管脚GPC1组,共有5个管脚GPC1CON 控制寄存器GPC1_0 [3:0]GPC1_1 [7:4]GPC1_2 [11:8]GPC1_3 [15:12] 0001输出功能GPC1_4 [19:16]GPC1DAT 数据寄存器GPC1_0 [0]GPC1_1 [1]GPC1_2 [2]GPC1_3 [3] 1 输出高电平GPC1_4 [4]GPC1PUD 上下拉电阻GPC1_0 [1:0]GPC1_1 [3:2]GPC1_2 [5:4]GPC1_3 [7:6] 0 禁止内部上下拉电阻GPC1_4 [9:8]我们得到led.bin,接下来,将led.bin文件下载到TPAD上执行TPAD,从Nand Flash启动,一上电,运行u-boot.bin网口:Ubuntu:sudo ifconfig eth0 192.168.1.8 sudo /etc/init.d/tftpd-hpa restart tts day1 经典案例图61用图形界面设定IP地址XP:连TPAD的网卡在XP下要设置IP地址为:192.168.1.60VMware下编辑->虚拟网络编辑器->桥接:设定为连接TPAD的网卡名换一个终端工具:tools/SecureCRT.zip直接在XP下解压:SecureCRT.exe为它建立一个快捷方式放在桌面将TPAD 设置为Nand Flash启动,启动之后,敲击空格进入shell下:tarena # tftp 20008000 led.bin该tftp命令的作用是从tftp服务器ubuntu下的共享目录/tftpboot目录下,获取文件led.bin,放到TPAD的外接DDRII内存的0x20008000地址,因为,led.bin的链接地址为0x20008000tarena# go 20008000作业:1.编写程序,让led1闪烁,亮-灭2.蜂鸣器是如何响起来buzzerGPD0_1arm-linux-objdump -d led>led.sdnw 20008000nand erase 0x0 0x100000nand write 20008000 0x0 0x100000 UARTUART:通用串行异步收发器数据通信方式:1.串行通信:利用一条数据线将数据一位一位的顺序传送,特点通信线路简单,成本低,适用远距离通信。
嵌入式代码

1.建立一个main.c文件,程序代码如下#define rGPMCON (*(volatile unsigned *)(0x7F008820)) #define rGPMDAT (*(volatile unsigned *)(0x7F008824)) #define rGPMPUD (*(volatile unsigned *)(0x7F008828)) #define PCLK 66000000 //for S3C6410 66MHZ#define HCLK 133000000 //for S3C6410 133MHZ#define rTCFG0 (*(volatile unsigned *)(0x7F006000))#define rTCFG1 (*(volatile unsigned *)(0x7F006004))#define rTCON (*(volatile unsigned *)(0x7F006008))#define rTCNTB0 (*(volatile unsigned *)(0x7F00600C))#define rTCMPB0 (*(volatile unsigned *)(0x7F006010))#define rTCNTO0 (*(volatile unsigned *)(0x7F006014))#define rTCNTB1 (*(volatile unsigned *)(0x7F006018))#define rTCMPB1 (*(volatile unsigned *)(0x7F00601c))#define rTCNTO1 (*(volatile unsigned *)(0x7F006020))#define rTCNTB2 (*(volatile unsigned *)(0x7F006024))#define rTCNTO2 (*(volatile unsigned *)(0x7F00602c))#define rTCNTB3 (*(volatile unsigned *)(0x7F006030))#define rTCNTO3 (*(volatile unsigned *)(0x7F006038))#define rTCNTB4 (*(volatile unsigned *)(0x7F00603c))#define rTCNTO4 (*(volatile unsigned *)(0x7F006040))#define rTINT_CSTAT (*(volatile unsigned *)(0x7F006044)) void uDelay(int usec){unsigned int val = (PCLK)/1000000-1;rTCFG0 &= ~(0xff<<8);rTCFG0 |= 0<<8;rTCFG1 &= ~(0x0f<<8);rTCFG1 |= 0<<8;rTCNTB2 = val;rTCON &= ~(0x0f<<12);rTCON |= 0x0b<<12;rTCON &= ~(2<<12);while(usec--) {while(rTCNTO2>=val>>1);while(rTCNTO2<val>>1);}}void msDelay(int time){volatile unsigned int i,j;for(i = 0; i < 2000000; i++)for(j=0; j<time; j++);}void GPIO_Init(void){rGPMCON = 0x11111;rGPMPUD = 0x00;rGPMDAT = 0X1F;}void LedTest(void){volatile unsigned int i,j;while (1){for(i=0; i<4; i++){rGPMDAT = ~(1<<i);for (j=0; j<1000; j++)uDelay(1000);}}}void Main(void){GPIO_Init();LedTest();}2.init.s程序代码如下,注意除了start前边都应空出一个Tab键IMPORT MainAREA |C$$code|, CODE, READONLYglobal startstartbl MainEND。
嵌入式课件代码嵌入式课件代码完美版 (8)

跳转指令 B BL BX数据处理指令(寄存器之间和立即数,不涉及访存)opcode{cond}S Rd, Rn,OP2(8位图立即数,寄存器,寄存器移位) 除了比较指令以外的指令只有加S才影响CPSR,如果不加S执行完指令,CPSR不变1.目标寄存器是PCMOVS PC, R0导致CPSR=SPSR2.目标寄存器不是PC根据运算结果,影响CPSR的NZCV加载存储指令单寄存器:把<地址模式>表示内存单元的内容加载到Rd源:<地址模式>目标:RdLDR{cond} Rd, <地址模式>LDR{cond}B Rd, <地址模式>LDR{cond}H Rd, <地址模式>LDR{cond}SH Rd, <地址模式>LDR{cond}SB Rd, <地址模式>把<地址模式>表示内存单元的内容加载到Rd源:Rd目标:<地址模式>表示的内存地址STR{cond} Rd, <地址模式>STR{cond}B Rd, <地址模式>STR{cond}H Rd, <地址模式>STR{cond}SH Rd, <地址模式>STR{cond}SB Rd, <地址模式>地址模式:零偏移寄存器基址寄存器+偏移量(立即数,寄存器,寄存器移位)多寄存器LDM{cond}{地址模式} Rb{!} , <寄存器列表> 源:Rb寄存器所指内存地址目标:寄存器列表STM{cond}{地址模式} Rb{!} , <寄存器列表> 源:寄存器列表目标:Rb寄存器所指的内存地址IA(Increment After)(先操作,后增加地址)DA(Decremetn After)(先操作,后递减地址)IB(Increment Before)(先增加地址,后操作)DB(Decrement Before)(先递减地址,后操作)R0=0x20008000[0x20008000]=1[0x20008004]=2[0x20008008]=3[0x2000800C]=4[0x20008010]=5LDMIA R0! , {R1,R2,R3,R4}把R0所指内存单元的值加载到R1,R2,R3,R4R1=1R2=2R3=3R4=4R0=0x2008000+16 = 0x20008010LDMIB R0! , {R1,R2,R3,R4} 或者{R1-R4} R0=0x20008000[0x20008000]=1[0x20008004]=2[0x20008008]=3[0x2000800C]=4[0x20008010]=5R1=2R2=3R3=4R4=5R0=0x20008010带^号的指令只能在非用户模式下使用1.寄存器列表中不含PC的话,则用户寄存器可以通过指令保存和恢复,通常用于操作系统保存和恢复用户处理状态。
嵌入式课件代码嵌入式课件代码完美版

通用计算机嵌入式计算机以应用为中心以计算机技术为基础软硬件可裁剪适用应用系统对功能,可靠性,成本,体积及功耗有严格要求的专用计算机系统。
学完嵌入式课程,可以做什么?做嵌入式产品(进入一个具体行业)应用级开发系统开发(移植操作系统(移植硬件驱动))怎么做?TPAD核心板CPU:S5pv210 1G(核心:ARM架构 cortex-A8)ARM7 ARM9 ARM10 ARM11Cortex-ACortex-MCortex-R外设控制器DDRII:外接内存8颗 1G TPAD有1G内存Nand Flash: 闪存底板拨码开关(四个)决定CPU从什么设备上获得启动程序。
(从哪里启动)Nand Flash(发布)SD卡(发布)Usb(开发)Uart(开发)开发模式:主机PC ---- 目标板(TPAD)Usb(发送,接收)网络(发送,接收)Uart(发送,接收)JTAG口(发送)为TPAD搭建一个运行环境其实向Nand Flash烧写一个程序引导程序(Bootloader)u-boot.bin启动程序板子上电,执行的s5pv210内部iROM中固化那段代码准备工作:1.把TPAD连接线接好b线(一头PC,一头接TPAD OTG USB口)2.电源线3.网线(一头PC,一头接TPAD的网口)4.uart(一头PC,一头接TPAD com1)5.设置拨码开关(USB启动)1->ON2->OFF3->OFF4->ON向Nand Flash烧写引导程序(Bootloader)u-boot.bin烧写在Nand Flash的0地址此程序能够为运行裸板程序创建运行环境PC-TPADUsbPC :DNW (发送程序[发件人])TPAD:iROM(接收程序[收件人])Usb和串口都能用了参看文档:S5PV210_iROM_ApplicationNote_Preliminary_20091126.pdf0. 开启TPAD电源1.在PC机运行DNW软件 tools目录2.配置DNW软件配置串口的波特率:115200配置使用的串口号:COM1如果使用笔记本(无物理串口,一根USB转串口的(一头是USB,一头是9针串口,针),安装驱动,在设备管理处虚拟出一个com口,如果com2或者com3或者com4,就直接选中即可,如果不是,重新改一下com即可)3.串口配置完成,选择串口菜单Connect,dnw标题有变化,Com1,115200bps,说明串口就能收发数据4.PC机发现USB的新硬件,会要求安装驱动第一界面选择“从列表”第二界面选择“在搜索中”点击“浏览”按钮day01/ x210 usb Driver如果在设备管理器的通用串行总线控制器中出现“x210”,就说明驱动安装成功如果不出安装驱动界面,长按拨码开关旁边的白色按键1秒。
ARM嵌入式系统设计 代码

信息学院《嵌入式系统设计》报告报告题目:基于ARM9的综合设计班级: xxxx姓名: xxxxxxx学号: xxxxxxxx成绩:教师: xxxxxx 时间: xxx 年 11 月 18 日一.设计题目:基于ARM9开发版的综合设计1、设计内容:首先当打开程序时,跑马灯由左至右再返回跑动。
接着:当按动XINT0时LCD显示屏显示li,当按动XINT1时LCD显示屏显示shan, 当按动XINT2时LCD显示屏显示chen, 当按动XINT3时LCD显示屏显示wei.最后再按按键时,分别对应右边的四个灯。
硬件:ARM 9开发板软件:Code Warrior 、CIC-9002、程序代码:#include "gpiopp.h"#include "api.h"#include "system.h"static void New_Delay(int time){for(;time>0;time--){;}}void C_Entry(void){char temp=0x80,i=0,flag=0;for(i=0;i<14;i++){debugLED(temp);New_Delay(400);if(flag==0)debugLED(temp);New_Delay(400);if(temp==0x01)flag=1;if(temp==0x80)flag=0;}lcdInit();lcdClear();for(;;){if(buttonRead()==0x01){lcdGoto(1,2);lcdPrint("li");}if(buttonRead()==0x02){lcdGoto(1,5);lcdPrint("shan");}if(buttonRead()==0x04){lcdGoto(1,10);lcdPrint("chen");}if(buttonRead()==0x08){lcdGoto(1,15);lcdPrint("wei");break;}}for(;;){temp=buttonRead();i=(char)temp;debugLED(i);}}实验展示:显示屏按键控制LED灯实训心得:我们这次实训做的是利用ARM9和Code Warrior 、CIC-900环境来使得LED灯循环闪烁,按键可控LED灯且通过与LCD屏融为一体,在实验过程中我们也遇到了一些困难,比如说最开始的时候并不是用temp=temp>>1; else temp=temp<<1;这种语句,而是直接是一个灯一个灯的显示,这样不仅很费力。
东北大学嵌入式课程设计电子密码锁程序(W90P710)

#include <stdio.h>#include "710defs.h"#include "usi.h"#include "kpi.h"#include "led.h"#include "lcd.h"#include "main.h"#include "HB_it.h"#include "lcd_pattern.h"extern unsigned char BlackBoard[];int main(void){LCD_IMAGE_T LCD_Size;LCD_LOCATION_T LCD_Location;LCDShowParameter LSP,LSP0,LSP1,LSP2,LSP3,LSP4,LSP5,LSP6,LSP7,LSP8;U32 keyflg=REG_KPISTA TUS & 0x00200000;U32 np=0,ti=0,i;U8 setflg=0,reflg=0;U32 keyValue=0x0,addr;U8 pswSign[2],psw[6],psw2[6];U8 ast[]="********************";U8 prmpt1[]= "请设定密码:";U8 prmpt2[]= "请重输确认:";U8 prmpt3[]= "两次密码不符!请重新输入:";U8 prmpt4[]= "密码设定成功!";U8 prmpt5[]= "请输入密码:";U8 prmpt6[]= "密码错误!请重新输入:";U8 prmpt7[]= "密码正确!";U8 prmpt8[]= "对不起,您已经连续三次输入密码错误,系统锁定!";LCD_Size.width = 480;LCD_Size.height = 240;LCD_Location.StartX = 0;LCD_Location.StartY = 0;LCD_Location.EndX = 960;LCD_Location.EndY = 240;LSP.StartX = 12;LSP.StartY = 4;LSP.LibPlace = 0x400000; LSP.Color = 0x0;LSP.LetterChar = ast;LSP.LCDBuffer = BlackBoard;LSP0.StartX = 12;LSP0.StartY = 4;LSP0.LibPlace = 0x400000; LSP0.Color = 0x07ff;LSP0.LetterChar = ast;LSP0.LCDBuffer = BlackBoard;LSP1.StartX = 5;LSP1.StartY = 4;LSP1.LibPlace = 0x400000; LSP1.Color = 0x07ff;LSP1.LetterChar = prmpt1; LSP1.LCDBuffer = BlackBoard;LSP2.StartX = 5;LSP2.StartY = 6;LSP2.LibPlace = 0x400000; LSP2.Color = 0x07ff;LSP2.LetterChar = prmpt2; LSP2.LCDBuffer = BlackBoard;LSP3.StartX = 8;LSP3.StartY = 8;LSP3.LibPlace = 0x400000; LSP3.Color = 0x07ff;LSP3.LetterChar = prmpt3; LSP3.LCDBuffer = BlackBoard;LSP4.StartX = 8;LSP4.StartY = 8;LSP4.LibPlace = 0x400000; LSP4.Color = 0x07ff;LSP4.LetterChar = prmpt4; LSP4.LCDBuffer = BlackBoard;LSP5.StartX = 5;LSP5.StartY = 4;LSP5.LibPlace = 0x400000; LSP5.Color = 0x07ff;LSP5.LetterChar = prmpt5;LSP5.LCDBuffer = BlackBoard;LSP6.StartX = 8;LSP6.StartY = 8;LSP6.LibPlace = 0x400000;LSP6.Color = 0x07ff;LSP6.LetterChar = prmpt6;LSP6.LCDBuffer = BlackBoard;LSP7.StartX = 8;LSP7.StartY = 8;LSP7.LibPlace = 0x400000;LSP7.Color = 0x07ff;LSP7.LetterChar = prmpt7;LSP7.LCDBuffer = BlackBoard;LSP8.StartX = 4;LSP8.StartY = 8;LSP8.LibPlace = 0x400000;LSP8.Color = 0x07ff;LSP8.LetterChar = prmpt8;LSP8.LCDBuffer = BlackBoard;/******************************************************************/ USIInit();USIRead(0x0,pswSign);if(pswSign[0]==0x20 && pswSign[1]==0x07){setflg=1;}LCDInit();LCDShow(LCD_Size, LCD_Location);LCDFIFOBufferSet(BlackBoard);LCDDisplayOn();KPIInit();EBILedSet(0x00);while(!setflg){LCDOutputShow(LSP1,6);if(keyflg!=0){keyflg=0;np++;if(np==6){if(reflg){for(i=0;i<6;i++){if(psw[i]!=psw2[i])break;}if(i<6){LCDOutputShow(LSP3,13);np=0;reflg=0;LSP0.StartX = 12;LSP0.StartY = 4;LCDOutputShow(LSP,6);LSP.StartY = 6;LCDOutputShow(LSP,6);LSP.StartY = 8;LCDOutputShow(LSP,6);}else{LSP.StartX = 5;LSP.StartY = 4;LCDOutputShow(LSP,14);LSP.StartX = 5;LSP.StartY = 6;LCDOutputShow(LSP,14);LSP.StartX = 8;LSP.StartY = 8;LCDOutputShow(LSP,14);LCDOutputShow(LSP4,7);Delay(1000000);USIWriteEnable();while(USICheckBusy());USISectorErease(0x10);USIWriteEnable();while(USICheckBusy());USIWrite(0x0,pswSign);EBILedSet(0x0F);Delay(100000);pswSign[0]=0x20;pswSign[1]=0x07;USIWriteEnable();USIWrite(0x2,pswSign);EBILedSet(0xF0);Delay(100000);setflg=1;}}else /* reflg!=1 */{LCDOutputShow(LSP2,6);np=0;reflg=1;LSP0.StartX=4;}}else /* np!=6 */{if(reflg){psw2[np]=keyValue;LCDOutputShow(LSP0,1);LSP0.StartX ++;}else{psw[np]=keyValue;LCDOutputShow(LSP0,1);LSP0.StartX ++;}}}}USIRead(0x10,psw2);LCDOutputShow(LSP,14);Delay(10000000);LCDOutputShow(LSP5,6);np=0;LSP0.StartX=4;while(setflg){if(keyflg!=0){keyflg=0;psw[np]=keyValue;LCDOutputShow(LSP0,1);LSP0.StartX ++;np++;if(np==6){for(i=0;i<6;i++){if(psw[i]!=psw2[i])break;}if(i<6){ti++;LCDOutputShow(LSP6,11);Delay(1000000);np=0;LCDOutputShow(LSP5,6);if(ti==3){LCDOutputShow(LSP8,23);for(i=0;i<5;i++){EBILedSet(0x81);Delay(100000);EBILedSet(0x18);Delay(100000);}}}else{LSP.StartX = 8;LSP.StartY = 2;LCDOutputShow(LSP7,5);for(i=0;i<5;i++){EBILedSet(00000001);Delay(100000);EBILedSet(00000010);Delay(100000);EBILedSet(00000100);Delay(100000);EBILedSet(00001000);Delay(100000);EBILedSet(00010000);Delay(100000);EBILedSet(00100000);Delay(100000);EBILedSet(01000000);Delay(100000);EBILedSet(10000000);Delay(100000);}}}}}while(1)return 0;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*** write by Arnold** Time 2011.1.11*/#include <stdlib.h>#include <stdio.h>#include <termio.h>#include <fcntl.h>#include <sys/ioctl.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <termios.h>#include <error.h>#include <string.h>#include <pthread.h>#include <minigui/common.h>#include <minigui/minigui.h>#include <minigui/gdi.h>#include <minigui/window.h>#include <minigui/control.h>#define IDC_BUTTON_SEND 101 //发射按键#define IDC_BUTTON_OPEN 102#define IDC_BUTTON_CLOSE 103#define IDC_RECIEVE_CHARS 104#define IDC_SEND_CHARS 105#define IDC_BUTTON_0 106#define IDC_BUTTON_1 107#define IDC_BUTTON_2 108#define IDC_BUTTON_3 109#define IDC_BUTTON_4 110#define IDC_BUTTON_5 111#define IDC_BUTTON_6 112#define IDC_BUTTON_7 113#define IDC_BUTTON_8 114#define IDC_BUTTON_9 115#define IDC_PROMPT_BAUDRATE 200#define IDC_PROMPT_PORT 201#define IDC_PROMPT_DA TABIT 202#define IDC_PROMPT_STOPBIT 203#define IDC_PROMPT_PARITYBIT 204#define IDC_PROMPT_MESSAGE 205#define IDC_BOX_BAUDRATE 206#define IDC_BOX_PORT 207#define IDC_BOX_DA TABIT 208#define IDC_BOX_STOPBIT 209#define IDC_BOX_PARITYBIT 210int fd;HWND hwnd;/********************对话框定义****************************************/static DLGTEMPLATE DlgMyCom ={WS_BORDER | WS_CAPTION,WS_EX_NONE,0, 0, 800, 480,"MyCom",0, 0,28, NULL,};/*****************定义各类控件**************************************/static CTRLDATA CtrlMyTaste[] ={/*****************定义端口选择的复选框***************************************/ {"static",WS_VISIBLE | SS_LEFT | WS_GROUP,16, 60, 100, 80,IDC_PROMPT_PORT,"串口选择",},{"combobox",WS_VISIBLE | CBS_DROPDOWNLIST | CBS_NOTIFY,100, 60, 100, 30,IDC_BOX_PORT,"串口0",60/*****************定义波特率设置的复选框***************************************/{"static",WS_VISIBLE | SS_LEFT | WS_GROUP,16, 90, 100, 110,IDC_PROMPT_BAUDRATE,"波特率设置",},{"combobox",WS_VISIBLE | CBS_DROPDOWNLIST | CBS_NOTIFY,100, 90, 100, 30,IDC_BOX_BAUDRATE,"115200",60},/**************定义数据位的复选框********************************/ {"static",WS_VISIBLE | SS_LEFT | WS_GROUP,16, 120, 100, 30,IDC_PROMPT_DATABIT,"数据位",},{"combobox",WS_VISIBLE | CBS_DROPDOWNLIST | CBS_NOTIFY,100, 120, 100, 30,IDC_BOX_DATABIT,"8",60},/**************定义停止位的复选框********************************/ {"static",WS_VISIBLE | SS_LEFT | WS_GROUP,16, 150, 100, 30,IDC_PROMPT_STOPBIT,"停止位",{"combobox",WS_VISIBLE | CBS_DROPDOWNLIST | CBS_NOTIFY,100, 150, 100, 30,IDC_BOX_STOPBIT,"1",40},/**************定义奇偶校验位的复选框********************************/ {"static",WS_VISIBLE | SS_LEFT | WS_GROUP,16, 180, 100, 30,IDC_PROMPT_PARITYBIT,"奇偶校验位",},{"combobox",WS_VISIBLE | CBS_DROPDOWNLIST | CBS_NOTIFY,100, 180, 100, 30,IDC_BOX_PARITYBIT,"N",60},/**************************定义打开、关闭串口按钮*****************************/ {"button",WS_VISIBLE | BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP,16, 210, 80, 30,IDC_BUTTON_OPEN,"打开串口",},{"button",WS_VISIBLE | BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP,120, 210, 80, 30,IDC_BUTTON_CLOSE,"关闭串口",},/***********************定义信息显示模块**********2***********************/"static",WS_VISIBLE | SS_LEFT | WS_GROUP,16, 30, 150, 20,IDC_PROMPT_MESSAGE,"等待.....................",},/**************************定义发送接收按钮*****************************/ {"button",WS_VISIBLE | BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP,146, 270, 50, 30,IDC_BUTTON_SEND,"发送",},/***********************定义数据显示模块***********************************/ {"static",WS_VISIBLE,280, 30, 200, 370,IDC_STATIC,"接收数据",},{CTRL_MLEDIT,WS_VISIBLE | WS_BORDER | WS_VSCROLL | ES_BASELINE | ES_AUTOWRAP,280, 50, 180,350,IDC_RECIEVE_CHARS,"",},{"static",WS_VISIBLE,16, 280, 200, 120,IDC_STATIC,"发送数据",},{CTRL_MLEDIT,WS_VISIBLE | WS_BORDER | WS_VSCROLL | ES_BASELINE | ES_AUTOWRAP,16, 300, 180,100,IDC_SEND_CHARS,"",},/***********************定义键盘***********************************/ {"button",WS_VISIBLE | BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP,530, 280, 30, 30,IDC_BUTTON_0,"0",},{"button",WS_VISIBLE | BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP,500, 310, 30, 30,IDC_BUTTON_1,"1",},{"button",WS_VISIBLE | BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP,530, 310, 30, 30,IDC_BUTTON_2,"2",},{"button",WS_VISIBLE | BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP,560, 310, 30, 30,IDC_BUTTON_3,"3",},{"button",WS_VISIBLE | BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP,500, 340, 30, 30,IDC_BUTTON_4,"4",},{"button",WS_VISIBLE | BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP,530, 340, 30, 30,IDC_BUTTON_5,"5",},{"button",WS_VISIBLE | BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP,560, 340, 30, 30,IDC_BUTTON_6,"6",},{"button",WS_VISIBLE | BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP,500, 370, 30, 30,IDC_BUTTON_7,"7",},{"button",WS_VISIBLE | BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP,530, 370, 30, 30,IDC_BUTTON_8,"8",},{"button",WS_VISIBLE | BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP,560, 370, 30, 30,IDC_BUTTON_9,"9",},};/*****************打开设备**************************************/int OpenDevice(char *Dev){int fd = open( Dev, O_RDWR ); //打开你选择的端口if (-1 == fd){perror("Can't Open Serial Port"); //设备打开失败return -1;}else{printf("Open Serial Port:%s\n",Dev);return fd;}}/*****************设置波特率**************************************/int set_speed(int fd, int speed){int i;int status;int speed_arr[] = {B115200, B57600, B38400, B19200, B9600, B4800, B2400, B300};int name_arr[] = {115200, 57600, 38400, 19200, 9600, 4800, 2400, 300};struct termios options;bzero(&options, sizeof(options));tcgetattr(fd,&options); // 得到当前串口的参数for (i = 0; i < sizeof(speed_arr)/sizeof(int); i++){if (speed == name_arr[i]){tcflush(fd, TCIOFLUSH);cfsetispeed(&options, speed_arr[i]); //设置输入波特率cfsetospeed(&options, speed_arr[i]); //设置输出波特率status = tcsetattr(fd, TCSANOW, &options);//printf("status=%d\n",status);if (status != 0){perror("tcsetattr fd");return(-1);}}options.c_cflag |= (CLOCAL | CREAD); // 使能接收并使能本地状态tcflush(fd, TCIOFLUSH);}return 0;}/*****************设置奇偶检验**************************************/int set_Parity(int fd, char databits, char stopbits, char parity){struct termios options;if(tcgetattr(fd,&options)!=0){perror("Setup Serial Port");return -1;}options.c_cflag &= ~CSIZE;//--------------------------这里要设置数据位------------------------------------------------------ switch (databits){case '7':options.c_cflag |= CS7;break;case '8':options.c_cflag |= CS8;break;default:fprintf(stderr,"Unsupported data size\n");return -1;}//--------------------------这里要设置停止位------------------------------------------------------ switch (stopbits){case '1':options.c_cflag &= ~CSTOPB;break;case '2':options.c_cflag |= CSTOPB;break;default:fprintf(stderr,"Unsupported stop bits\n");return -1;}//--------------------------这里要设置奇偶检验位------------------------------------------------------ switch (parity){case 'n':case 'N': /* no parity*/options.c_cflag &= ~PARENB; // Clear parity enableoptions.c_iflag &= ~INPCK; // Disnable input parity checkingbreak;case 'o':case 'O':options.c_cflag |= (PARODD | PARENB); // ......options.c_iflag |= INPCK; // Enable input parity checkingbreak;case 'e':case 'E':options.c_cflag |= PARENB; // Enable parityoptions.c_cflag &= ~PARODD; // ......options.c_iflag |= INPCK; // Enable input parity checkingbreak;case 'S':case 's': /*as no parity*/options.c_cflag &= ~PARENB;options.c_cflag &= ~CSTOPB;break;default:fprintf(stderr,"Unsupported parity\n");return -1;}if (parity != 'n')options.c_iflag |= INPCK;options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // 原始数据输入,非正规模式options.c_oflag &= ~(OPOST);/*************************设置等待时间和最小接收字符********************************/options.c_cc[VTIME] = 100; // 20 secondsoptions.c_cc[VMIN] = 0;tcflush(fd,TCIFLUSH); // 处理未接收的字符tcsetattr(fd,TCSANOW,&options); // 激活新配置if(tcsetattr(fd,TCSANOW,&options)!=0){perror("Setup Serial Port");return -1;}//printf("初始化..........\n");return 0;}/*读串口线程*/void ReadThread(void* arg){int nread;char readdata[1024];char str[1024];while(1){sleep(1);//printf("\nnow it begain to read words.\n");memset(&readdata,0,1024);nread = read(fd,readdata,1024);if(nread==-1){printf("Read Serial Port Failed\n");}//printf("readdata:%s\n",str);GetWindowText (GetDlgItem (GetParent (hwnd), IDC_RECIEVE_CHARS),str,strlen(str));memcpy(&str[strlen(str)],&readdata,strlen(readdata));//printf("readdata:%s\n",str);SetWindowText (GetDlgItem (GetParent (hwnd), IDC_RECIEVE_CHARS),str);//SetWindowText (GetDlgItem (GetParent (hwnd), IDC_RECIEVE_CHARS),readdata);}}/*键盘处理程序*/void ButtonDown(int id){char button_data;int length;char str[1024];button_data=id-58;GetWindowText (GetDlgItem (GetParent (hwnd), IDC_SEND_CHARS),str,strlen(str));length=strlen(str);str[length]=button_data;str[length+1]='\0';SetWindowText (GetDlgItem (GetParent (hwnd), IDC_SEND_CHARS),str);}/*用于定义动态显示,其中id为各个控件的id号,nc为控件的状态如:按下,选中等,控件id要与对应显示位置对应*/static void my_notif_proc (HWND hwnd1, int id, int nc, DWORD add_data){struct termios oldtio, newtio;char READ_BAUDRA TE[8];char speed[8][8]={"115200","57600", "38400", "19200", "9600", "4800", "2400", "300"};int name_arr[8] = {115200, 57600, 38400, 19200, 9600, 4800, 2400, 300};char READ_PORT[8];char PORT[2][8]={"串口0","串口1"};char dev[2][12]={"/dev/tq2440_serial0","/dev/tq2440_serial1"};char READ_DATABIT[8];char DATABIT[2][8]={"8","7"};char DATALEN[2]={8,7};char databits;char READ_STOPBIT[8];char STOPBIT[2][8]={"1","2"};char STOPLEN[2]={1,2};char stopbits;char READ_PARITY[8];char PARITYBIT[4][8]={"None","Odd","Even","Space"};char PARITYSTYLE[4]={'N','O','E','S'};char parity;int i,j,nwrite;char str[1024];pthread_t thread_id;hwnd=hwnd1;switch (id){case IDC_BUTTON_OPEN:/*选择端口*/GetWindowText (GetDlgItem (GetParent (hwnd1), IDC_BOX_PORT),READ_PORT,sizeof(READ_PORT));for(i = 0; i < 2; i++)for(j =0; PORT[i][j]==READ_PORT[j] && j<6;j++){if(j == 5){//fd = OpenDevice(dev[i]);fd = OpenDevice("/dev/tq2440_serial0");}}/*设置波特率*/GetWindowText (GetDlgItem (GetParent (hwnd1), IDC_BOX_BAUDRA TE),READ_BAUDRATE,sizeof(READ_BAUDRATE));for(i = 0; i < 8; i++)for(j =0; speed[i][j]==READ_BAUDRA TE[j] && j<8;j++){if(j==2){set_speed(fd,name_arr[i]);//printf("BAUDRATE=%s\n",READ_BAUDRATE);}}/*设置数据位、停止位、奇偶检验*/GetWindowText (GetDlgItem (GetParent (hwnd1), IDC_PROMPT_DATABIT),READ_DA TABIT,sizeof(READ_DATABIT));for(i = 0; i < 8; i++)for(j =0; DATABIT[i][j]==READ_DATABIT[j] && j<8;j++){if(j==1){databits=DATALEN[i];//printf("DATABIT=%c\n",databits);}}GetWindowText (GetDlgItem (GetParent (hwnd1), IDC_PROMPT_STOPBIT),READ_STOPBIT,sizeof(READ_STOPBIT));for(i = 0; i < 8; i++)for(j =0; STOPBIT[i][j]==READ_STOPBIT[j] && j<8;j++){if(j==1){stopbits=STOPLEN[i];//printf("STOPBIT=%c\n",stopbits);}}GetWindowText (GetDlgItem (GetParent (hwnd1), IDC_PROMPT_PARITYBIT),READ_PARITY,sizeof(READ_PARITY));for(i = 0; i < 8; i++)for(j =0; PARITYBIT[i][j]==READ_PARITY[j] && j<8;j++){if(j==2){parity=PARITYSTYLE[i];//printf("PARITYBIT=%c\n",parity);}}set_Parity(fd, databits, stopbits, parity);if(pthread_create(&thread_id, NULL, (void*)ReadThread, NULL) !=0)//创建读串口线程printf("ReadThread_create is failed!\n");//pthread_join(thread_id, NULL);break;case IDC_BUTTON_CLOSE:close(fd);printf("Close Serial Port\n");break;case IDC_BUTTON_SEND:GetWindowText (GetDlgItem (GetParent (hwnd1), IDC_SEND_CHARS),str,1024);//printf("%s\n",str);nwrite=write(fd, str, strlen(str));if(nwrite==-1){printf("Write Serial Port Failed\n");close(fd);}else ;//printf("String length=%d ,Writed length=%d\n",strlen(str),nwrite);break;case IDC_BUTTON_0:ButtonDown(IDC_BUTTON_0);break;case IDC_BUTTON_1:ButtonDown(IDC_BUTTON_1);break;case IDC_BUTTON_2:ButtonDown(IDC_BUTTON_2);break;case IDC_BUTTON_3:ButtonDown(IDC_BUTTON_3);break;case IDC_BUTTON_4:ButtonDown(IDC_BUTTON_4);break;case IDC_BUTTON_5:ButtonDown(IDC_BUTTON_5);break;case IDC_BUTTON_6:ButtonDown(IDC_BUTTON_6);break;case IDC_BUTTON_7:ButtonDown(IDC_BUTTON_7);break;case IDC_BUTTON_8:ButtonDown(IDC_BUTTON_8);break;case IDC_BUTTON_9:ButtonDown(IDC_BUTTON_9);break;default: break;}}//----------------------对话框回调函数-----------------------------------------------static int DialogBoxProc2 (HWND hDlg, int message, WPARAM wParam, LPARAM lParam) {int i;switch (message) {case MSG_INITDIALOG:printf("init dialog\n");{for (i = IDC_BUTTON_SEND; i <= IDC_BUTTON_9; i++)SetNotificationCallback (GetDlgItem (hDlg, i), my_notif_proc);}/*端口选择*/SendDlgItemMessage(hDlg, IDC_BOX_PORT, CB_ADDSTRING, 0, (LPARAM)"串口0");SendDlgItemMessage(hDlg, IDC_BOX_PORT, CB_ADDSTRING, 0, (LPARAM)"串口1");/*波特率设置*/SendDlgItemMessage(hDlg, IDC_BOX_BAUDRATE, CB_ADDSTRING, 0, (LPARAM) "115200");SendDlgItemMessage(hDlg, IDC_BOX_BAUDRATE, CB_ADDSTRING, 0, (LPARAM) "57600");SendDlgItemMessage(hDlg, IDC_BOX_BAUDRATE, CB_ADDSTRING, 0, (LPARAM) "38400");SendDlgItemMessage(hDlg, IDC_BOX_BAUDRATE, CB_ADDSTRING, 0, (LPARAM) "19200");SendDlgItemMessage(hDlg, IDC_BOX_BAUDRATE, CB_ADDSTRING, 0, (LPARAM) "9600");SendDlgItemMessage(hDlg, IDC_BOX_BAUDRATE, CB_ADDSTRING, 0, (LPARAM) "4800");SendDlgItemMessage(hDlg, IDC_BOX_BAUDRATE, CB_ADDSTRING, 0, (LPARAM) "2400");SendDlgItemMessage(hDlg, IDC_BOX_BAUDRATE, CB_ADDSTRING, 0, (LPARAM) "300");/*奇偶校验位*/SendDlgItemMessage(hDlg, IDC_BOX_PARITYBIT, CB_ADDSTRING, 0, (LPARAM)"None");SendDlgItemMessage(hDlg, IDC_BOX_PARITYBIT, CB_ADDSTRING, 0, (LPARAM)"Odd");SendDlgItemMessage(hDlg, IDC_BOX_PARITYBIT, CB_ADDSTRING, 0, (LPARAM)"Even");SendDlgItemMessage(hDlg, IDC_BOX_PARITYBIT, CB_ADDSTRING, 0, (LPARAM)"Space");/* 加入数据位*/SendDlgItemMessage(hDlg, IDC_BOX_DATABIT, CB_ADDSTRING, 0, (LPARAM)"8");SendDlgItemMessage(hDlg, IDC_BOX_DATABIT, CB_ADDSTRING, 0, (LPARAM)"7");/* 加入停止位*/SendDlgItemMessage(hDlg, IDC_BOX_STOPBIT, CB_ADDSTRING, 0,(LPARAM)"0");SendDlgItemMessage(hDlg, IDC_BOX_STOPBIT, CB_ADDSTRING, 0,(LPARAM) "1");return 1;case MSG_COMMAND:switch (wParam) {case IDOK:break;case IDCANCEL: //窗口关闭消息时,销毁对话框,控件EndDialog (hDlg, wParam); //退出对话框break;}break;};return DefaultDialogProc (hDlg, message, wParam, lParam);//对话框缺省消息返回。